@underpostnet/cyberia 3.3.0 → 3.3.76

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 (568) hide show
  1. package/.dockerignore +1 -0
  2. package/.env.example +17 -5
  3. package/.github/workflows/coverall.cyberia.ci.yml +39 -14
  4. package/.github/workflows/cyberia-client.cd.yml +5 -0
  5. package/.github/workflows/cyberia-server.cd.yml +5 -0
  6. package/.github/workflows/docker-image.cyberia-client.ci.yml +8 -5
  7. package/.github/workflows/docker-image.cyberia-client.dev.ci.yml +8 -3
  8. package/.github/workflows/docker-image.cyberia-server.ci.yml +8 -5
  9. package/.github/workflows/docker-image.cyberia-server.dev.ci.yml +8 -5
  10. package/.github/workflows/docker-image.engine-cyberia.ci.yml +15 -1
  11. package/.github/workflows/docker-image.engine-cyberia.dev.ci.yml +15 -1
  12. package/.github/workflows/engine-cyberia.cd.yml +3 -0
  13. package/.github/workflows/engine-cyberia.ci.yml +4 -5
  14. package/.github/workflows/ghpkg.ci.yml +35 -20
  15. package/.github/workflows/hardhat.ci.yml +12 -11
  16. package/.github/workflows/npmpkg.ci.yml +17 -15
  17. package/.github/workflows/publish.cyberia.ci.yml +44 -0
  18. package/.github/workflows/pwa-microservices-template-test.ci.yml +2 -2
  19. package/.github/workflows/release.cd.yml +1 -0
  20. package/.prettierignore +1 -0
  21. package/AGENTS.md +96 -0
  22. package/CHANGELOG.md +653 -2513
  23. package/CLI-HELP.md +323 -157
  24. package/Dockerfile +25 -9
  25. package/Dockerfile.dev +25 -9
  26. package/Dockerfile.test +5 -5
  27. package/README.md +48 -28
  28. package/bin/build.js +86 -41
  29. package/bin/build.template.js +8 -3
  30. package/bin/cyberia.js +1494 -1403
  31. package/bin/deploy.js +18 -104
  32. package/bin/index.js +1494 -1403
  33. package/compose.env +17 -5
  34. package/conf.js +98 -7
  35. package/deploy/cyberia-client/deploy.sh +46 -0
  36. package/deploy/cyberia-client/package.sh +17 -0
  37. package/deploy/cyberia-client/state.sh +15 -0
  38. package/deploy/cyberia-server/deploy.sh +46 -0
  39. package/deploy/cyberia-server/package.sh +17 -0
  40. package/deploy/cyberia-server/state.sh +15 -0
  41. package/deploy/dd-cyberia/deploy.sh +9 -29
  42. package/deploy/dd-cyberia/init.sh +38 -45
  43. package/deploy/dd-cyberia/package.sh +16 -0
  44. package/deploy/dd-cyberia/state.sh +14 -0
  45. package/deploy/dd-cyberia/sync-deploy.sh +133 -147
  46. package/deploy/lib/config.sh +29 -0
  47. package/deploy/lib/github-actions-logging.sh +610 -0
  48. package/deploy/lib/host.sh +194 -0
  49. package/deploy/lib/state.sh +65 -0
  50. package/deploy/pwa-microservices-template/deploy.sh +17 -42
  51. package/deploy/release/deploy.sh +9 -41
  52. package/deployment.yaml +7 -2
  53. package/docker-compose.yml +23 -17
  54. package/examples/static-page/README.md +19 -19
  55. package/examples/static-page/ssr-components/CustomPage.js +2 -2
  56. package/hardhat/hardhat.config.js +1 -6
  57. package/hardhat/package-lock.json +101 -40
  58. package/hardhat/package.json +2 -2
  59. package/manifests/alertmanager/deployment.yaml +81 -0
  60. package/manifests/blackbox-exporter/deployment.yaml +75 -0
  61. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +32 -7
  62. package/manifests/cronjobs/dd-cron/dd-cron-vultr.yaml +32 -7
  63. package/manifests/deployment/dd-cyberia-development/deployment.yaml +7 -2
  64. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  65. package/manifests/deployment/mongo-express/deployment.yaml +46 -27
  66. package/manifests/deployment/mongo-express/kustomization.yaml +9 -0
  67. package/manifests/deployment/mongo-express/mongo-express-nodeport.yaml +18 -0
  68. package/manifests/deployment/mongo-express/service.yaml +16 -0
  69. package/manifests/deployment/mongo-express-no-auth/disable-mongodb-auth.yaml +16 -0
  70. package/manifests/deployment/mongo-express-no-auth/kustomization.yaml +16 -0
  71. package/manifests/grafana/deployment.yaml +26 -7
  72. package/manifests/grafana/kustomization.yaml +1 -0
  73. package/manifests/grafana/service.yaml +6 -1
  74. package/manifests/mariadb/pv.yaml +1 -0
  75. package/manifests/mongodb/statefulset.yaml +9 -2
  76. package/manifests/mysql/pv-pvc.yaml +14 -1
  77. package/manifests/postgresql/pv.yaml +12 -1
  78. package/manifests/postgresql/pvc.yaml +1 -0
  79. package/manifests/prometheus/deployment.yaml +18 -22
  80. package/package.json +87 -12
  81. package/scripts/event-monitor.sh +56 -0
  82. package/scripts/k3s-node-setup.sh +27 -14
  83. package/scripts/kubeadm-node-setup.sh +31 -11
  84. package/scripts/maas-setup.sh +8 -8
  85. package/scripts/selinux-normalize.sh +907 -0
  86. package/scripts/shutdown-machine.sh +843 -0
  87. package/scripts/test-monitor.sh +5 -5
  88. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +15 -10
  89. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +36 -5
  90. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +7 -2
  91. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +90 -186
  92. package/src/api/core/core.controller.js +1 -1
  93. package/src/api/core/core.router.js +2 -2
  94. package/src/api/core/core.service.js +2 -2
  95. package/src/api/crypto/crypto.controller.js +1 -1
  96. package/src/api/crypto/crypto.service.js +1 -1
  97. package/src/api/cyberia-action/cyberia-action.controller.js +1 -1
  98. package/src/api/cyberia-action/cyberia-action.router.js +3 -3
  99. package/src/api/cyberia-action/cyberia-action.service.js +5 -6
  100. package/src/api/cyberia-audio/cyberia-audio.controller.js +6 -0
  101. package/src/api/cyberia-audio/cyberia-audio.model.js +61 -0
  102. package/src/api/cyberia-audio/cyberia-audio.router.js +21 -0
  103. package/src/api/cyberia-audio/cyberia-audio.service.js +220 -0
  104. package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +2 -4
  105. package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +10 -19
  106. package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +13 -35
  107. package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +17 -34
  108. package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +1 -1
  109. package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +1 -1
  110. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +2 -2
  111. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +2 -2
  112. package/src/api/cyberia-entity/cyberia-entity.controller.js +1 -1
  113. package/src/api/cyberia-entity/cyberia-entity.model.js +2 -0
  114. package/src/api/cyberia-entity/cyberia-entity.router.js +1 -1
  115. package/src/api/cyberia-entity/cyberia-entity.service.js +3 -3
  116. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +8 -2
  117. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.model.js +31 -20
  118. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +17 -2
  119. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +468 -5
  120. package/src/api/cyberia-instance/cyberia-fallback-capture.js +502 -0
  121. package/src/api/cyberia-instance/cyberia-fallback-world.js +29 -40
  122. package/src/api/cyberia-instance/cyberia-instance-boot.service.js +5 -5
  123. package/src/api/cyberia-instance/cyberia-instance-items.js +98 -0
  124. package/src/api/cyberia-instance/cyberia-instance-map.service.js +35 -142
  125. package/src/api/cyberia-instance/cyberia-instance.controller.js +2 -5
  126. package/src/api/cyberia-instance/cyberia-instance.model.js +0 -14
  127. package/src/api/cyberia-instance/cyberia-instance.router.js +5 -18
  128. package/src/api/cyberia-instance/cyberia-instance.service.js +5 -45
  129. package/src/api/cyberia-instance/cyberia-world-generator.js +8 -13
  130. package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +1 -1
  131. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +49 -75
  132. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +1 -1
  133. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +76 -3
  134. package/src/api/cyberia-map/cyberia-map.controller.js +1 -1
  135. package/src/api/cyberia-map/cyberia-map.router.js +1 -1
  136. package/src/api/cyberia-map/cyberia-map.service.js +8 -4
  137. package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.controller.js +31 -0
  138. package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.model.js +56 -0
  139. package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.router.js +33 -0
  140. package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.service.js +189 -0
  141. package/src/api/cyberia-quest/cyberia-quest.controller.js +1 -1
  142. package/src/api/cyberia-quest/cyberia-quest.router.js +4 -4
  143. package/src/api/cyberia-quest/cyberia-quest.service.js +5 -5
  144. package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +1 -1
  145. package/src/api/cyberia-quest-progress/cyberia-quest-progress.model.js +1 -1
  146. package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +1 -1
  147. package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +2 -2
  148. package/src/api/cyberia-saga/cyberia-saga.controller.js +1 -1
  149. package/src/api/cyberia-saga/cyberia-saga.router.js +1 -1
  150. package/src/api/cyberia-saga/cyberia-saga.service.js +2 -2
  151. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +403 -214
  152. package/src/api/cyberia-skill/cyberia-skill.controller.js +1 -1
  153. package/src/api/cyberia-skill/cyberia-skill.model.js +6 -6
  154. package/src/api/cyberia-skill/cyberia-skill.router.js +1 -1
  155. package/src/api/cyberia-skill/cyberia-skill.service.js +2 -2
  156. package/src/api/default/default.controller.js +1 -1
  157. package/src/api/default/default.router.js +1 -1
  158. package/src/api/default/default.service.js +2 -2
  159. package/src/api/document/document.controller.js +1 -1
  160. package/src/api/document/document.router.js +1 -1
  161. package/src/api/document/document.service.js +2 -2
  162. package/src/api/file/file.controller.js +1 -1
  163. package/src/api/file/file.ref.js +153 -0
  164. package/src/api/file/file.ref.json +11 -2
  165. package/src/api/file/file.router.js +1 -1
  166. package/src/api/file/file.service.js +2 -2
  167. package/src/api/instance/instance.controller.js +1 -1
  168. package/src/api/instance/instance.router.js +1 -1
  169. package/src/api/instance/instance.service.js +2 -2
  170. package/src/api/ipfs/ipfs.controller.js +1 -1
  171. package/src/api/ipfs/ipfs.router.js +2 -2
  172. package/src/api/ipfs/ipfs.service.js +2 -2
  173. package/src/api/object-layer/object-layer.controller.js +1 -1
  174. package/src/api/object-layer/object-layer.model.js +47 -12
  175. package/src/api/object-layer/object-layer.router.js +12 -5
  176. package/src/api/object-layer/object-layer.service.js +116 -123
  177. package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +1 -1
  178. package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +1 -1
  179. package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +2 -2
  180. package/src/api/test/test.controller.js +1 -1
  181. package/src/api/test/test.service.js +1 -1
  182. package/src/api/user/guest.service.js +3 -3
  183. package/src/api/user/user.controller.js +1 -1
  184. package/src/api/user/user.router.js +2 -2
  185. package/src/api/user/user.service.js +4 -4
  186. package/src/api.js +5 -9
  187. package/src/cli/app.js +402 -0
  188. package/src/cli/baremetal.js +30 -35
  189. package/src/cli/client.js +306 -0
  190. package/src/cli/cloud-init.js +3 -3
  191. package/src/cli/cluster.js +191 -82
  192. package/src/cli/db.js +120 -68
  193. package/src/cli/deploy.js +157 -75
  194. package/src/cli/docker-compose.js +5 -5
  195. package/src/cli/domains.js +184 -0
  196. package/src/cli/dotenv-store.js +143 -0
  197. package/src/cli/event.js +2281 -0
  198. package/src/cli/fs-selection.js +115 -0
  199. package/src/cli/fs.js +159 -343
  200. package/src/cli/host.js +672 -0
  201. package/src/cli/image.js +4 -6
  202. package/src/cli/index.js +343 -151
  203. package/src/cli/ipfs.js +34 -30
  204. package/src/cli/kickstart.js +1 -1
  205. package/src/cli/kubectl.js +218 -41
  206. package/src/cli/lxd.js +3 -3
  207. package/src/cli/monitor.js +1359 -26
  208. package/src/cli/package.js +90 -0
  209. package/src/cli/release.js +16 -12
  210. package/src/cli/repository.js +586 -363
  211. package/src/cli/run.js +398 -843
  212. package/src/cli/secrets.js +2158 -964
  213. package/src/cli/ssh.js +478 -279
  214. package/src/cli/state.js +394 -0
  215. package/src/cli/static.js +2 -2
  216. package/src/cli/system.js +1 -1
  217. package/src/cli/test.js +203 -125
  218. package/src/cli/vultr.js +61 -21
  219. package/src/cli/wireguard.js +1112 -306
  220. package/src/client/components/core/CalendarCore.js +53 -96
  221. package/src/client/components/core/Docs.js +327 -303
  222. package/src/client/components/core/FileExplorer.js +0 -21
  223. package/src/client/components/core/Modal.js +56 -1
  224. package/src/client/components/core/PanelForm.js +4 -4
  225. package/src/client/components/core/Repository.js +56 -0
  226. package/src/client/components/core/Translate.js +7 -0
  227. package/src/client/components/core/{FullScreen.js → ViewModeController.js} +42 -39
  228. package/src/client/components/core/Wallet.js +0 -11
  229. package/src/client/components/core/Worker.js +7 -1
  230. package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +2 -2
  231. package/src/client/components/cyberia/ActionEngineCyberia.js +12 -36
  232. package/src/client/components/cyberia/EntityEngineCyberia.js +492 -121
  233. package/src/client/components/cyberia/InstanceEngineCyberia.js +129 -160
  234. package/src/client/components/cyberia/InstanceSelectionView.js +7 -1
  235. package/src/client/components/cyberia/MapEngineCyberia.js +175 -69
  236. package/src/client/components/cyberia/ObjectLayerEngine.js +1011 -97
  237. package/src/client/components/cyberia/ObjectLayerEngineModal.js +81 -155
  238. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +113 -98
  239. package/src/client/components/cyberia/SharedDefaultsCyberia.js +215 -56
  240. package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +2 -35
  241. package/src/client/components/cyberia-portal/CssCyberiaPortal.js +1 -1
  242. package/src/client/components/cyberia-portal/MainBodyCyberiaPortal.js +712 -76
  243. package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +2 -2
  244. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +0 -4
  245. package/src/client/components/default/AppShellDefault.js +1 -1
  246. package/src/client/components/default/SettingsDefault.js +2 -2
  247. package/src/client/components/itemledger/SettingsItemledger.js +2 -2
  248. package/src/client/components/underpost/AppShellUnderpost.js +3 -2
  249. package/src/client/components/underpost/SettingsUnderpost.js +2 -2
  250. package/src/client/public/cyberia-docs/ARCHITECTURE.md +15 -15
  251. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +313 -30
  252. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +51 -29
  253. package/src/client/public/cyberia-docs/CYBERIA-SAGA.md +52 -53
  254. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +16 -11
  255. package/src/client/public/cyberia-docs/CYBERIA.md +48 -28
  256. package/src/client/public/cyberia-docs/ENTITY-PROFILE.md +11 -5
  257. package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +23 -6
  258. package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
  259. package/src/client/public/cyberia-docs/STATS-PROGRESSION.md +217 -0
  260. package/src/client/public/cyberia-docs/WHITE-PAPER.md +20 -12
  261. package/src/client/public/default/android-chrome-144x144.png +0 -0
  262. package/src/client/public/default/android-chrome-192x192.png +0 -0
  263. package/src/client/public/default/android-chrome-256x256.png +0 -0
  264. package/src/client/public/default/android-chrome-36x36.png +0 -0
  265. package/src/client/public/default/android-chrome-384x384.png +0 -0
  266. package/src/client/public/default/android-chrome-48x48.png +0 -0
  267. package/src/client/public/default/android-chrome-512x512.png +0 -0
  268. package/src/client/public/default/android-chrome-72x72.png +0 -0
  269. package/src/client/public/default/android-chrome-96x96.png +0 -0
  270. package/src/client/public/default/apple-touch-icon-1024x1024.png +0 -0
  271. package/src/client/public/default/apple-touch-icon-114x114.png +0 -0
  272. package/src/client/public/default/apple-touch-icon-120x120.png +0 -0
  273. package/src/client/public/default/apple-touch-icon-144x144.png +0 -0
  274. package/src/client/public/default/apple-touch-icon-152x152.png +0 -0
  275. package/src/client/public/default/apple-touch-icon-167x167.png +0 -0
  276. package/src/client/public/default/apple-touch-icon-180x180.png +0 -0
  277. package/src/client/public/default/apple-touch-icon-57x57.png +0 -0
  278. package/src/client/public/default/apple-touch-icon-60x60.png +0 -0
  279. package/src/client/public/default/apple-touch-icon-72x72.png +0 -0
  280. package/src/client/public/default/apple-touch-icon-76x76.png +0 -0
  281. package/src/client/public/default/apple-touch-icon-precomposed.png +0 -0
  282. package/src/client/public/default/apple-touch-icon.png +0 -0
  283. package/src/client/public/default/apple-touch-startup-image-1125x2436.png +0 -0
  284. package/src/client/public/default/apple-touch-startup-image-1136x640.png +0 -0
  285. package/src/client/public/default/apple-touch-startup-image-1170x2532.png +0 -0
  286. package/src/client/public/default/apple-touch-startup-image-1179x2556.png +0 -0
  287. package/src/client/public/default/apple-touch-startup-image-1242x2208.png +0 -0
  288. package/src/client/public/default/apple-touch-startup-image-1242x2688.png +0 -0
  289. package/src/client/public/default/apple-touch-startup-image-1284x2778.png +0 -0
  290. package/src/client/public/default/apple-touch-startup-image-1290x2796.png +0 -0
  291. package/src/client/public/default/apple-touch-startup-image-1334x750.png +0 -0
  292. package/src/client/public/default/apple-touch-startup-image-1488x2266.png +0 -0
  293. package/src/client/public/default/apple-touch-startup-image-1536x2048.png +0 -0
  294. package/src/client/public/default/apple-touch-startup-image-1620x2160.png +0 -0
  295. package/src/client/public/default/apple-touch-startup-image-1640x2160.png +0 -0
  296. package/src/client/public/default/apple-touch-startup-image-1668x2224.png +0 -0
  297. package/src/client/public/default/apple-touch-startup-image-1668x2388.png +0 -0
  298. package/src/client/public/default/apple-touch-startup-image-1792x828.png +0 -0
  299. package/src/client/public/default/apple-touch-startup-image-2048x1536.png +0 -0
  300. package/src/client/public/default/apple-touch-startup-image-2048x2732.png +0 -0
  301. package/src/client/public/default/apple-touch-startup-image-2160x1620.png +0 -0
  302. package/src/client/public/default/apple-touch-startup-image-2160x1640.png +0 -0
  303. package/src/client/public/default/apple-touch-startup-image-2208x1242.png +0 -0
  304. package/src/client/public/default/apple-touch-startup-image-2224x1668.png +0 -0
  305. package/src/client/public/default/apple-touch-startup-image-2266x1488.png +0 -0
  306. package/src/client/public/default/apple-touch-startup-image-2388x1668.png +0 -0
  307. package/src/client/public/default/apple-touch-startup-image-2436x1125.png +0 -0
  308. package/src/client/public/default/apple-touch-startup-image-2532x1170.png +0 -0
  309. package/src/client/public/default/apple-touch-startup-image-2556x1179.png +0 -0
  310. package/src/client/public/default/apple-touch-startup-image-2688x1242.png +0 -0
  311. package/src/client/public/default/apple-touch-startup-image-2732x2048.png +0 -0
  312. package/src/client/public/default/apple-touch-startup-image-2778x1284.png +0 -0
  313. package/src/client/public/default/apple-touch-startup-image-2796x1290.png +0 -0
  314. package/src/client/public/default/apple-touch-startup-image-640x1136.png +0 -0
  315. package/src/client/public/default/apple-touch-startup-image-750x1334.png +0 -0
  316. package/src/client/public/default/apple-touch-startup-image-828x1792.png +0 -0
  317. package/src/client/public/default/assets/background/white.jpg +0 -0
  318. package/src/client/public/default/browserconfig.xml +1 -1
  319. package/src/client/public/default/favicon-16x16.png +0 -0
  320. package/src/client/public/default/favicon-32x32.png +0 -0
  321. package/src/client/public/default/favicon-48x48.png +0 -0
  322. package/src/client/public/default/favicon.ico +0 -0
  323. package/src/client/public/default/manifest.webmanifest +5 -5
  324. package/src/client/public/default/mstile-144x144.png +0 -0
  325. package/src/client/public/default/mstile-150x150.png +0 -0
  326. package/src/client/public/default/mstile-310x150.png +0 -0
  327. package/src/client/public/default/mstile-310x310.png +0 -0
  328. package/src/client/public/default/mstile-70x70.png +0 -0
  329. package/src/client/public/default/yandex-browser-50x50.png +0 -0
  330. package/src/client/public/default/yandex-browser-manifest.json +1 -1
  331. package/src/client/services/cyberia-audio/cyberia-audio.service.js +99 -0
  332. package/src/client/services/cyberia-entity-type-default/cyberia-entity-type-default.service.js +38 -0
  333. package/src/client/services/cyberia-instance/cyberia-instance.management.js +5 -4
  334. package/src/client/services/cyberia-instance/cyberia-instance.service.js +0 -40
  335. package/src/client/services/cyberia-map/cyberia-map.management.js +5 -4
  336. package/src/client/services/cyberia-map-audio-conf/cyberia-map-audio-conf.service.js +138 -0
  337. package/src/client/services/object-layer/object-layer.management.js +6 -10
  338. package/src/client/services/object-layer/object-layer.service.js +3 -1
  339. package/src/client/ssr/RootDocument.js +1 -1
  340. package/src/client/ssr/body/404.js +1 -1
  341. package/src/client/ssr/body/500.js +1 -1
  342. package/src/client/ssr/body/CacheControl.js +1 -1
  343. package/src/client/ssr/body/CyberiaDefaultSplashScreen.js +1 -1
  344. package/src/client/ssr/body/DefaultSplashScreen.js +1 -1
  345. package/src/client/ssr/body/SwaggerDarkMode.js +1 -1
  346. package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +1 -1
  347. package/src/client/ssr/head/CryptokoynScripts.js +1 -1
  348. package/src/client/ssr/head/Css.js +1 -1
  349. package/src/client/ssr/head/CyberiaPortalScripts.js +1 -1
  350. package/src/client/ssr/head/DefaultScripts.js +1 -1
  351. package/src/client/ssr/head/ItemledgerScripts.js +1 -1
  352. package/src/client/ssr/head/Microdata.js +1 -1
  353. package/src/client/ssr/head/Production.js +1 -1
  354. package/src/client/ssr/head/Pwa.js +1 -1
  355. package/src/client/ssr/head/PwaItemledger.js +1 -1
  356. package/src/client/ssr/head/Seo.js +1 -1
  357. package/src/client/ssr/head/UnderpostScripts.js +1 -1
  358. package/src/client/ssr/mailer/DefaultRecoverEmail.js +1 -1
  359. package/src/client/ssr/mailer/DefaultVerifyEmail.js +1 -1
  360. package/src/client/ssr/views/Cyberia404.js +7 -5
  361. package/src/client/ssr/views/CyberiaServerMetrics.js +1 -1
  362. package/src/client/ssr/views/Maintenance.js +1 -1
  363. package/src/client/ssr/views/NoNetworkConnection.js +1 -1
  364. package/src/client/ssr/views/Test.js +1 -1
  365. package/src/client/sw/core.sw.js +20 -14
  366. package/src/client-builder/client-build-docs.js +92 -77
  367. package/src/client-builder/client-build-live.js +2 -2
  368. package/src/client-builder/client-build.js +105 -74
  369. package/src/client-builder/client-bundle.js +347 -0
  370. package/src/client-builder/client-dev-server.js +3 -3
  371. package/src/client-builder/client-icons.js +2 -2
  372. package/src/client-builder/ssr.js +3 -3
  373. package/src/client.build.js +3 -6
  374. package/src/client.dev.js +3 -6
  375. package/src/db/DataBaseProvider.js +186 -3
  376. package/src/db/mariadb/MariaDB.js +3 -2
  377. package/src/db/mongo/MongoBootstrap.js +273 -101
  378. package/src/db/mongo/MongoExpress.js +187 -0
  379. package/src/db/mongo/MongooseDB.js +7 -8
  380. package/src/{server/valkey.js → db/valkey/Valkey.js} +5 -4
  381. package/src/grpc/cyberia/grpc-server.js +6 -8
  382. package/src/index.js +79 -23
  383. package/src/mailer/EmailRender.js +2 -2
  384. package/src/mailer/MailerInterceptor.js +87 -0
  385. package/src/mailer/MailerProvider.js +50 -6
  386. package/src/projects/cyberia/atlas-sprite-sheet-generator.js +144 -147
  387. package/src/projects/cyberia/atlas-sprite-sheet-store.js +391 -0
  388. package/src/projects/cyberia/besu-genesis-generator.js +8 -17
  389. package/src/projects/cyberia/boot-contract-fixtures.js +32 -0
  390. package/src/projects/cyberia/catalog-cyberia.js +54 -10
  391. package/src/projects/cyberia/gemini-client.js +4 -4
  392. package/src/projects/cyberia/generate-saga.js +5 -12
  393. package/src/projects/cyberia/hot-reload-trigger.js +18 -29
  394. package/src/projects/cyberia/instance-backup.js +210 -0
  395. package/src/projects/cyberia/instance-data.js +178 -258
  396. package/src/projects/cyberia/ipfs-client.js +4 -4
  397. package/src/projects/cyberia/map-preview-generator.js +33 -69
  398. package/src/projects/cyberia/object-layer.js +153 -320
  399. package/src/projects/cyberia/seed-audio.js +139 -0
  400. package/src/projects/cyberia/semantic-layer-generator-skin.js +2 -8
  401. package/src/projects/cyberia/semantic-layer-generator.js +3 -19
  402. package/src/projects/cyberia/stat-balance.js +81 -0
  403. package/src/projects/cyberia/stat-commands.js +23 -0
  404. package/src/projects/cyberia/stat-contract-generator.js +101 -0
  405. package/src/projects/underpost/catalog-underpost.js +9 -1
  406. package/src/proxy.js +4 -7
  407. package/src/runtime/cyberia-client/Dockerfile +17 -8
  408. package/src/runtime/cyberia-client/Dockerfile.dev +13 -4
  409. package/src/runtime/cyberia-server/Dockerfile +18 -6
  410. package/src/runtime/cyberia-server/Dockerfile.dev +16 -3
  411. package/src/runtime/engine-cyberia/Dockerfile +25 -9
  412. package/src/runtime/engine-cyberia/Dockerfile.dev +25 -9
  413. package/src/runtime/engine-cyberia/Dockerfile.test +5 -5
  414. package/src/runtime/engine-cyberia/compose.env +17 -5
  415. package/src/runtime/engine-cyberia/docker-compose.yml +23 -17
  416. package/src/runtime/express/Express.js +32 -27
  417. package/src/runtime/lampp/Lampp.js +22 -70
  418. package/src/runtime/nginx/Nginx.js +1 -1
  419. package/src/runtime/wp/Wp.js +16 -48
  420. package/src/server/{catalog.js → build/catalog.js} +15 -5
  421. package/src/server/build/coverage.js +188 -0
  422. package/src/server/build/execution.js +402 -0
  423. package/src/server/build/package.js +508 -0
  424. package/src/server/build/testing.js +578 -0
  425. package/src/server/{dns.js → network/dns.js} +144 -11
  426. package/src/server/{forward-proxy.js → network/forward-proxy.js} +10 -18
  427. package/src/server/{middlewares.js → network/middlewares.js} +11 -5
  428. package/src/server/network/node-capability.js +98 -0
  429. package/src/server/{peer.js → network/peer.js} +3 -3
  430. package/src/server/{proxy.js → network/proxy.js} +7 -13
  431. package/src/server/network/router.js +356 -0
  432. package/src/server/{tls.js → network/tls.js} +2 -2
  433. package/src/server/{underpost-compression.js → network/underpost-compression.js} +1 -1
  434. package/src/server/{underpost-gateway.js → network/underpost-gateway.js} +7 -7
  435. package/src/server/{underpost-ingress.js → network/underpost-ingress.js} +2 -2
  436. package/src/server/{cri.js → ops/cri.js} +2 -2
  437. package/src/server/{cron.js → ops/cron.js} +349 -74
  438. package/src/server/ops/event-notification.js +284 -0
  439. package/src/server/{logger.js → ops/logger.js} +143 -23
  440. package/src/server/ops/monitoring.js +1724 -0
  441. package/src/server/{systemd.js → ops/systemd.js} +55 -1
  442. package/src/server/{conf.js → runtime/conf.js} +516 -423
  443. package/src/server/runtime/config-scope.js +215 -0
  444. package/src/server/runtime/environment.js +149 -0
  445. package/src/server/{process.js → runtime/process.js} +153 -12
  446. package/src/server/{runtime-status.js → runtime/runtime-status.js} +155 -16
  447. package/src/server/{runtime.js → runtime/runtime.js} +12 -8
  448. package/src/server/{start.js → runtime/start.js} +128 -39
  449. package/src/server/{auth.js → security/auth.js} +7 -8
  450. package/src/server/security/container-storage.js +382 -0
  451. package/src/server/{crypto.js → security/crypto.js} +1 -1
  452. package/src/server/{selinux.js → security/selinux.js} +1 -1
  453. package/src/server/{backup.js → storage/backup.js} +17 -8
  454. package/src/server/{data-query.js → storage/data-query.js} +17 -1
  455. package/src/server/storage/downloader.js +121 -0
  456. package/src/server/storage/repository.js +68 -0
  457. package/src/server/storage/zip.js +153 -0
  458. package/src/server.js +4 -7
  459. package/src/ws/IoInterface.js +1 -1
  460. package/src/ws/IoServer.js +1 -1
  461. package/src/ws/core/core.ws.connection.js +1 -1
  462. package/src/ws/core/core.ws.emit.js +1 -1
  463. package/src/ws/core/core.ws.server.js +1 -1
  464. package/src/ws/default/default.ws.connection.js +1 -1
  465. package/src/ws/default/default.ws.emit.js +1 -1
  466. package/src/ws/default/default.ws.server.js +1 -1
  467. package/test/e2e/event-e2e-public-ingress-down.js +45 -0
  468. package/test/e2e/event-e2e-wireguard-server-down.js +38 -0
  469. package/test/e2e/event-e2e-wireguard-spoke-down.js +40 -0
  470. package/test/{api.test.js → integration/app/api.test.js} +33 -14
  471. package/test/integration/app/cyberia/atlas-sprite-sheet-store.test.js +402 -0
  472. package/test/integration/app/cyberia/atlas-sprite-sheet.test.js +86 -0
  473. package/test/integration/app/cyberia/cyberia-cli-plain-reads.test.js +64 -0
  474. package/test/integration/app/cyberia/cyberia-entity-type-default.test.js +842 -0
  475. package/test/integration/app/cyberia/cyberia-instance-conf-coerce.test.js +53 -0
  476. package/test/{cyberia-instance-conf-defaults.test.js → integration/app/cyberia/cyberia-instance-conf-defaults.test.js} +17 -23
  477. package/test/integration/app/cyberia/cyberia-instance-items.test.js +90 -0
  478. package/test/integration/app/cyberia/cyberia-load.test.js +466 -0
  479. package/test/integration/app/cyberia/cyberia-map-audio-conf.test.js +256 -0
  480. package/test/integration/app/cyberia/cyberia-stats.test.js +150 -0
  481. package/test/integration/app/cyberia/fallback-world-capture.test.js +338 -0
  482. package/test/integration/app/cyberia/object-layer-item-id.test.js +327 -0
  483. package/test/integration/app/cyberia/object-layer-item-selection.test.js +56 -0
  484. package/test/integration/app/cyberia/object-layer-natural-key.test.js +32 -0
  485. package/test/integration/app/cyberia/seed-audio.test.js +275 -0
  486. package/test/{shape-generator.test.js → integration/app/cyberia/shape-generator.test.js} +1 -1
  487. package/test/integration/infra/1-security/config-scope.test.js +305 -0
  488. package/test/integration/infra/1-security/container-storage.test.js +356 -0
  489. package/test/integration/infra/1-security/in-pod-cli-surface.test.js +86 -0
  490. package/test/integration/infra/1-security/secret-onboarding.test.js +930 -0
  491. package/test/{selinux.test.js → integration/infra/1-security/selinux.test.js} +2 -4
  492. package/test/{sops-secret-store.test.js → integration/infra/1-security/sops-secret-store.test.js} +415 -61
  493. package/test/integration/infra/1-security/systemd-service.test.js +70 -0
  494. package/test/integration/infra/1-security/underpost-config-secret.test.js +367 -0
  495. package/test/integration/infra/2-network/dns-firewall.test.js +566 -0
  496. package/test/integration/infra/2-network/node-capability.test.js +182 -0
  497. package/test/integration/infra/2-network/wireguard-cli.test.js +1187 -0
  498. package/test/{wireguard-edge.test.js → integration/infra/2-network/wireguard-edge.test.js} +649 -55
  499. package/test/{cluster-instances.test.js → integration/infra/3-cluster/cluster-instances.test.js} +11 -15
  500. package/test/{deploy-node-placement.test.js → integration/infra/3-cluster/deploy-node-placement.test.js} +3 -3
  501. package/test/integration/infra/3-cluster/docker-compose-stack.test.js +313 -0
  502. package/test/integration/infra/3-cluster/mongo-express-deploy.test.js +156 -0
  503. package/test/integration/infra/4-ingress/api-cross-origin.test.js +79 -0
  504. package/test/integration/infra/4-ingress/deploy-routes.test.js +379 -0
  505. package/test/integration/infra/4-ingress/gateway-static-assets.test.js +453 -0
  506. package/test/{instance-traffic-plan.test.js → integration/infra/4-ingress/instance-traffic-plan.test.js} +10 -6
  507. package/test/{underpost-gateway.test.js → integration/infra/4-ingress/underpost-gateway.test.js} +6 -6
  508. package/test/{underpost-ingress.test.js → integration/infra/4-ingress/underpost-ingress.test.js} +4 -4
  509. package/test/integration/infra/5-observability/cron-jobs.test.js +652 -0
  510. package/test/{deploy-monitor.test.js → integration/infra/5-observability/deploy-monitor.test.js} +29 -31
  511. package/test/integration/infra/5-observability/event-notification.test.js +197 -0
  512. package/test/integration/infra/5-observability/event-remediation.test.js +502 -0
  513. package/test/integration/infra/5-observability/event-targets.test.js +1174 -0
  514. package/test/integration/infra/5-observability/monitoring-stack.test.js +902 -0
  515. package/test/support/shell-harness.js +73 -0
  516. package/test/unit/build-template.test.js +97 -0
  517. package/test/unit/build-workflow-offline.test.js +132 -0
  518. package/test/unit/catalog.test.js +71 -0
  519. package/test/unit/client-build-docs.test.js +361 -0
  520. package/test/unit/client-bundle.test.js +313 -0
  521. package/test/unit/conf-loading.test.js +303 -0
  522. package/test/unit/conf-resolution.test.js +996 -0
  523. package/test/unit/coverage-artifact.test.js +221 -0
  524. package/test/{crypto.test.js → unit/crypto.test.js} +1 -1
  525. package/test/unit/cyberia/instance-backup.test.js +183 -0
  526. package/test/unit/cyberia/instance-object-layer-items.test.js +46 -0
  527. package/test/unit/cyberia/publish-workflow.test.js +22 -0
  528. package/test/unit/cyberia/stat-balance.test.js +69 -0
  529. package/test/unit/deploy-env-resolution.test.js +38 -0
  530. package/test/unit/deploy-log-table.test.js +518 -0
  531. package/test/unit/downloader-integrity.test.js +98 -0
  532. package/test/unit/execution-profiles.test.js +219 -0
  533. package/test/unit/file-reference-registry.test.js +141 -0
  534. package/test/unit/fleet-sync-source.test.js +149 -0
  535. package/test/unit/fs-storage-paths.test.js +596 -0
  536. package/test/unit/logger-redaction.test.js +141 -0
  537. package/test/unit/package.test.js +457 -0
  538. package/test/unit/prepare-host.test.js +382 -0
  539. package/test/unit/process-environment.test.js +18 -0
  540. package/test/unit/propagation-message.test.js +78 -0
  541. package/test/unit/redeploy-plan.test.js +24 -0
  542. package/test/unit/release-bump.test.js +474 -0
  543. package/test/unit/ssh-output-redaction.test.js +28 -0
  544. package/test/unit/start-options.test.js +46 -0
  545. package/test/unit/test-tiers.test.js +220 -0
  546. package/test/unit/zip-archive.test.js +142 -0
  547. package/vitest.config.js +66 -0
  548. package/.nycrc +0 -9
  549. package/deploy/lib/logging.sh +0 -96
  550. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +0 -48
  551. package/manifests/mongodb/pv-pvc.yaml +0 -59
  552. package/scripts/coverall-test-cyberia.sh +0 -24
  553. package/scripts/coverall-test.sh +0 -24
  554. package/scripts/link-local-underpost-cli.sh +0 -6
  555. package/src/api/cyberia-instance/cyberia-fallback-default-items.js +0 -63
  556. package/src/api/user/user.build.js +0 -16
  557. package/src/cli/env.js +0 -177
  558. package/src/client/components/core/Blockchain.js +0 -41
  559. package/src/client/components/core/Blog.js +0 -9
  560. package/src/client/components/core/KeyboardAvoidance.js +0 -145
  561. package/src/client/components/cyberia/FallbackWorldEngineCyberia.js +0 -368
  562. package/src/client/public/default/assets/background/dark.jpg +0 -0
  563. package/src/client/public/default/assets/background/white0-min.jpg +0 -0
  564. package/src/client/public/default/assets/background/white0.jpg +0 -0
  565. package/src/client/public/doc/favicon.ico +0 -0
  566. package/src/client/public/doc/sitemap +0 -148
  567. package/src/server/downloader.js +0 -73
  568. package/src/server/environment.js +0 -98
