@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
@@ -2,6 +2,7 @@ package helper
2
2
 
3
3
  import (
4
4
  "context"
5
+ "encoding/json"
5
6
  "errors"
6
7
  "net"
7
8
  "os"
@@ -25,18 +26,43 @@ func linuxFixture(t *testing.T) LinuxProcesses {
25
26
  if os.Geteuid() != 0 {
26
27
  t.Fatal("VM fixture requires root")
27
28
  }
29
+ traces, _ := filepath.Glob("/tmp/m1h-trace-*")
30
+ for _, path := range traces {
31
+ if err := os.Remove(path); err != nil {
32
+ t.Fatal(err)
33
+ }
34
+ }
35
+ if t.Name() == "TestLinuxHelperSelfExitIsReapedWithoutSignallingReusedPID" {
36
+ source = "/helper-self-exit"
37
+ }
38
+ if t.Name() == "TestLinuxControllerWaitsForRealCompletionPublisher" {
39
+ source = "/helper-held-completion"
40
+ }
28
41
  digest, err := executableDigest(source)
29
42
  if err != nil {
30
43
  t.Fatal(err)
31
44
  }
32
45
  i := Inventory{Package: "root", Version: "1.0.0-0001", Protocol: 1, PayloadDigest: digest, RegistryDigest: strings.Repeat("b", 64)}
33
46
  c := NewClient(i)
47
+
34
48
  for _, dir := range []string{c.StateDir, c.RunDir} {
35
49
  if err := os.Mkdir(dir, 0700); err != nil {
36
50
  t.Fatal(err)
37
51
  }
38
52
  t.Cleanup(func() { os.RemoveAll(dir) })
39
53
  }
54
+ t.Cleanup(func() {
55
+ r, e := readRecord(c.StateDir, 0)
56
+ b, _ := json.Marshal(r)
57
+ t.Logf("VM final lifecycle=%s readError=%v failed=%t", b, e, t.Failed())
58
+ if t.Failed() {
59
+ traces, _ := filepath.Glob("/tmp/m1h-trace-*")
60
+ for _, path := range traces {
61
+ b, _ := os.ReadFile(path)
62
+ t.Logf("VM trace %s: %s", path, b)
63
+ }
64
+ }
65
+ })
40
66
  exe := filepath.Join(c.StateDir, "payload-"+digest)
41
67
  b, err := os.ReadFile(source)
42
68
  if err != nil {
@@ -45,11 +71,26 @@ func linuxFixture(t *testing.T) LinuxProcesses {
45
71
  if err := os.WriteFile(exe, b, 0700); err != nil {
46
72
  t.Fatal(err)
47
73
  }
74
+ vmUnit(t, "start")
48
75
  return LinuxProcesses{Client: c, Binary: exe}
49
76
  }
50
77
  func startVMHelper(t *testing.T, p LinuxProcesses) Process {
51
78
  t.Helper()
52
- ctl := Controller{Client: p.Client, Processes: p}
79
+ ctl := Controller{Client: p.Client, Processes: p, Observe: observeLinux}
80
+ t.Cleanup(func() {
81
+ r, e := readRecord(p.StateDir, 0)
82
+ b, _ := json.Marshal(r)
83
+ t.Logf("VM pre-cleanup lifecycle=%s readError=%v failed=%t", b, e, t.Failed())
84
+ err := ctl.Control(context.Background(), "disable")
85
+ t.Logf("VM cleanup disable=%v", err)
86
+ if t.Failed() {
87
+ traces, _ := filepath.Glob("/tmp/m1h-trace-*")
88
+ for _, path := range traces {
89
+ b, _ := os.ReadFile(path)
90
+ t.Logf("VM trace %s: %s", path, b)
91
+ }
92
+ }
93
+ })
53
94
  if err := ctl.Control(context.Background(), "enable"); err != nil {
54
95
  t.Fatal(err)
55
96
  }
@@ -57,7 +98,6 @@ func startVMHelper(t *testing.T, p LinuxProcesses) Process {
57
98
  if err != nil {
58
99
  t.Fatal(err)
59
100
  }
60
- t.Cleanup(func() { ctl.Control(context.Background(), "disable") })
61
101
  return record
62
102
  }
63
103
  func supervisedPID(t *testing.T, pid int) int {
@@ -105,7 +145,7 @@ func TestLinuxActivationAlwaysUsesSupervisorAndNormalStop(t *testing.T) {
105
145
  if p.Status(context.Background()).State != "ready" {
106
146
  t.Fatal("missing live handshake")
107
147
  }
108
- if err := (Controller{Client: p.Client, Processes: p}).Control(context.Background(), "disable"); err != nil {
148
+ if err := (Controller{Client: p.Client, Processes: p, Observe: observeLinux}).Control(context.Background(), "disable"); err != nil {
109
149
  t.Fatal(err)
110
150
  }
111
151
  waitPIDExit(t, child)
@@ -142,7 +182,7 @@ func TestLinuxHelperSelfExitIsReapedWithoutSignallingReusedPID(t *testing.T) {
142
182
  }
143
183
  func TestLinuxSupervisorDeathKillsHelperAndPreservesFailedCleanup(t *testing.T) {
144
184
  p := linuxFixture(t)
145
- record(t, p.Client, Record{Inventory: p.Expected, Enabled: true})
185
+ record(t, p.Client, Record{Inventory: p.Expected, Enabled: true, Lifecycle: vmLifecycle(t, p)})
146
186
  // Keep the supervisor as our own unreaped child; only its parent signals it.
147
187
  cmd := exec.Command(p.Binary, "supervise")
148
188
  if err := cmd.Start(); err != nil {
@@ -166,7 +206,7 @@ func TestLinuxSupervisorDeathKillsHelperAndPreservesFailedCleanup(t *testing.T)
166
206
  }
167
207
  waitPIDExit(t, child)
168
208
  waitPIDExit(t, proc.PID)
169
- ctl := Controller{Client: p.Client, Processes: p}
209
+ ctl := Controller{Client: p.Client, Processes: p, Observe: observeLinux}
170
210
  if ctl.Control(context.Background(), "teardown") == nil {
171
211
  t.Fatal("lost supervisor falsely cleaned")
172
212
  }
@@ -197,7 +237,7 @@ func TestLinuxUnsupervisedRecordAndDirectServeRefuse(t *testing.T) {
197
237
  }
198
238
  // Remove stopped sockets before testing the retired action, so a bind
199
239
  // conflict cannot masquerade as refusal of unsupervised startup.
200
- if err := (Controller{Client: p.Client, Processes: p}).Control(context.Background(), "teardown"); err != nil {
240
+ if err := (Controller{Client: p.Client, Processes: p, Observe: observeLinux}).Control(context.Background(), "teardown"); err != nil {
201
241
  t.Fatal(err)
202
242
  }
203
243
  ctx, cancel := context.WithTimeout(context.Background(), time.Second)
@@ -290,7 +330,7 @@ func TestLinuxSupervisorIdentityConflictsAndSocketSubstitutionRefuse(t *testing.
290
330
  }
291
331
  func TestLinuxReparentedChildRefusesBeforeSocket(t *testing.T) {
292
332
  p := linuxFixture(t)
293
- record(t, p.Client, Record{Inventory: p.Expected, Enabled: true})
333
+ record(t, p.Client, Record{Inventory: p.Expected, Enabled: true, Lifecycle: vmLifecycle(t, p)})
294
334
  cmd := exec.Command(p.Binary, "serve-child")
295
335
  cmd.Env = []string{"PATH=/usr/sbin:/usr/bin:/sbin:/bin", "SYNOPKGLAND_PARENT=1"}
296
336
  if cmd.Run() == nil {
@@ -300,3 +340,574 @@ func TestLinuxReparentedChildRefusesBeforeSocket(t *testing.T) {
300
340
  t.Fatal("unsafe child opened socket")
301
341
  }
302
342
  }
343
+
344
+ func vmUnit(t *testing.T, action string) {
345
+ t.Helper()
346
+ if out, err := exec.Command("/bin/systemctl", action, "pkgctl-root.service").CombinedOutput(); err != nil {
347
+ t.Fatalf("systemctl %s: %v %s", action, err, out)
348
+ }
349
+ }
350
+
351
+ // Run the generated M1f hook as an unprivileged user against the real M1g
352
+ // helper. The VM models management ordering, not DSM Package Center itself.
353
+ func TestLinuxPrestopRequiresAdminTeardownAndPrestartNeverRecovers(t *testing.T) {
354
+ p := linuxFixture(t)
355
+ for _, dir := range []string{p.StateDir, p.RunDir} {
356
+ if err := os.Chmod(dir, 0755); err != nil {
357
+ t.Fatal(err)
358
+ }
359
+ }
360
+ proc := startVMHelper(t, p)
361
+ child := supervisedPID(t, proc.PID)
362
+ log := "/tmp/m1f-prestop-message"
363
+ if err := os.WriteFile(log, nil, 0600); err != nil {
364
+ t.Fatal(err)
365
+ }
366
+ if err := os.Chown(log, 65534, 65534); err != nil {
367
+ t.Fatal(err)
368
+ }
369
+ t.Cleanup(func() { os.Remove(log) })
370
+ hook := func(action string, allow bool) {
371
+ t.Helper()
372
+ before, err := os.ReadFile(filepath.Join(p.StateDir, "approval.json"))
373
+ if err != nil {
374
+ t.Fatal(err)
375
+ }
376
+ if err := os.Truncate(log, 0); err != nil {
377
+ t.Fatal(err)
378
+ }
379
+ cmd := exec.Command("/var/packages/root/scripts/start-stop-status", action)
380
+ cmd.Env = append(os.Environ(), "SYNOPKG_TEMP_LOGFILE="+log)
381
+ cmd.SysProcAttr = &syscall.SysProcAttr{Credential: &syscall.Credential{Uid: 65534, Gid: 65534}}
382
+ out, err := cmd.CombinedOutput()
383
+ if (err == nil) != allow {
384
+ t.Fatalf("%s allow=%v: %v %s", action, allow, err, out)
385
+ }
386
+ if !allow {
387
+ message, err := os.ReadFile(log)
388
+ if err != nil || string(message) != string(out) || !strings.Contains(string(out), "helper_teardown") {
389
+ t.Fatalf("missing DSM refusal message: %v %s %s", err, out, message)
390
+ }
391
+ }
392
+ after, err := os.ReadFile(filepath.Join(p.StateDir, "approval.json"))
393
+ if err != nil || string(before) != string(after) {
394
+ t.Fatal("nonprivileged hook changed lifecycle latch", err)
395
+ }
396
+ }
397
+ hook("prestop", false)
398
+ if _, err := observeLinux(context.Background(), p.Expected); err != nil {
399
+ t.Fatal("prestop refusal changed active unit", err)
400
+ }
401
+ current, err := readProcess(p.RunDir, 0)
402
+ if err != nil || current != proc || p.Status(context.Background()).State != "ready" {
403
+ t.Fatal("prestop refusal stopped helper", err)
404
+ }
405
+ hook("prestart", true)
406
+ ctl := Controller{Client: p.Client, Processes: p, Observe: observeLinux}
407
+ if err := ctl.Control(context.Background(), "teardown"); err != nil {
408
+ t.Fatal(err)
409
+ }
410
+ waitPIDExit(t, child)
411
+ waitPIDExit(t, proc.PID)
412
+ hook("prestop", true)
413
+ vmUnit(t, "stop")
414
+ hook("stop", true)
415
+ vmUnit(t, "start")
416
+ hook("prestart", true)
417
+ hook("start", true)
418
+ if p.Status(context.Background()).State != "stopped" || !runtimeAbsent(p.Client) {
419
+ t.Fatal("package Start recovered integration")
420
+ }
421
+ stopped, err := readRecord(p.StateDir, 0)
422
+ if err != nil {
423
+ t.Fatal(err)
424
+ }
425
+ incomplete := stopped
426
+ incomplete.Residual = true
427
+ record(t, p.Client, incomplete)
428
+ hook("prestop", false)
429
+ hook("prestart", true)
430
+ record(t, p.Client, stopped)
431
+ if err := ctl.Control(context.Background(), "recover"); err != nil {
432
+ t.Fatal(err)
433
+ }
434
+ recovered, err := readRecord(p.StateDir, 0)
435
+ if err != nil || recovered.Lifecycle.Epoch == stopped.Lifecycle.Epoch || p.Status(context.Background()).State != "ready" {
436
+ t.Fatal("explicit Recover failed", err)
437
+ }
438
+ if err := ctl.Control(context.Background(), "disable"); err != nil {
439
+ t.Fatal(err)
440
+ }
441
+ hook("prestop", true)
442
+ hook("prestart", true)
443
+ if p.Status(context.Background()).State != "not-enabled" || !runtimeAbsent(p.Client) {
444
+ t.Fatal("prestart cleared disabled gate")
445
+ }
446
+ }
447
+
448
+ func vmLifecycle(t *testing.T, p LinuxProcesses) *Lifecycle {
449
+ t.Helper()
450
+ b, err := observeLinux(context.Background(), p.Expected)
451
+ if err != nil {
452
+ t.Fatal(err)
453
+ }
454
+ l, err := newLifecycle(b)
455
+ if err != nil {
456
+ t.Fatal(err)
457
+ }
458
+ if err := createLifetime(p.Client, l); err != nil {
459
+ t.Fatal(err)
460
+ }
461
+ return l
462
+ }
463
+
464
+ func TestLinuxUnitStopFencesBeforeLockAndPublishesCompletion(t *testing.T) {
465
+ p := linuxFixture(t)
466
+ proc := startVMHelper(t, p)
467
+ child := supervisedPID(t, proc.PID)
468
+ lock, err := os.OpenFile(filepath.Join(p.StateDir, "policy.lock"), os.O_RDWR, 0600)
469
+ if err != nil {
470
+ t.Fatal(err)
471
+ }
472
+ defer lock.Close()
473
+ if err := syscall.Flock(int(lock.Fd()), syscall.LOCK_EX); err != nil {
474
+ t.Fatal(err)
475
+ }
476
+ vmUnit(t, "stop")
477
+ ctx, cancel := context.WithTimeout(context.Background(), time.Second)
478
+ err = waitHealthy(ctx, func(context.Context) bool {
479
+ s := p.Status(context.Background())
480
+ return s.State == "failed" && s.Cleanup == "required"
481
+ })
482
+ cancel()
483
+ syscall.Flock(int(lock.Fd()), syscall.LOCK_UN)
484
+ if err != nil {
485
+ t.Fatal("memory fence waited for policy lock", err)
486
+ }
487
+ ctx, cancel = context.WithTimeout(context.Background(), 3*time.Second)
488
+ defer cancel()
489
+ if waitHealthy(ctx, func(context.Context) bool {
490
+ r, e := readRecord(p.StateDir, 0)
491
+ return e == nil && !r.Residual && r.Lifecycle.Phase == "stopped" && r.Lifecycle.Completion != ""
492
+ }) != nil {
493
+ t.Fatal("completion missing")
494
+ }
495
+ r, _ := readRecord(p.StateDir, 0)
496
+ proof, e := completionRecord(p.Client, r)
497
+ if e != nil {
498
+ t.Fatal(e)
499
+ }
500
+ if proof.Process != proc {
501
+ t.Fatal("wrong completion identity", r)
502
+ }
503
+ waitPIDExit(t, child)
504
+ waitPIDExit(t, proc.PID)
505
+ if err := p.CheckStopped(context.Background()); err != nil {
506
+ t.Fatal(err)
507
+ }
508
+ ctl := Controller{Client: p.Client, Processes: p, Observe: observeLinux}
509
+ if ctl.Control(context.Background(), "recover") == nil {
510
+ t.Fatal("inactive unit recovered")
511
+ }
512
+ vmUnit(t, "start")
513
+ if p.Status(context.Background()).State != "stopped" {
514
+ t.Fatal("unit Start resurrected integration")
515
+ }
516
+ if err := ctl.Control(context.Background(), "recover"); err != nil {
517
+ t.Fatal(err)
518
+ }
519
+ next, _ := readRecord(p.StateDir, 0)
520
+ if next.Lifecycle.Epoch == r.Lifecycle.Epoch || p.Status(context.Background()).State != "ready" {
521
+ t.Fatal("explicit recovery failed")
522
+ }
523
+ }
524
+ func TestLinuxRapidUnitStopStartNeverClearsFence(t *testing.T) {
525
+ p := linuxFixture(t)
526
+ proc := startVMHelper(t, p)
527
+ vmUnit(t, "stop")
528
+ vmUnit(t, "start")
529
+ ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
530
+ defer cancel()
531
+ if waitHealthy(ctx, func(context.Context) bool {
532
+ r, e := readRecord(p.StateDir, 0)
533
+ return e == nil && r.Lifecycle.Phase == "stopped" && !r.Residual
534
+ }) != nil {
535
+ t.Fatal("rapid transition missed")
536
+ }
537
+ waitPIDExit(t, proc.PID)
538
+ if p.Status(context.Background()).State != "stopped" {
539
+ t.Fatal("rapid Start resurrected")
540
+ }
541
+ }
542
+ func TestLinuxBusUnavailableRefusesActivation(t *testing.T) {
543
+ p := linuxFixture(t)
544
+ socket := busPath
545
+ if err := os.Rename(socket, socket+".fixture"); err != nil {
546
+ t.Fatal(err)
547
+ }
548
+ defer os.Rename(socket+".fixture", socket)
549
+ ctl := Controller{Client: p.Client, Processes: p, Observe: observeLinux}
550
+ if ctl.Control(context.Background(), "enable") == nil {
551
+ t.Fatal("activation without bus")
552
+ }
553
+ if !runtimeAbsent(p.Client) {
554
+ t.Fatal("unknown authority spawned runtime")
555
+ }
556
+ }
557
+
558
+ func TestLinuxRealOldPayloadReplayRefusesNewApproval(t *testing.T) {
559
+ p := linuxFixture(t)
560
+ _ = startVMHelper(t, p)
561
+ if err := (Controller{Client: p.Client, Processes: p, Observe: observeLinux}).Control(context.Background(), "teardown"); err != nil {
562
+ t.Fatal(err)
563
+ }
564
+ before, err := os.ReadFile(filepath.Join(p.StateDir, "approval.json"))
565
+ if err != nil {
566
+ t.Fatal(err)
567
+ }
568
+ digest, err := executableDigest("/helper-legacy")
569
+ if err != nil {
570
+ t.Fatal(err)
571
+ }
572
+ path := filepath.Join(p.StateDir, "payload-"+digest)
573
+ b, err := os.ReadFile("/helper-legacy")
574
+ if err != nil {
575
+ t.Fatal(err)
576
+ }
577
+ if err := os.WriteFile(path, b, 0700); err != nil {
578
+ t.Fatal(err)
579
+ }
580
+ for _, action := range []string{"enable", "recover", "supervise"} {
581
+ if out, err := exec.Command(path, action).CombinedOutput(); err == nil {
582
+ t.Fatalf("old payload replayed %s %s", action, out)
583
+ }
584
+ }
585
+ after, _ := os.ReadFile(filepath.Join(p.StateDir, "approval.json"))
586
+ if string(before) != string(after) || !runtimeAbsent(p.Client) {
587
+ t.Fatal("old payload changed latch")
588
+ }
589
+ }
590
+ func TestLinuxBusRestartFencesAndCompletesRuntime(t *testing.T) {
591
+ p := linuxFixture(t)
592
+ proc := startVMHelper(t, p)
593
+ if out, err := exec.Command("/bin/systemctl", "restart", "dbus.service").CombinedOutput(); err != nil {
594
+ t.Fatal(err, string(out))
595
+ }
596
+ ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
597
+ defer cancel()
598
+ if waitHealthy(ctx, func(context.Context) bool {
599
+ r, e := readRecord(p.StateDir, 0)
600
+ return e == nil && r.Lifecycle.Phase == "stopped" && !r.Residual && r.Lifecycle.Completion != ""
601
+ }) != nil {
602
+ t.Fatal("bus loss did not complete")
603
+ }
604
+ waitPIDExit(t, proc.PID)
605
+ if p.Status(context.Background()).State != "stopped" {
606
+ t.Fatal("bus reconnection revived helper")
607
+ }
608
+ }
609
+
610
+ func TestLinuxLostSupervisorRepairThenExplicitRecover(t *testing.T) {
611
+ p := linuxFixture(t)
612
+ record(t, p.Client, Record{Inventory: p.Expected, Enabled: true, Lifecycle: vmLifecycle(t, p)})
613
+ cmd := exec.Command(p.Binary, "supervise")
614
+ if err := cmd.Start(); err != nil {
615
+ t.Fatal(err)
616
+ }
617
+ owned := &ownedLinuxChild{process: cmd.Process}
618
+ t.Cleanup(func() { stopChild(context.Background(), owned, time.Millisecond) })
619
+ ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
620
+ err := waitHealthy(ctx, func(ctx context.Context) bool { return p.Status(ctx).State == "ready" })
621
+ cancel()
622
+ if err != nil {
623
+ t.Fatal(err)
624
+ }
625
+ proc, err := readProcess(p.RunDir, 0)
626
+ if err != nil {
627
+ t.Fatal(err)
628
+ }
629
+ child := supervisedPID(t, proc.PID)
630
+ ctl := Controller{Client: p.Client, Processes: p, Observe: observeLinux}
631
+ if ctl.Control(context.Background(), "repair") == nil {
632
+ t.Fatal("repaired live supervisor")
633
+ }
634
+ if p.Status(context.Background()).State != "ready" {
635
+ t.Fatal("busy repair fenced active helper")
636
+ }
637
+ if err := owned.signal(syscall.SIGKILL); err != nil {
638
+ t.Fatal(err)
639
+ }
640
+ waitPIDExit(t, proc.PID)
641
+ waitPIDExit(t, child)
642
+ if ctl.Control(context.Background(), "recover") == nil {
643
+ t.Fatal("loss recovered without repair")
644
+ }
645
+ if err := ctl.Control(context.Background(), "repair"); err != nil {
646
+ t.Fatal(err)
647
+ }
648
+ repaired, err := readRecord(p.StateDir, 0)
649
+ if err != nil || repaired.Residual || repaired.Lifecycle.Completion == "" || p.Status(context.Background()).State != "stopped" {
650
+ t.Fatal("repair not committed", err)
651
+ }
652
+ proof, err := completionRecord(p.Client, repaired)
653
+ if err != nil || proof.Repair == nil || !runtimeAbsent(p.Client) {
654
+ t.Fatal("no repair proof", err)
655
+ }
656
+ if err := ctl.Control(context.Background(), "repair"); err != nil {
657
+ t.Fatal(err)
658
+ }
659
+ if err := ctl.Control(context.Background(), "recover"); err != nil {
660
+ t.Fatal(err)
661
+ }
662
+ next, _ := readRecord(p.StateDir, 0)
663
+ if next.Lifecycle.Epoch == repaired.Lifecycle.Epoch || p.Status(context.Background()).State != "ready" {
664
+ t.Fatal("explicit recovery did not start new epoch")
665
+ }
666
+ t.Cleanup(func() { ctl.Control(context.Background(), "disable") })
667
+ // A package/nonroot process cannot use the executable repair entry.
668
+ for _, dir := range []string{p.StateDir, p.RunDir} {
669
+ if err := os.Chmod(dir, 0755); err != nil {
670
+ t.Fatal(err)
671
+ }
672
+ }
673
+ if err := os.Chmod(p.Binary, 0755); err != nil {
674
+ t.Fatal(err)
675
+ }
676
+ denied := exec.Command(p.Binary, "repair")
677
+ denied.SysProcAttr = &syscall.SysProcAttr{Credential: &syscall.Credential{Uid: 65534, Gid: 65534}}
678
+ output, err := denied.CombinedOutput()
679
+ if err == nil || !strings.Contains(string(output), "helper lifecycle refused") {
680
+ t.Fatal("package user did not reach euid refusal", err, string(output))
681
+ }
682
+
683
+ }
684
+
685
+ func TestLinuxInheritedLifetimePinsLockUntilLastHolderExit(t *testing.T) {
686
+ p := linuxFixture(t)
687
+ l := vmLifecycle(t, p)
688
+ lease, err := acquireLifetime(p.Client, l)
689
+ if err != nil {
690
+ t.Fatal(err)
691
+ }
692
+ cmd := exec.Command("/bin/sleep", "60")
693
+ cmd.ExtraFiles = []*os.File{lease}
694
+ if err := cmd.Start(); err != nil {
695
+ t.Fatal(err)
696
+ }
697
+ child := &ownedLinuxChild{process: cmd.Process}
698
+ t.Cleanup(func() { stopChild(context.Background(), child, time.Millisecond) })
699
+ // Model supervisor loss while the inherited child is still alive. No
700
+ // LOCK_UN: closing that would release the shared flock prematurely.
701
+ lease.Close()
702
+ if got, err := acquireLifetime(p.Client, l); err == nil {
703
+ got.Close()
704
+ t.Fatal("parent close released live child's witness")
705
+ }
706
+ if err := stopChild(context.Background(), child, time.Millisecond); err != nil {
707
+ t.Fatal(err)
708
+ }
709
+ got, err := acquireLifetime(p.Client, l)
710
+ if err != nil {
711
+ t.Fatal(err)
712
+ }
713
+ got.Close()
714
+ }
715
+
716
+ func TestLinuxPreR2PayloadReplayAndLateSupervisorRefuseRepairLatch(t *testing.T) {
717
+ p := linuxFixture(t)
718
+ record(t, p.Client, Record{Inventory: p.Expected, Enabled: true, Residual: true, Lifecycle: vmLifecycle(t, p)})
719
+ ctl := Controller{Client: p.Client, Processes: p, Observe: observeLinux}
720
+ // No process was started: the same lease also proves the startup crash gap.
721
+ if err := ctl.Control(context.Background(), "repair"); err != nil {
722
+ t.Fatal(err)
723
+ }
724
+ before, _ := os.ReadFile(filepath.Join(p.StateDir, "approval.json"))
725
+ if out, err := exec.Command(p.Binary, "supervise").CombinedOutput(); err == nil {
726
+ t.Fatal("late supervisor crossed repair latch", string(out))
727
+ }
728
+ for _, source := range []string{"/helper-pre-r2", "/helper-m1d"} {
729
+ digest, err := executableDigest(source)
730
+ if err != nil {
731
+ t.Fatal(err)
732
+ }
733
+ bytes, err := os.ReadFile(source)
734
+ if err != nil {
735
+ t.Fatal(err)
736
+ }
737
+ path := filepath.Join(p.StateDir, "payload-"+digest)
738
+ if err := os.WriteFile(path, bytes, 0700); err != nil {
739
+ t.Fatal(err)
740
+ }
741
+ for _, action := range []string{"enable", "recover", "supervise", "disable", "teardown"} {
742
+ if out, err := exec.Command(path, action).CombinedOutput(); err == nil {
743
+ t.Fatal("old payload crossed repair schema", source, action, string(out))
744
+ }
745
+ }
746
+ }
747
+ after, _ := os.ReadFile(filepath.Join(p.StateDir, "approval.json"))
748
+ if string(before) != string(after) || !runtimeAbsent(p.Client) {
749
+ t.Fatal("replay altered completion")
750
+ }
751
+ }
752
+
753
+ func TestLinuxActualM1dLostSupervisorResidueCannotGainRepairWitness(t *testing.T) {
754
+ p := linuxFixture(t)
755
+ digest, err := executableDigest("/helper-m1d")
756
+ if err != nil {
757
+ t.Fatal(err)
758
+ }
759
+ old := p
760
+ old.Expected.PayloadDigest = digest
761
+ old.Binary = filepath.Join(p.StateDir, "payload-"+digest)
762
+ bytes, err := os.ReadFile("/helper-m1d")
763
+ if err != nil {
764
+ t.Fatal(err)
765
+ }
766
+ if err := os.WriteFile(old.Binary, bytes, 0700); err != nil {
767
+ t.Fatal(err)
768
+ }
769
+ record(t, p.Client, Record{Inventory: old.Expected, Enabled: true})
770
+ cmd := exec.Command(old.Binary, "supervise")
771
+ if err := cmd.Start(); err != nil {
772
+ t.Fatal(err)
773
+ }
774
+ owned := &ownedLinuxChild{process: cmd.Process}
775
+ t.Cleanup(func() { stopChild(context.Background(), owned, time.Millisecond) })
776
+ ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
777
+ err = waitHealthy(ctx, func(ctx context.Context) bool { return old.Status(ctx).State == "ready" })
778
+ cancel()
779
+ if err != nil {
780
+ t.Fatal(err)
781
+ }
782
+ proc, err := readProcess(p.RunDir, 0)
783
+ if err != nil {
784
+ t.Fatal(err)
785
+ }
786
+ child := supervisedPID(t, proc.PID)
787
+ if err := owned.signal(syscall.SIGKILL); err != nil {
788
+ t.Fatal(err)
789
+ }
790
+ waitPIDExit(t, proc.PID)
791
+ waitPIDExit(t, child)
792
+ // Mimic an upgraded controller; it must not create a new lock as purported
793
+ // historical proof, even though both observed PIDs have exited in this VM.
794
+ ctl := Controller{Client: p.Client, Processes: p, Observe: observeLinux}
795
+ if ctl.Control(context.Background(), "repair") == nil {
796
+ t.Fatal("upgraded helper repaired unwitnessed legacy residue")
797
+ }
798
+ for _, name := range []string{"helper.sock", "supervisor.sock", "process.json"} {
799
+ if _, err := os.Lstat(filepath.Join(p.RunDir, name)); err != nil {
800
+ t.Fatal("legacy evidence removed", name, err)
801
+ }
802
+ }
803
+ leases, _ := filepath.Glob(filepath.Join(p.StateDir, "lifetime-*.lock"))
804
+ if len(leases) != 0 {
805
+ t.Fatal("retroactively manufactured witness", leases)
806
+ }
807
+ }
808
+
809
+ func TestLinuxAdminTeardownSnapshotRace(t *testing.T) {
810
+ p := linuxFixture(t)
811
+ proc := startVMHelper(t, p)
812
+ child := supervisedPID(t, proc.PID)
813
+ ctl := Controller{Client: p.Client, Processes: p, Observe: observeLinux, Boot: linuxBoot}
814
+ // Capture the fenced snapshot inside the policy transaction, before the
815
+ // owner can complete it. Then deliberately let the real owner win the race.
816
+ var before Record
817
+ if err := policyUpdate(p.Client, func(r *Record) error {
818
+ r.Lifecycle.Phase = "fenced"
819
+ r.Lifecycle.Reason = "admin-stop"
820
+ r.Residual = true
821
+ before = *r
822
+ return nil
823
+ }); err != nil {
824
+ t.Fatal(err)
825
+ }
826
+ ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
827
+ defer cancel()
828
+ if waitHealthy(ctx, func(context.Context) bool {
829
+ r, e := readRecord(p.StateDir, 0)
830
+ if e != nil {
831
+ return false
832
+ }
833
+ proof, e := completionRecord(p.Client, r)
834
+ return e == nil && proof.Process == proc && runtimeAbsent(p.Client)
835
+ }) != nil {
836
+ t.Fatal("owner did not commit autonomous admin-stop")
837
+ }
838
+ waitPIDExit(t, child)
839
+ waitPIDExit(t, proc.PID)
840
+ if err := ctl.teardownRecord(before, proc); err != nil {
841
+ t.Fatal("exact committed completion rejected after approval snapshot", err)
842
+ }
843
+ }
844
+
845
+ type pausedCompletionProcesses struct {
846
+ LinuxProcesses
847
+ visible string
848
+ }
849
+
850
+ func (p pausedCompletionProcesses) Stop(proc Process) error {
851
+ ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
852
+ defer cancel()
853
+ if err := waitHealthy(ctx, func(context.Context) bool {
854
+ _, err := os.Stat(p.visible)
855
+ return err == nil
856
+ }); err != nil {
857
+ return err
858
+ }
859
+ // Exercise the real socket/identity path after autonomous runtime unlink.
860
+ return p.LinuxProcesses.Stop(proc)
861
+ }
862
+
863
+ func TestLinuxControllerWaitsForRealCompletionPublisher(t *testing.T) {
864
+ p := linuxFixture(t)
865
+ proc := startVMHelper(t, p)
866
+ child := supervisedPID(t, proc.PID)
867
+ hold := filepath.Join(p.StateDir, "fixture-hold-completion")
868
+ if err := os.WriteFile(hold, []byte("pause publisher after approval rename"), 0600); err != nil {
869
+ t.Fatal(err)
870
+ }
871
+ defer func() {
872
+ os.Remove(hold) // disposable VM fixture only; never a NAS operation
873
+ waitPIDExit(t, child)
874
+ waitPIDExit(t, proc.PID)
875
+ }()
876
+ result := make(chan error, 1)
877
+ go func() {
878
+ processes := pausedCompletionProcesses{LinuxProcesses: p, visible: filepath.Join(p.StateDir, "fixture-completion-visible")}
879
+ result <- (Controller{Client: p.Client, Processes: processes, Observe: observeLinux, Boot: linuxBoot}).Control(context.Background(), "teardown")
880
+ }()
881
+ ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
882
+ defer cancel()
883
+ if waitHealthy(ctx, func(context.Context) bool {
884
+ _, visible := os.Stat(filepath.Join(p.StateDir, "fixture-completion-visible"))
885
+ r, e := readRecord(p.StateDir, 0)
886
+ if visible != nil || e != nil {
887
+ return false
888
+ }
889
+ proof, e := completionRecord(p.Client, r)
890
+ return e == nil && proof.Process == proc && runtimeAbsent(p.Client)
891
+ }) != nil {
892
+ t.Fatal("real supervisor did not publish while holding policy.lock")
893
+ }
894
+ select {
895
+ case err := <-result:
896
+ t.Fatal("controller returned before publisher unlocked", err)
897
+ case <-time.After(100 * time.Millisecond):
898
+ }
899
+ if err := os.Remove(hold); err != nil {
900
+ t.Fatal(err)
901
+ }
902
+ select {
903
+ case err := <-result:
904
+ if err != nil {
905
+ t.Fatal("real committed completion refused after publisher unlock", err)
906
+ }
907
+ case <-ctx.Done():
908
+ t.Fatal("controller did not finish after publisher unlock")
909
+ }
910
+ if err := p.CheckStopped(context.Background()); err != nil {
911
+ t.Fatal(err)
912
+ }
913
+ }