package/.dockerignore CHANGED
@@ -6,6 +6,7 @@
6
6
  /logs
7
7
  /build
8
8
  /.env
9
+ /.underpost
9
10
  /coverage
10
11
  /prometheus_data
11
12
  /grafana_data
package/.env.example CHANGED
@@ -43,25 +43,37 @@ VALKEY_PORT=6379
43
43
  # cyberia-server-* -> stable engine gateway for HTTP and the raw engine runtime
44
44
  # for gRPC. The public engine-cyberia name belongs to nginx, avoiding ambiguous
45
45
  # Docker DNS while keeping one stable HTTP endpoint for every module.
46
- ENGINE_API_BASE_URL=http://engine-cyberia
47
- ENGINE_GRPC_ADDRESS=engine-cyberia-runtime:50051
46
+ CYBERIA_DATA_SERVER_URL=http://engine-cyberia
47
+ CYBERIA_DATA_SERVER_GRPC=engine-cyberia-runtime:50051
48
48
 
49
49
  # Client-visible Content Authority origin, forwarded to browser/Raylib clients
50
50
  # for every engine-cyberia content/asset/metadata request. Host-reachable
51
51
  # (Docker publishes the raw engine runtime on host :4005). Unlike the internal
52
- # ENGINE_API_BASE_URL, this value is consumed outside the Compose network:
52
+ # CYBERIA_DATA_SERVER_URL, this value is consumed outside the Compose network:
53
53
  # the two responsibilities must never overwrite each other.
54
54
  ENGINE_PUBLIC_URL=http://localhost:4005
55
55
  ENGINE_GRPC_RELOAD_INTERVAL_SEC=300
56
56
 
57
- # --- Browser-facing client runtime config (injected by docker-driver.py) -----
57
+ # Shared secret between the engine and every game server. It guards the server
58
+ # registry report (server -> engine) and the hot-reload trigger (engine ->
59
+ # server). Unset disables both: a server then stays out of the public list.
60
+ CYBERIA_SERVER_API_KEY=change_me_dev_server_api_key
61
+
62
+ # Public origin of the server gateway. Each server reports this origin plus its
63
+ # own sub-path, which is the URL a client dials.
64
+ CYBERIA_SERVER_PUBLIC_ORIGIN=http://localhost:8081
65
+
66
+ # --- Browser-facing client runtime config (injected by wasm-driver.py) -----
58
67
  # The single WASM bundle resolves its instance from the URL sub-path and builds
59
68
  # its endpoints from these origins. HTTP client/API traffic uses nginx on :80;
60
69
  # WebSocket traffic uses the dedicated multi-path server gateway on :8081.
61
70
  # http://localhost/ -> default, ws://localhost:8081/ws
62
71
  # http://localhost/FOREST -> FOREST, ws://localhost:8081/FOREST/ws
63
72
  CYBERIA_WS_ORIGIN=ws://localhost:8081
64
- CYBERIA_ENGINE_API_ORIGIN=http://localhost
73
+ # The browser's own route to the Data Server, through nginx on :80. Distinct from the internal
74
+ # CYBERIA_DATA_SERVER_URL above: both name a Data Server origin, but from opposite sides of the
75
+ # Compose network, and one file cannot hold two values under one name.
76
+ CYBERIA_CLIENT_DATA_SERVER_URL=http://localhost
65
77
  CYBERIA_DEFAULT_INSTANCE=amethyst-strata-expansion
66
78
 
67
79
  # cyberia-server logging. This is the dev stack, so default to DEBUG. Set
@@ -9,11 +9,14 @@ on:
9
9
  jobs:
10
10
  test:
11
11
  name: Coverall Cyberia Test
12
+ # Deliberately not the engine repository: two coverage workflows on one commit
13
+ # are two Coveralls builds, and the badge then shows whichever landed last
14
+ # rather than the tree's coverage. The engine is served by coverall.ci.yml.
12
15
  if: |
13
16
  github.actor != 'dependabot[bot]' &&
14
- (github.repository == 'underpostnet/engine' ||
15
- github.repository == 'underpostnet/engine-cyberia' ||
16
- github.repository == 'underpostnet/engine-ghpkg-cyberia')
17
+ (github.repository == 'underpostnet/engine-cyberia' ||
18
+ github.repository == 'underpostnet/engine-ghpkg-cyberia' ||
19
+ github.repository == 'underpostnet/engine-test-cyberia')
17
20
  runs-on: ubuntu-latest
18
21
  container:
19
22
  image: quay.io/rockylinux/rockylinux:9
@@ -31,14 +34,26 @@ jobs:
31
34
  curl -fsSL https://rpm.nodesource.com/setup_24.x | bash -
32
35
  dnf install nodejs -y
33
36
 
37
+ # gofmt formats the generated stat contract; the cyberia tier's contract
38
+ # check fails without it on PATH.
39
+ - name: Install Go
40
+ run: dnf install -y golang
41
+
34
42
  - name: Install project dependencies
35
43
  run: npm install
36
44
 
37
- - name: Run tests and generate coverage
38
- run: scripts/coverall-test-cyberia.sh
45
+ # Set the COVERAGE_MIN repository variable to gate below the shipped
46
+ # default while the suite is catching up to it.
47
+ - name: Run tests and enforce coverage threshold
48
+ run: COVERAGE_ENFORCE=1 node bin test unit,infra,app,cyberia
49
+ env:
50
+ COVERAGE_MIN: ${{ vars.COVERAGE_MIN }}
39
51
 
52
+ # Stored even when the threshold step failed — that step still fails the
53
+ # job, but without the report the badge freezes at the last passing build.
40
54
  - name: Store coverage report
41
- uses: actions/upload-artifact@v4
55
+ if: '!cancelled()'
56
+ uses: actions/upload-artifact@v7
42
57
  with:
43
58
  name: coverall-cyberia-lcov
44
59
  path: ./coverage/lcov.info
@@ -47,18 +62,23 @@ jobs:
47
62
  upload:
48
63
  name: Upload Cyberia Coverage to Coveralls
49
64
  needs: test
65
+ # Host runner, not the Rocky container the suite runs in: every step of the
66
+ # Coveralls action declares `shell: bash`, which the runner execs inside the
67
+ # job container and cannot resolve there.
50
68
  if: |
69
+ !cancelled() &&
51
70
  github.actor != 'dependabot[bot]' &&
52
- (github.repository == 'underpostnet/engine' ||
53
- github.repository == 'underpostnet/engine-cyberia' ||
54
- github.repository == 'underpostnet/engine-ghpkg-cyberia')
71
+ (github.repository == 'underpostnet/engine-cyberia' ||
72
+ github.repository == 'underpostnet/engine-ghpkg-cyberia' ||
73
+ github.repository == 'underpostnet/engine-test-cyberia')
55
74
  runs-on: ubuntu-latest
56
75
  steps:
76
+ # Coveralls reads the commit and branch metadata from the checkout.
57
77
  - name: Clone repository
58
78
  uses: actions/checkout@v7
59
79
 
60
80
  - name: Restore coverage report
61
- uses: actions/download-artifact@v4
81
+ uses: actions/download-artifact@v8
62
82
  with:
63
83
  name: coverall-cyberia-lcov
64
84
  path: ./coverage
@@ -68,16 +88,21 @@ jobs:
68
88
  with:
69
89
  github-token: ${{ secrets.GITHUB_TOKEN }}
70
90
  file: ./coverage/lcov.info
71
- flag-name: cyberia
91
+ format: lcov
72
92
  parallel: true
93
+ fail-on-error: true
73
94
 
74
95
  finish:
96
+ name: Finish Cyberia Coveralls build
75
97
  needs: upload
98
+ # The build stays open until this webhook lands, so it runs on any upload
99
+ # outcome rather than leaving a half-reported build behind.
76
100
  if: |
101
+ !cancelled() &&
77
102
  github.actor != 'dependabot[bot]' &&
78
- (github.repository == 'underpostnet/engine' ||
79
- github.repository == 'underpostnet/engine-cyberia' ||
80
- github.repository == 'underpostnet/engine-ghpkg-cyberia')
103
+ (github.repository == 'underpostnet/engine-cyberia' ||
104
+ github.repository == 'underpostnet/engine-ghpkg-cyberia' ||
105
+ github.repository == 'underpostnet/engine-test-cyberia')
81
106
  runs-on: ubuntu-latest
82
107
  steps:
83
108
  - name: Notify Coveralls Finished
@@ -32,4 +32,9 @@ jobs:
32
32
  script: |
33
33
  set -e
34
34
  set -o pipefail
35
+ # Carried across the SSH hop so the far side reports in GitHub Actions form:
36
+ # deploy/lib/github-actions-logging.sh folds its monitor frames into collapsed groups, and the
37
+ # state domain's telemetry export emits ::notice::/::error:: annotations this job
38
+ # surfaces. GITHUB_ACTIONS itself is a runner-local variable and does not travel.
39
+ export RUN_QUIET_CI=github
35
40
  bash /home/dd/engine/deploy/cyberia-client/deploy.sh
@@ -32,4 +32,9 @@ jobs:
32
32
  script: |
33
33
  set -e
34
34
  set -o pipefail
35
+ # Carried across the SSH hop so the far side reports in GitHub Actions form:
36
+ # deploy/lib/github-actions-logging.sh folds its monitor frames into collapsed groups, and the
37
+ # state domain's telemetry export emits ::notice::/::error:: annotations this job
38
+ # surfaces. GITHUB_ACTIONS itself is a runner-local variable and does not travel.
39
+ export RUN_QUIET_CI=github
35
40
  bash /home/dd/engine/deploy/cyberia-server/deploy.sh
@@ -4,7 +4,7 @@ on:
4
4
  workflow_dispatch:
5
5
 
6
6
  env:
7
- UNDERPOST_VERSION: '3.3.0'
7
+ UNDERPOST_VERSION: '3.3.76'
8
8
 
9
9
  jobs:
10
10
  build-and-push:
@@ -34,9 +34,15 @@ jobs:
34
34
  - name: Build cyberia-server SSR dashboard
35
35
  working-directory: engine
36
36
  run: |
37
- node bin/deploy cyberia
37
+ node bin package dd-cyberia --install
38
38
  node bin/cyberia run-workflow build-cyberia-404 --output-path ../assets/404/index.html
39
39
 
40
+ - name: Stage underpost CLI package
41
+ working-directory: engine
42
+ # Bakes the CLI into the runtime image from this checkout instead of the registry, so a
43
+ # starting pod never fetches it. The Dockerfiles COPY ../underpost-cli.tgz.
44
+ run: node bin/cyberia run-workflow stage-cli --output-path ..
45
+
40
46
  - name: Set up Docker Buildx
41
47
  uses: docker/setup-buildx-action@v4
42
48
 
@@ -65,7 +71,4 @@ jobs:
65
71
  push: true
66
72
  tags: ${{ steps.meta.outputs.tags }}
67
73
  labels: ${{ steps.meta.outputs.labels }}
68
-
69
- build-args: |
70
- UNDERPOST_VERSION=${{ env.UNDERPOST_VERSION }}
71
74
  BUILD_MODE=RELEASE
@@ -4,7 +4,7 @@ on:
4
4
  workflow_dispatch:
5
5
 
6
6
  env:
7
- UNDERPOST_VERSION: '3.3.0'
7
+ UNDERPOST_VERSION: '3.3.76'
8
8
 
9
9
  jobs:
10
10
  build-and-push:
@@ -34,9 +34,15 @@ jobs:
34
34
  - name: Build cyberia-server SSR dashboard
35
35
  working-directory: engine
36
36
  run: |
37
- node bin/deploy cyberia
37
+ node bin package dd-cyberia --install
38
38
  node bin/cyberia run-workflow build-cyberia-404 --output-path ../assets/404/index.html
39
39
 
40
+ - name: Stage underpost CLI package
41
+ working-directory: engine
42
+ # Bakes the CLI into the runtime image from this checkout instead of the registry, so a
43
+ # starting pod never fetches it. The Dockerfiles COPY ../underpost-cli.tgz.
44
+ run: node bin/cyberia run-workflow stage-cli --output-path ..
45
+
40
46
  - name: Set up Docker Buildx
41
47
  uses: docker/setup-buildx-action@v4
42
48
 
@@ -66,5 +72,4 @@ jobs:
66
72
  tags: ${{ steps.meta.outputs.tags }}
67
73
  labels: ${{ steps.meta.outputs.labels }}
68
74
  build-args: |
69
- UNDERPOST_VERSION=${{ env.UNDERPOST_VERSION }}
70
75
  BUILD_MODE=DEBUG
@@ -4,7 +4,7 @@ on:
4
4
  workflow_dispatch:
5
5
 
6
6
  env:
7
- UNDERPOST_VERSION: '3.3.0'
7
+ UNDERPOST_VERSION: '3.3.76'
8
8
 
9
9
  jobs:
10
10
  build-and-push:
@@ -34,10 +34,16 @@ jobs:
34
34
  - name: Build cyberia-server SSR dashboard
35
35
  working-directory: engine
36
36
  run: |
37
- node bin/deploy cyberia
37
+ node bin package dd-cyberia --install
38
38
  node bin/cyberia run-workflow build-server-dashboard --output-path ../public/index.html
39
39
  node bin/cyberia run-workflow build-cyberia-404 --output-path ../public/404/index.html
40
40
 
41
+ - name: Stage underpost CLI package
42
+ working-directory: engine
43
+ # Bakes the CLI into the runtime image from this checkout instead of the registry, so a
44
+ # starting pod never fetches it. The Dockerfiles COPY ../underpost-cli.tgz.
45
+ run: node bin/cyberia run-workflow stage-cli --output-path ..
46
+
41
47
  - name: Set up Docker Buildx
42
48
  uses: docker/setup-buildx-action@v4
43
49
 
@@ -66,6 +72,3 @@ jobs:
66
72
  push: true
67
73
  tags: ${{ steps.meta.outputs.tags }}
68
74
  labels: ${{ steps.meta.outputs.labels }}
69
-
70
- build-args: |
71
- UNDERPOST_VERSION=${{ env.UNDERPOST_VERSION }}
@@ -4,7 +4,7 @@ on:
4
4
  workflow_dispatch:
5
5
 
6
6
  env:
7
- UNDERPOST_VERSION: '3.3.0'
7
+ UNDERPOST_VERSION: '3.3.76'
8
8
 
9
9
  jobs:
10
10
  build-and-push:
@@ -34,10 +34,16 @@ jobs:
34
34
  - name: Build cyberia-server SSR dashboard (dev)
35
35
  working-directory: engine
36
36
  run: |
37
- node bin/deploy cyberia
37
+ node bin package dd-cyberia --install
38
38
  node bin/cyberia run-workflow build-server-dashboard --dev --output-path ../public/index.html
39
39
  node bin/cyberia run-workflow build-cyberia-404 --output-path ../public/404/index.html
40
40
 
41
+ - name: Stage underpost CLI package
42
+ working-directory: engine
43
+ # Bakes the CLI into the runtime image from this checkout instead of the registry, so a
44
+ # starting pod never fetches it. The Dockerfiles COPY ../underpost-cli.tgz.
45
+ run: node bin/cyberia run-workflow stage-cli --output-path ..
46
+
41
47
  - name: Set up Docker Buildx
42
48
  uses: docker/setup-buildx-action@v4
43
49
 
@@ -66,6 +72,3 @@ jobs:
66
72
  push: true
67
73
  tags: ${{ steps.meta.outputs.tags }}
68
74
  labels: ${{ steps.meta.outputs.labels }}
69
-
70
- build-args: |
71
- UNDERPOST_VERSION=${{ env.UNDERPOST_VERSION }}
@@ -4,7 +4,7 @@ on:
4
4
  workflow_dispatch:
5
5
 
6
6
  env:
7
- UNDERPOST_VERSION: '3.3.0'
7
+ UNDERPOST_VERSION: '3.3.76'
8
8
 
9
9
  jobs:
10
10
  build-and-push:
@@ -16,6 +16,20 @@ jobs:
16
16
  steps:
17
17
  - uses: actions/checkout@v7
18
18
 
19
+ - name: Setup Node.js
20
+ uses: actions/setup-node@v7
21
+ with:
22
+ node-version: '24.x'
23
+
24
+ - name: Install engine dependencies
25
+ run: npm ci --ignore-scripts
26
+
27
+ - name: Stage underpost CLI package
28
+ # Bakes the CLI into the image from this checkout instead of the registry, so a starting
29
+ # pod never fetches it. The Dockerfiles COPY underpost-cli.tgz from the build context,
30
+ # which for this workflow is the repository root.
31
+ run: node bin/cyberia run-workflow stage-cli --output-path .
32
+
19
33
  - name: Set up Docker Buildx
20
34
  uses: docker/setup-buildx-action@v4
21
35
 
@@ -4,7 +4,7 @@ on:
4
4
  workflow_dispatch:
5
5
 
6
6
  env:
7
- UNDERPOST_VERSION: '3.3.0'
7
+ UNDERPOST_VERSION: '3.3.76'
8
8
 
9
9
  jobs:
10
10
  build-and-push:
@@ -16,6 +16,20 @@ jobs:
16
16
  steps:
17
17
  - uses: actions/checkout@v7
18
18
 
19
+ - name: Setup Node.js
20
+ uses: actions/setup-node@v7
21
+ with:
22
+ node-version: '24.x'
23
+
24
+ - name: Install engine dependencies
25
+ run: npm ci --ignore-scripts
26
+
27
+ - name: Stage underpost CLI package
28
+ # Bakes the CLI into the image from this checkout instead of the registry, so a starting
29
+ # pod never fetches it. The Dockerfiles COPY underpost-cli.tgz from the build context,
30
+ # which for this workflow is the repository root.
31
+ run: node bin/cyberia run-workflow stage-cli --output-path .
32
+
19
33
  - name: Set up Docker Buildx
20
34
  uses: docker/setup-buildx-action@v4
21
35
 
@@ -40,6 +40,7 @@ jobs:
40
40
  script: |
41
41
  set -e
42
42
  set -o pipefail
43
+ export RUN_QUIET_CI=github
43
44
  bash /home/dd/engine/deploy/dd-cyberia/deploy.sh
44
45
  sync-and-deploy:
45
46
  if: github.event.inputs.job == 'sync-and-deploy'
@@ -65,6 +66,7 @@ jobs:
65
66
  script: |
66
67
  set -e
67
68
  set -o pipefail
69
+ export RUN_QUIET_CI=github
68
70
  bash /home/dd/engine/deploy/dd-cyberia/sync-deploy.sh
69
71
  init:
70
72
  if: github.event.inputs.job == 'init'
@@ -90,4 +92,5 @@ jobs:
90
92
  script: |
91
93
  set -e
92
94
  set -o pipefail
95
+ export RUN_QUIET_CI=github
93
96
  bash /home/dd/engine/deploy/dd-cyberia/init.sh
@@ -62,13 +62,12 @@ jobs:
62
62
  env:
63
63
  GITHUB_TOKEN: ${{ secrets.GIT_AUTH_TOKEN }}
64
64
  GITHUB_USERNAME: ${{ github.repository_owner }}
65
+ # Never interpolated into the script: the propagated payload is multi-line and a shell
66
+ # expansion would corrupt entries holding `$` and execute anything in `$(...)`.
67
+ PROPAGATED_MESSAGE: ${{ github.event.inputs.message }}
65
68
  run: |
66
69
  cd .. && node engine/bin clone underpostnet/pwa-microservices-template
67
- if [ -n "${{ github.event.inputs.message }}" ]; then
68
- LAST_COMMIT_MESSAGE="${{ github.event.inputs.message }}"
69
- else
70
- LAST_COMMIT_MESSAGE=$(cd engine && node bin cmt --changelog-msg --from-n-commit 1 --changelog-no-hash 2>/dev/null || echo "")
71
- fi
70
+ LAST_COMMIT_MESSAGE=$(cd engine && node bin cmt --propagate-msg 2>/dev/null || echo "")
72
71
  SHOULD_CD="${{ github.event.inputs.sync }}"
73
72
  DEPLOY_TYPE="${{ github.event.inputs.deploy_type }}"
74
73
  if [ -z "$LAST_COMMIT_MESSAGE" ]; then
@@ -48,20 +48,30 @@ jobs:
48
48
  curl -fsSL https://rpm.nodesource.com/setup_24.x | bash -
49
49
  dnf install nodejs -y
50
50
 
51
- - name: Capture commit message
52
- run: |
53
- FULL_MSG="${{ github.event.head_commit.message }}"
54
- LAST_COMMIT_MESSAGE="${FULL_MSG:-update package}"
55
- echo "LAST_COMMIT_MESSAGE<<EOF" >> $GITHUB_ENV
56
- echo "$LAST_COMMIT_MESSAGE" >> $GITHUB_ENV
57
- echo "EOF" >> $GITHUB_ENV
58
- echo "[INFO] Commit message: $LAST_COMMIT_MESSAGE"
59
-
60
51
  - name: Install dependencies and set repo configuration
61
52
  run: |
62
53
  npm install
63
- node ./bin/deploy rename-package @underpostnet/underpost
64
- node ./bin/deploy set-repo underpostnet/pwa-microservices-template-ghpkg
54
+ node ./bin package --rename @underpostnet/underpost
55
+ node ./bin package --set-repo underpostnet/pwa-microservices-template-ghpkg
56
+
57
+ # Placed after the install because it resolves the payload through the CLI, which needs the
58
+ # dependencies. The push that triggers this job carries the payload the engine propagated.
59
+ - name: Capture commit message
60
+ env:
61
+ # Never interpolated into the script: the propagated payload is multi-line and a shell
62
+ # expansion would corrupt entries holding `$` and execute anything in `$(...)`.
63
+ PROPAGATED_MESSAGE: ${{ github.event.head_commit.message }}
64
+ run: |
65
+ LAST_COMMIT_MESSAGE=$(node ./bin cmt --propagate-msg 2>/dev/null || echo "")
66
+ if [ -z "$LAST_COMMIT_MESSAGE" ]; then
67
+ LAST_COMMIT_MESSAGE="update package"
68
+ fi
69
+ {
70
+ echo "LAST_COMMIT_MESSAGE<<PROPAGATION_EOF"
71
+ echo "$LAST_COMMIT_MESSAGE"
72
+ echo "PROPAGATION_EOF"
73
+ } >> $GITHUB_ENV
74
+ echo "[INFO] Commit message: $LAST_COMMIT_MESSAGE"
65
75
 
66
76
  - name: Set git global credentials
67
77
  run: |
@@ -124,15 +134,20 @@ jobs:
124
134
  echo "[INFO] Canonical github package repo: underpostnet/engine-ghpkg-$CONF_ID"
125
135
 
126
136
  - name: Capture commit message
137
+ env:
138
+ # Never interpolated into the script: the propagated payload is multi-line and a shell
139
+ # expansion would corrupt entries holding `$` and execute anything in `$(...)`.
140
+ PROPAGATED_MESSAGE: ${{ github.event.inputs.message }}
127
141
  run: |
128
- FULL_MSG="${{ github.event.inputs.message }}"
129
- if [ -z "$FULL_MSG" ]; then
130
- FULL_MSG=$(node bin cmt --changelog-msg --from-n-commit 1 --changelog-no-hash 2>/dev/null || echo "")
142
+ LAST_COMMIT_MESSAGE=$(node bin cmt --propagate-msg 2>/dev/null || echo "")
143
+ if [ -z "$LAST_COMMIT_MESSAGE" ]; then
144
+ LAST_COMMIT_MESSAGE="Update canonical github package repo"
131
145
  fi
132
- LAST_COMMIT_MESSAGE="${FULL_MSG:-Update canonical github package repo}"
133
- echo "LAST_COMMIT_MESSAGE<<EOF" >> $GITHUB_ENV
134
- echo "$LAST_COMMIT_MESSAGE" >> $GITHUB_ENV
135
- echo "EOF" >> $GITHUB_ENV
146
+ {
147
+ echo "LAST_COMMIT_MESSAGE<<PROPAGATION_EOF"
148
+ echo "$LAST_COMMIT_MESSAGE"
149
+ echo "PROPAGATION_EOF"
150
+ } >> $GITHUB_ENV
136
151
  echo "[INFO] Commit message: $LAST_COMMIT_MESSAGE"
137
152
 
138
153
  - name: Set git global credentials
@@ -152,8 +167,8 @@ jobs:
152
167
  cd engine-$CONF_ID
153
168
  rm -rf ./.git
154
169
  mv ../$GHPKG_REPO.git ./.git
155
- node ../engine/bin/deploy rename-package "$PACKAGE_NAME"
156
- node ../engine/bin/deploy set-repo underpostnet/$GHPKG_REPO
170
+ node ../engine/bin package --rename "$PACKAGE_NAME"
171
+ node ../engine/bin package --set-repo underpostnet/$GHPKG_REPO
157
172
  git init
158
173
  git config user.name 'underpostnet'
159
174
  git config user.email 'development@underpost.net'
@@ -5,13 +5,10 @@ name: CI | Hardhat
5
5
 
6
6
  on:
7
7
  push:
8
- paths:
9
- - 'hardhat/**'
10
- - '.github/workflows/hardhat.ci.yml'
8
+ branches: ['master', 'main']
11
9
  pull_request:
12
- paths:
13
- - 'hardhat/**'
14
- - '.github/workflows/hardhat.ci.yml'
10
+ branches: ['master', 'main']
11
+
15
12
  workflow_dispatch:
16
13
 
17
14
  permissions:
@@ -20,6 +17,11 @@ permissions:
20
17
  jobs:
21
18
  build-and-test:
22
19
  name: Compile, Test & Audit
20
+ if: |
21
+ github.actor != 'dependabot[bot]' &&
22
+ (github.repository == 'underpostnet/engine-cyberia' ||
23
+ github.repository == 'underpostnet/engine-ghpkg-cyberia' ||
24
+ github.repository == 'underpostnet/engine-test-cyberia')
23
25
  runs-on: ubuntu-latest
24
26
  defaults:
25
27
  run:
@@ -59,18 +61,17 @@ jobs:
59
61
 
60
62
  # ── Compile ──────────────────────────────────────────────────────────
61
63
  - name: Compile Solidity contracts
62
- run: npx hardhat compile
64
+ run: npm run compile
63
65
 
64
66
  # ── Test ─────────────────────────────────────────────────────────────
65
67
  - name: Run tests
66
- run: npx hardhat test
68
+ run: npm test
67
69
  env:
68
70
  REPORT_GAS: 'true'
69
71
 
70
- # ── Coverage (optional, only on primary Node version) ────────────────
72
+ # ── Coverage ─────────────────────────────────────────────────────────
71
73
  - name: Solidity coverage
72
- if: matrix.node-version == '20'
73
- run: npx hardhat coverage
74
+ run: npm run coverage
74
75
 
75
76
  # ── Lockfile integrity check ─────────────────────────────────────────
76
77
  # Fail if package-lock.json is out of sync with package.json
@@ -51,26 +51,28 @@ jobs:
51
51
  curl -fsSL https://rpm.nodesource.com/setup_24.x | bash -
52
52
  dnf install nodejs -y
53
53
 
54
+ - name: Install dependencies
55
+ run: npm install
56
+
57
+ # Placed after the install because it resolves the payload through the CLI, which needs the
58
+ # dependencies. The dispatch input wins; a push carries its own commit message instead.
54
59
  - name: Capture commit message
60
+ env:
61
+ # Never interpolated into the script: the propagated payload is multi-line and a shell
62
+ # expansion would corrupt entries holding `$` and execute anything in `$(...)`.
63
+ PROPAGATED_MESSAGE: ${{ github.event.inputs.message || github.event.head_commit.message }}
55
64
  run: |
56
- if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
57
- LAST_COMMIT_MESSAGE="${{ github.event.inputs.message }}"
58
- if [ -z "$LAST_COMMIT_MESSAGE" ]; then
59
- LAST_COMMIT_MESSAGE="Update repository"
60
- fi
61
- else
62
- FULL_MSG="${{ github.event.head_commit.message }}"
63
- REST="$(echo "$FULL_MSG" | tail -n +2 | awk 'NR==1{first=$0; has_first=1; next} NR==2{print first " " $0; has_first=0; next} {print} END{if(has_first) print first}')"
64
- LAST_COMMIT_MESSAGE="${REST:-$FULL_MSG}"
65
+ LAST_COMMIT_MESSAGE=$(node bin cmt --propagate-msg 2>/dev/null || echo "")
66
+ if [ -z "$LAST_COMMIT_MESSAGE" ]; then
67
+ LAST_COMMIT_MESSAGE="Update repository"
65
68
  fi
66
- echo "LAST_COMMIT_MESSAGE<<EOF" >> $GITHUB_ENV
67
- echo "$LAST_COMMIT_MESSAGE" >> $GITHUB_ENV
68
- echo "EOF" >> $GITHUB_ENV
69
+ {
70
+ echo "LAST_COMMIT_MESSAGE<<PROPAGATION_EOF"
71
+ echo "$LAST_COMMIT_MESSAGE"
72
+ echo "PROPAGATION_EOF"
73
+ } >> $GITHUB_ENV
69
74
  echo "[INFO] Extracted payload: $LAST_COMMIT_MESSAGE"
70
75
 
71
- - name: Install dependencies
72
- run: npm install
73
-
74
76
  - name: Set git global credentials
75
77
  run: |
76
78
  git config --global --add safe.directory '*'
@@ -32,6 +32,28 @@ jobs:
32
32
  - name: Install Dependencies
33
33
  run: npm ci
34
34
 
35
+ # The repository declares the engine's runtime dependencies because it runs the engine
36
+ # source it ships; a registry consumer gets them through `underpost` instead. This restores
37
+ # the manifest the package published before that split, and only in the tarball — after
38
+ # `npm ci`, so the lockfile the checkout installs from is the repository's own.
39
+ - name: Restore the published dependency set
40
+ run: |
41
+ node --input-type=module -e '
42
+ import fs from "node:fs";
43
+ import { publishedProductPackageJson, DEPLOY_MANIFEST_INDENT } from "./src/server/build/package.js";
44
+ import { loadDeployCatalog } from "./src/server/build/catalog.js";
45
+ const packageJson = JSON.parse(fs.readFileSync("./package.json", "utf8"));
46
+ const published = publishedProductPackageJson({
47
+ packageJson,
48
+ catalog: await loadDeployCatalog("dd-cyberia"),
49
+ });
50
+ fs.writeFileSync("./package.json", JSON.stringify(published, null, DEPLOY_MANIFEST_INDENT) + "\n", "utf8");
51
+ console.log("published manifest", {
52
+ dependencies: Object.keys(published.dependencies).length,
53
+ devDependencies: Object.keys(published.devDependencies ?? {}).length,
54
+ });
55
+ '
56
+
35
57
  - name: Publish to npm
36
58
  env:
37
59
  NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
@@ -57,6 +79,28 @@ jobs:
57
79
  - name: Install Dependencies
58
80
  run: npm ci
59
81
 
82
+ # The repository declares the engine's runtime dependencies because it runs the engine
83
+ # source it ships; a registry consumer gets them through `underpost` instead. This restores
84
+ # the manifest the package published before that split, and only in the tarball — after
85
+ # `npm ci`, so the lockfile the checkout installs from is the repository's own.
86
+ - name: Restore the published dependency set
87
+ run: |
88
+ node --input-type=module -e '
89
+ import fs from "node:fs";
90
+ import { publishedProductPackageJson, DEPLOY_MANIFEST_INDENT } from "./src/server/build/package.js";
91
+ import { loadDeployCatalog } from "./src/server/build/catalog.js";
92
+ const packageJson = JSON.parse(fs.readFileSync("./package.json", "utf8"));
93
+ const published = publishedProductPackageJson({
94
+ packageJson,
95
+ catalog: await loadDeployCatalog("dd-cyberia"),
96
+ });
97
+ fs.writeFileSync("./package.json", JSON.stringify(published, null, DEPLOY_MANIFEST_INDENT) + "\n", "utf8");
98
+ console.log("published manifest", {
99
+ dependencies: Object.keys(published.dependencies).length,
100
+ devDependencies: Object.keys(published.devDependencies ?? {}).length,
101
+ });
102
+ '
103
+
60
104
  - name: Publish to npm
61
105
  env:
62
106
  NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
@@ -1,4 +1,4 @@
1
- name: CI | Gihub page | PWA Microservices Template Test
1
+ name: CI | PWA Microservices | Unit & Infra Tests
2
2
 
3
3
  on: [push]
4
4
 
@@ -30,4 +30,4 @@ jobs:
30
30
  run: npm install
31
31
 
32
32
  - name: Run test
33
- run: scripts/coverall-test.sh
33
+ run: node bin test unit,infra