@underpostnet/cyberia 3.2.90 → 3.3.73

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 (490) hide show
  1. package/.dockerignore +1 -0
  2. package/.env.example +16 -0
  3. package/.github/workflows/coverall.cyberia.ci.yml +107 -0
  4. package/.github/workflows/cyberia-client.cd.yml +6 -18
  5. package/.github/workflows/cyberia-server.cd.yml +6 -18
  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 +6 -78
  13. package/.github/workflows/engine-cyberia.ci.yml +4 -5
  14. package/.github/workflows/ghpkg.ci.yml +42 -21
  15. package/.github/workflows/hardhat.ci.yml +12 -11
  16. package/.github/workflows/npmpkg.ci.yml +17 -15
  17. package/.github/workflows/pwa-microservices-template-page.cd.yml +1 -16
  18. package/.github/workflows/pwa-microservices-template-test.ci.yml +2 -2
  19. package/.github/workflows/release.cd.yml +2 -9
  20. package/.prettierignore +1 -0
  21. package/AGENTS.md +47 -0
  22. package/CHANGELOG.md +581 -2417
  23. package/CLI-HELP.md +416 -127
  24. package/Dockerfile +25 -9
  25. package/Dockerfile.dev +25 -9
  26. package/Dockerfile.test +4 -4
  27. package/README.md +21 -1
  28. package/bin/build.js +70 -43
  29. package/bin/build.template.js +8 -3
  30. package/bin/cyberia.js +372 -135
  31. package/bin/deploy.js +18 -104
  32. package/bin/index.js +372 -135
  33. package/compose.env +16 -0
  34. package/conf.js +93 -4
  35. package/deploy/cyberia-client/deploy.sh +47 -0
  36. package/deploy/cyberia-client/package.sh +18 -0
  37. package/deploy/cyberia-client/state.sh +14 -0
  38. package/deploy/cyberia-server/deploy.sh +47 -0
  39. package/deploy/cyberia-server/package.sh +18 -0
  40. package/deploy/cyberia-server/state.sh +14 -0
  41. package/deploy/dd-cyberia/deploy.sh +22 -0
  42. package/deploy/dd-cyberia/init.sh +55 -0
  43. package/deploy/dd-cyberia/package.sh +17 -0
  44. package/deploy/dd-cyberia/state.sh +14 -0
  45. package/deploy/dd-cyberia/sync-deploy.sh +116 -0
  46. package/deploy/lib/github-actions-logging.sh +594 -0
  47. package/deploy/lib/host.sh +185 -0
  48. package/deploy/lib/state.sh +62 -0
  49. package/deploy/pwa-microservices-template/deploy.sh +45 -0
  50. package/deploy/release/deploy.sh +32 -0
  51. package/deployment.yaml +7 -2
  52. package/docker-compose.yml +31 -37
  53. package/examples/static-page/README.md +19 -19
  54. package/examples/static-page/ssr-components/CustomPage.js +2 -2
  55. package/hardhat/hardhat.config.js +1 -6
  56. package/hardhat/package-lock.json +104 -43
  57. package/hardhat/package.json +3 -3
  58. package/manifests/alertmanager/deployment.yaml +81 -0
  59. package/manifests/blackbox-exporter/deployment.yaml +75 -0
  60. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +36 -7
  61. package/manifests/cronjobs/dd-cron/dd-cron-vultr.yaml +77 -0
  62. package/manifests/deployment/dd-cyberia-development/deployment.yaml +7 -2
  63. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  64. package/manifests/grafana/deployment.yaml +26 -7
  65. package/manifests/grafana/kustomization.yaml +1 -0
  66. package/manifests/grafana/service.yaml +6 -1
  67. package/manifests/mariadb/pv.yaml +1 -0
  68. package/manifests/mongodb/statefulset.yaml +9 -2
  69. package/manifests/mysql/pv-pvc.yaml +14 -1
  70. package/manifests/postgresql/pv.yaml +12 -1
  71. package/manifests/postgresql/pvc.yaml +1 -0
  72. package/manifests/prometheus/deployment.yaml +18 -22
  73. package/package.json +83 -10
  74. package/scripts/audit-selinux.sh +64 -0
  75. package/scripts/event-monitor.sh +56 -0
  76. package/scripts/gpu-diag.sh +0 -0
  77. package/scripts/ip-info.sh +0 -0
  78. package/scripts/k3s-node-setup.sh +30 -14
  79. package/scripts/kubeadm-node-setup.sh +40 -31
  80. package/scripts/lxd-vm-setup.sh +0 -0
  81. package/scripts/maas-nat-firewalld.sh +0 -0
  82. package/scripts/maas-setup.sh +8 -8
  83. package/scripts/nat-iptables.sh +2 -0
  84. package/scripts/rhel-grpc-setup.sh +0 -0
  85. package/scripts/rocky-kickstart.sh +25 -9
  86. package/scripts/selinux-normalize.sh +907 -0
  87. package/scripts/shutdown-machine.sh +843 -0
  88. package/scripts/test-monitor.sh +3 -3
  89. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +1 -1
  90. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +2 -2
  91. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +2 -2
  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 +1 -1
  99. package/src/api/cyberia-action/cyberia-action.service.js +2 -2
  100. package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +1 -1
  101. package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +1 -1
  102. package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +2 -2
  103. package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +1 -1
  104. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +1 -1
  105. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +2 -2
  106. package/src/api/cyberia-entity/cyberia-entity.controller.js +1 -1
  107. package/src/api/cyberia-entity/cyberia-entity.router.js +1 -1
  108. package/src/api/cyberia-entity/cyberia-entity.service.js +2 -2
  109. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +1 -1
  110. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +1 -1
  111. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +2 -2
  112. package/src/api/cyberia-instance/cyberia-fallback-capture.js +466 -0
  113. package/src/api/cyberia-instance/cyberia-fallback-default-items.js +63 -0
  114. package/src/api/cyberia-instance/cyberia-fallback-world.js +16 -1
  115. package/src/api/cyberia-instance/cyberia-instance-map.service.js +1 -1
  116. package/src/api/cyberia-instance/cyberia-instance.controller.js +4 -1
  117. package/src/api/cyberia-instance/cyberia-instance.router.js +15 -2
  118. package/src/api/cyberia-instance/cyberia-instance.service.js +45 -2
  119. package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +1 -1
  120. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +1 -0
  121. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +1 -1
  122. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +2 -2
  123. package/src/api/cyberia-map/cyberia-map.controller.js +1 -1
  124. package/src/api/cyberia-map/cyberia-map.router.js +1 -1
  125. package/src/api/cyberia-map/cyberia-map.service.js +2 -2
  126. package/src/api/cyberia-quest/cyberia-quest.controller.js +1 -1
  127. package/src/api/cyberia-quest/cyberia-quest.router.js +1 -1
  128. package/src/api/cyberia-quest/cyberia-quest.service.js +2 -2
  129. package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +1 -1
  130. package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +1 -1
  131. package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +2 -2
  132. package/src/api/cyberia-saga/cyberia-saga.controller.js +1 -1
  133. package/src/api/cyberia-saga/cyberia-saga.router.js +1 -1
  134. package/src/api/cyberia-saga/cyberia-saga.service.js +2 -2
  135. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +16 -29
  136. package/src/api/cyberia-skill/cyberia-skill.controller.js +1 -1
  137. package/src/api/cyberia-skill/cyberia-skill.router.js +1 -1
  138. package/src/api/cyberia-skill/cyberia-skill.service.js +2 -2
  139. package/src/api/default/default.controller.js +1 -1
  140. package/src/api/default/default.router.js +1 -1
  141. package/src/api/default/default.service.js +2 -2
  142. package/src/api/document/document.controller.js +1 -1
  143. package/src/api/document/document.router.js +1 -1
  144. package/src/api/document/document.service.js +2 -2
  145. package/src/api/file/file.controller.js +1 -1
  146. package/src/api/file/file.router.js +1 -1
  147. package/src/api/file/file.service.js +2 -2
  148. package/src/api/instance/instance.controller.js +1 -1
  149. package/src/api/instance/instance.router.js +1 -1
  150. package/src/api/instance/instance.service.js +2 -2
  151. package/src/api/ipfs/ipfs.controller.js +1 -1
  152. package/src/api/ipfs/ipfs.router.js +2 -2
  153. package/src/api/ipfs/ipfs.service.js +2 -2
  154. package/src/api/object-layer/object-layer.controller.js +1 -1
  155. package/src/api/object-layer/object-layer.model.js +204 -3
  156. package/src/api/object-layer/object-layer.router.js +2 -2
  157. package/src/api/object-layer/object-layer.service.js +4 -17
  158. package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +1 -1
  159. package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +1 -1
  160. package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +2 -2
  161. package/src/api/test/test.controller.js +1 -1
  162. package/src/api/test/test.service.js +1 -1
  163. package/src/api/user/guest.service.js +3 -3
  164. package/src/api/user/user.controller.js +1 -1
  165. package/src/api/user/user.router.js +2 -2
  166. package/src/api/user/user.service.js +4 -4
  167. package/src/api.js +5 -9
  168. package/src/cli/app.js +391 -0
  169. package/src/cli/baremetal.js +30 -36
  170. package/src/cli/client.js +306 -0
  171. package/src/cli/cloud-init.js +3 -3
  172. package/src/cli/cluster.js +242 -135
  173. package/src/cli/db.js +126 -67
  174. package/src/cli/deploy.js +158 -60
  175. package/src/cli/docker-compose.js +5 -5
  176. package/src/cli/domains.js +184 -0
  177. package/src/cli/dotenv-store.js +143 -0
  178. package/src/cli/event.js +2281 -0
  179. package/src/cli/fs.js +3 -3
  180. package/src/cli/host.js +672 -0
  181. package/src/cli/image.js +4 -7
  182. package/src/cli/index.js +426 -134
  183. package/src/cli/ipfs.js +34 -30
  184. package/src/cli/kickstart.js +1 -1
  185. package/src/cli/kubectl.js +218 -41
  186. package/src/cli/lxd.js +3 -3
  187. package/src/cli/monitor.js +1359 -26
  188. package/src/cli/package.js +90 -0
  189. package/src/cli/release.js +73 -34
  190. package/src/cli/repository.js +564 -367
  191. package/src/cli/run.js +362 -654
  192. package/src/cli/secrets.js +2158 -964
  193. package/src/cli/ssh.js +651 -331
  194. package/src/cli/state.js +394 -0
  195. package/src/cli/static.js +2 -2
  196. package/src/cli/system.js +26 -13
  197. package/src/cli/test.js +199 -125
  198. package/src/cli/vultr.js +623 -0
  199. package/src/cli/wireguard.js +2930 -0
  200. package/src/client/components/core/CalendarCore.js +53 -96
  201. package/src/client/components/core/Docs.js +258 -211
  202. package/src/client/components/core/FileExplorer.js +0 -21
  203. package/src/client/components/core/PanelForm.js +4 -4
  204. package/src/client/components/core/Repository.js +56 -0
  205. package/src/client/components/core/Translate.js +7 -0
  206. package/src/client/components/core/{FullScreen.js → ViewModeController.js} +42 -39
  207. package/src/client/components/core/Wallet.js +0 -11
  208. package/src/client/components/core/Worker.js +7 -1
  209. package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +2 -2
  210. package/src/client/components/cyberia/FallbackWorldEngineCyberia.js +368 -0
  211. package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +35 -1
  212. package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +4 -0
  213. package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +2 -2
  214. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +4 -0
  215. package/src/client/components/default/AppShellDefault.js +1 -1
  216. package/src/client/components/default/SettingsDefault.js +2 -2
  217. package/src/client/components/itemledger/SettingsItemledger.js +2 -2
  218. package/src/client/components/underpost/AppShellUnderpost.js +3 -2
  219. package/src/client/components/underpost/SettingsUnderpost.js +2 -2
  220. package/src/client/public/cyberia-docs/ARCHITECTURE.md +17 -3
  221. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +32 -5
  222. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +1 -1
  223. package/src/client/public/cyberia-docs/CYBERIA.md +21 -1
  224. package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +23 -6
  225. package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
  226. package/src/client/public/cyberia-docs/WHITE-PAPER.md +1 -1
  227. package/src/client/public/default/android-chrome-144x144.png +0 -0
  228. package/src/client/public/default/android-chrome-192x192.png +0 -0
  229. package/src/client/public/default/android-chrome-256x256.png +0 -0
  230. package/src/client/public/default/android-chrome-36x36.png +0 -0
  231. package/src/client/public/default/android-chrome-384x384.png +0 -0
  232. package/src/client/public/default/android-chrome-48x48.png +0 -0
  233. package/src/client/public/default/android-chrome-512x512.png +0 -0
  234. package/src/client/public/default/android-chrome-72x72.png +0 -0
  235. package/src/client/public/default/android-chrome-96x96.png +0 -0
  236. package/src/client/public/default/apple-touch-icon-1024x1024.png +0 -0
  237. package/src/client/public/default/apple-touch-icon-114x114.png +0 -0
  238. package/src/client/public/default/apple-touch-icon-120x120.png +0 -0
  239. package/src/client/public/default/apple-touch-icon-144x144.png +0 -0
  240. package/src/client/public/default/apple-touch-icon-152x152.png +0 -0
  241. package/src/client/public/default/apple-touch-icon-167x167.png +0 -0
  242. package/src/client/public/default/apple-touch-icon-180x180.png +0 -0
  243. package/src/client/public/default/apple-touch-icon-57x57.png +0 -0
  244. package/src/client/public/default/apple-touch-icon-60x60.png +0 -0
  245. package/src/client/public/default/apple-touch-icon-72x72.png +0 -0
  246. package/src/client/public/default/apple-touch-icon-76x76.png +0 -0
  247. package/src/client/public/default/apple-touch-icon-precomposed.png +0 -0
  248. package/src/client/public/default/apple-touch-icon.png +0 -0
  249. package/src/client/public/default/apple-touch-startup-image-1125x2436.png +0 -0
  250. package/src/client/public/default/apple-touch-startup-image-1136x640.png +0 -0
  251. package/src/client/public/default/apple-touch-startup-image-1170x2532.png +0 -0
  252. package/src/client/public/default/apple-touch-startup-image-1179x2556.png +0 -0
  253. package/src/client/public/default/apple-touch-startup-image-1242x2208.png +0 -0
  254. package/src/client/public/default/apple-touch-startup-image-1242x2688.png +0 -0
  255. package/src/client/public/default/apple-touch-startup-image-1284x2778.png +0 -0
  256. package/src/client/public/default/apple-touch-startup-image-1290x2796.png +0 -0
  257. package/src/client/public/default/apple-touch-startup-image-1334x750.png +0 -0
  258. package/src/client/public/default/apple-touch-startup-image-1488x2266.png +0 -0
  259. package/src/client/public/default/apple-touch-startup-image-1536x2048.png +0 -0
  260. package/src/client/public/default/apple-touch-startup-image-1620x2160.png +0 -0
  261. package/src/client/public/default/apple-touch-startup-image-1640x2160.png +0 -0
  262. package/src/client/public/default/apple-touch-startup-image-1668x2224.png +0 -0
  263. package/src/client/public/default/apple-touch-startup-image-1668x2388.png +0 -0
  264. package/src/client/public/default/apple-touch-startup-image-1792x828.png +0 -0
  265. package/src/client/public/default/apple-touch-startup-image-2048x1536.png +0 -0
  266. package/src/client/public/default/apple-touch-startup-image-2048x2732.png +0 -0
  267. package/src/client/public/default/apple-touch-startup-image-2160x1620.png +0 -0
  268. package/src/client/public/default/apple-touch-startup-image-2160x1640.png +0 -0
  269. package/src/client/public/default/apple-touch-startup-image-2208x1242.png +0 -0
  270. package/src/client/public/default/apple-touch-startup-image-2224x1668.png +0 -0
  271. package/src/client/public/default/apple-touch-startup-image-2266x1488.png +0 -0
  272. package/src/client/public/default/apple-touch-startup-image-2388x1668.png +0 -0
  273. package/src/client/public/default/apple-touch-startup-image-2436x1125.png +0 -0
  274. package/src/client/public/default/apple-touch-startup-image-2532x1170.png +0 -0
  275. package/src/client/public/default/apple-touch-startup-image-2556x1179.png +0 -0
  276. package/src/client/public/default/apple-touch-startup-image-2688x1242.png +0 -0
  277. package/src/client/public/default/apple-touch-startup-image-2732x2048.png +0 -0
  278. package/src/client/public/default/apple-touch-startup-image-2778x1284.png +0 -0
  279. package/src/client/public/default/apple-touch-startup-image-2796x1290.png +0 -0
  280. package/src/client/public/default/apple-touch-startup-image-640x1136.png +0 -0
  281. package/src/client/public/default/apple-touch-startup-image-750x1334.png +0 -0
  282. package/src/client/public/default/apple-touch-startup-image-828x1792.png +0 -0
  283. package/src/client/public/default/assets/background/white.jpg +0 -0
  284. package/src/client/public/default/browserconfig.xml +1 -1
  285. package/src/client/public/default/favicon-16x16.png +0 -0
  286. package/src/client/public/default/favicon-32x32.png +0 -0
  287. package/src/client/public/default/favicon-48x48.png +0 -0
  288. package/src/client/public/default/favicon.ico +0 -0
  289. package/src/client/public/default/manifest.webmanifest +5 -5
  290. package/src/client/public/default/mstile-144x144.png +0 -0
  291. package/src/client/public/default/mstile-150x150.png +0 -0
  292. package/src/client/public/default/mstile-310x150.png +0 -0
  293. package/src/client/public/default/mstile-310x310.png +0 -0
  294. package/src/client/public/default/mstile-70x70.png +0 -0
  295. package/src/client/public/default/yandex-browser-50x50.png +0 -0
  296. package/src/client/public/default/yandex-browser-manifest.json +1 -1
  297. package/src/client/services/cyberia-instance/cyberia-instance.service.js +40 -0
  298. package/src/client/services/object-layer/object-layer.management.js +4 -4
  299. package/src/client/ssr/RootDocument.js +1 -1
  300. package/src/client/ssr/body/404.js +1 -1
  301. package/src/client/ssr/body/500.js +1 -1
  302. package/src/client/ssr/body/CacheControl.js +1 -1
  303. package/src/client/ssr/body/CyberiaDefaultSplashScreen.js +1 -1
  304. package/src/client/ssr/body/DefaultSplashScreen.js +1 -1
  305. package/src/client/ssr/body/SwaggerDarkMode.js +1 -1
  306. package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +1 -1
  307. package/src/client/ssr/head/CryptokoynScripts.js +1 -1
  308. package/src/client/ssr/head/Css.js +1 -1
  309. package/src/client/ssr/head/CyberiaPortalScripts.js +1 -1
  310. package/src/client/ssr/head/DefaultScripts.js +1 -1
  311. package/src/client/ssr/head/ItemledgerScripts.js +1 -1
  312. package/src/client/ssr/head/Microdata.js +1 -1
  313. package/src/client/ssr/head/Production.js +1 -1
  314. package/src/client/ssr/head/Pwa.js +1 -1
  315. package/src/client/ssr/head/PwaItemledger.js +1 -1
  316. package/src/client/ssr/head/Seo.js +1 -1
  317. package/src/client/ssr/head/UnderpostScripts.js +1 -1
  318. package/src/client/ssr/mailer/DefaultRecoverEmail.js +1 -1
  319. package/src/client/ssr/mailer/DefaultVerifyEmail.js +1 -1
  320. package/src/client/ssr/views/Cyberia404.js +7 -5
  321. package/src/client/ssr/views/CyberiaServerMetrics.js +1 -1
  322. package/src/client/ssr/views/Maintenance.js +1 -1
  323. package/src/client/ssr/views/NoNetworkConnection.js +1 -1
  324. package/src/client/ssr/views/Test.js +1 -1
  325. package/src/client/sw/core.sw.js +20 -14
  326. package/src/client-builder/client-build-docs.js +61 -46
  327. package/src/client-builder/client-build-live.js +2 -2
  328. package/src/client-builder/client-build.js +58 -44
  329. package/src/client-builder/client-dev-server.js +3 -3
  330. package/src/client-builder/client-icons.js +2 -2
  331. package/src/client-builder/ssr.js +3 -3
  332. package/src/client.build.js +3 -6
  333. package/src/client.dev.js +3 -6
  334. package/src/db/DataBaseProvider.js +186 -3
  335. package/src/db/mariadb/MariaDB.js +3 -2
  336. package/src/db/mongo/MongoBootstrap.js +273 -101
  337. package/src/db/mongo/MongooseDB.js +11 -8
  338. package/src/{server/valkey.js → db/valkey/Valkey.js} +5 -4
  339. package/src/grpc/cyberia/grpc-server.js +1 -1
  340. package/src/index.js +103 -23
  341. package/src/mailer/EmailRender.js +2 -2
  342. package/src/mailer/MailerInterceptor.js +87 -0
  343. package/src/mailer/MailerProvider.js +50 -6
  344. package/src/projects/cyberia/atlas-sprite-sheet-generator.js +1 -1
  345. package/src/projects/cyberia/besu-genesis-generator.js +3 -3
  346. package/src/projects/cyberia/catalog-cyberia.js +54 -6
  347. package/src/projects/cyberia/gemini-client.js +1 -1
  348. package/src/projects/cyberia/generate-saga.js +15 -24
  349. package/src/projects/cyberia/hot-reload-trigger.js +1 -1
  350. package/src/projects/cyberia/instance-data.js +22 -3
  351. package/src/projects/cyberia/ipfs-client.js +4 -4
  352. package/src/projects/cyberia/map-preview-generator.js +1 -1
  353. package/src/projects/cyberia/object-layer.js +12 -22
  354. package/src/projects/cyberia/semantic-layer-generator.js +1 -1
  355. package/src/projects/underpost/catalog-underpost.js +13 -2
  356. package/src/proxy.js +4 -7
  357. package/src/runtime/cyberia-client/Dockerfile +9 -4
  358. package/src/runtime/cyberia-client/Dockerfile.dev +8 -2
  359. package/src/runtime/cyberia-server/Dockerfile +9 -4
  360. package/src/runtime/cyberia-server/Dockerfile.dev +8 -2
  361. package/src/runtime/engine-cyberia/Dockerfile +25 -9
  362. package/src/runtime/engine-cyberia/Dockerfile.dev +25 -9
  363. package/src/runtime/engine-cyberia/Dockerfile.test +4 -4
  364. package/src/runtime/engine-cyberia/compose.env +16 -0
  365. package/src/runtime/engine-cyberia/docker-compose.yml +31 -37
  366. package/src/runtime/express/Express.js +32 -27
  367. package/src/runtime/lampp/Lampp.js +22 -70
  368. package/src/runtime/nginx/Nginx.js +1 -1
  369. package/src/runtime/wp/Wp.js +16 -48
  370. package/src/server/{catalog.js → build/catalog.js} +15 -5
  371. package/src/server/build/coverage.js +117 -0
  372. package/src/server/build/execution.js +402 -0
  373. package/src/server/build/package.js +465 -0
  374. package/src/server/build/testing.js +528 -0
  375. package/src/server/{dns.js → network/dns.js} +241 -14
  376. package/src/server/network/forward-proxy.js +541 -0
  377. package/src/server/{middlewares.js → network/middlewares.js} +59 -4
  378. package/src/server/network/node-capability.js +98 -0
  379. package/src/server/{peer.js → network/peer.js} +3 -3
  380. package/src/server/{proxy.js → network/proxy.js} +7 -13
  381. package/src/server/network/router.js +356 -0
  382. package/src/server/{tls.js → network/tls.js} +2 -2
  383. package/src/server/network/underpost-compression.js +186 -0
  384. package/src/server/{underpost-gateway.js → network/underpost-gateway.js} +26 -16
  385. package/src/server/{underpost-ingress.js → network/underpost-ingress.js} +19 -3
  386. package/src/server/{cri.js → ops/cri.js} +2 -2
  387. package/src/server/ops/cron.js +949 -0
  388. package/src/server/ops/event-notification.js +284 -0
  389. package/src/server/{logger.js → ops/logger.js} +108 -23
  390. package/src/server/ops/monitoring.js +1724 -0
  391. package/src/server/ops/systemd.js +259 -0
  392. package/src/server/{conf.js → runtime/conf.js} +521 -520
  393. package/src/server/runtime/config-scope.js +215 -0
  394. package/src/server/runtime/environment.js +149 -0
  395. package/src/server/{process.js → runtime/process.js} +153 -13
  396. package/src/server/{runtime-status.js → runtime/runtime-status.js} +155 -16
  397. package/src/server/{runtime.js → runtime/runtime.js} +12 -8
  398. package/src/server/{start.js → runtime/start.js} +128 -39
  399. package/src/server/{auth.js → security/auth.js} +7 -8
  400. package/src/server/security/container-storage.js +382 -0
  401. package/src/server/{crypto.js → security/crypto.js} +1 -1
  402. package/src/server/security/selinux.js +185 -0
  403. package/src/server/{backup.js → storage/backup.js} +17 -8
  404. package/src/server/{data-query.js → storage/data-query.js} +1 -1
  405. package/src/server/{downloader.js → storage/downloader.js} +2 -2
  406. package/src/server/storage/repository.js +68 -0
  407. package/src/server.js +4 -7
  408. package/src/ws/IoInterface.js +1 -1
  409. package/src/ws/IoServer.js +1 -1
  410. package/src/ws/core/core.ws.connection.js +1 -1
  411. package/src/ws/core/core.ws.emit.js +1 -1
  412. package/src/ws/core/core.ws.server.js +1 -1
  413. package/src/ws/default/default.ws.connection.js +1 -1
  414. package/src/ws/default/default.ws.emit.js +1 -1
  415. package/src/ws/default/default.ws.server.js +1 -1
  416. package/test/e2e/event-e2e-public-ingress-down.js +45 -0
  417. package/test/e2e/event-e2e-wireguard-server-down.js +38 -0
  418. package/test/e2e/event-e2e-wireguard-spoke-down.js +40 -0
  419. package/test/{api.test.js → integration/app/api.test.js} +33 -14
  420. package/test/integration/app/cyberia/cyberia-cli-plain-reads.test.js +30 -0
  421. package/test/{cyberia-instance-conf-defaults.test.js → integration/app/cyberia/cyberia-instance-conf-defaults.test.js} +2 -1
  422. package/test/integration/app/cyberia/cyberia-load.test.js +467 -0
  423. package/test/integration/app/cyberia/fallback-world-capture.test.js +253 -0
  424. package/test/integration/app/cyberia/object-layer-item-id.test.js +327 -0
  425. package/test/{shape-generator.test.js → integration/app/cyberia/shape-generator.test.js} +1 -1
  426. package/test/integration/infra/1-security/config-scope.test.js +305 -0
  427. package/test/integration/infra/1-security/container-storage.test.js +356 -0
  428. package/test/integration/infra/1-security/in-pod-cli-surface.test.js +86 -0
  429. package/test/integration/infra/1-security/secret-onboarding.test.js +930 -0
  430. package/test/integration/infra/1-security/selinux.test.js +69 -0
  431. package/test/{sops-secret-store.test.js → integration/infra/1-security/sops-secret-store.test.js} +415 -61
  432. package/test/integration/infra/1-security/systemd-service.test.js +70 -0
  433. package/test/integration/infra/1-security/underpost-config-secret.test.js +367 -0
  434. package/test/integration/infra/2-network/dns-firewall.test.js +566 -0
  435. package/test/integration/infra/2-network/node-capability.test.js +182 -0
  436. package/test/integration/infra/2-network/wireguard-cli.test.js +1163 -0
  437. package/test/integration/infra/2-network/wireguard-edge.test.js +1731 -0
  438. package/test/{cluster-instances.test.js → integration/infra/3-cluster/cluster-instances.test.js} +11 -15
  439. package/test/{deploy-node-placement.test.js → integration/infra/3-cluster/deploy-node-placement.test.js} +3 -3
  440. package/test/integration/infra/3-cluster/docker-compose-stack.test.js +313 -0
  441. package/test/integration/infra/4-ingress/deploy-routes.test.js +379 -0
  442. package/test/integration/infra/4-ingress/gateway-static-assets.test.js +453 -0
  443. package/test/{instance-traffic-plan.test.js → integration/infra/4-ingress/instance-traffic-plan.test.js} +10 -6
  444. package/test/{underpost-gateway.test.js → integration/infra/4-ingress/underpost-gateway.test.js} +47 -6
  445. package/test/{underpost-ingress.test.js → integration/infra/4-ingress/underpost-ingress.test.js} +56 -4
  446. package/test/integration/infra/5-observability/cron-jobs.test.js +652 -0
  447. package/test/{deploy-monitor.test.js → integration/infra/5-observability/deploy-monitor.test.js} +29 -31
  448. package/test/integration/infra/5-observability/event-notification.test.js +197 -0
  449. package/test/integration/infra/5-observability/event-remediation.test.js +502 -0
  450. package/test/integration/infra/5-observability/event-targets.test.js +1174 -0
  451. package/test/integration/infra/5-observability/monitoring-stack.test.js +902 -0
  452. package/test/support/shell-harness.js +73 -0
  453. package/test/unit/build-template.test.js +97 -0
  454. package/test/unit/build-workflow-offline.test.js +132 -0
  455. package/test/unit/catalog.test.js +71 -0
  456. package/test/unit/client-build-docs.test.js +334 -0
  457. package/test/unit/conf-loading.test.js +303 -0
  458. package/test/unit/conf-resolution.test.js +979 -0
  459. package/test/unit/coverage-artifact.test.js +130 -0
  460. package/test/{crypto.test.js → unit/crypto.test.js} +1 -1
  461. package/test/unit/deploy-env-resolution.test.js +38 -0
  462. package/test/unit/deploy-log-table.test.js +447 -0
  463. package/test/unit/execution-profiles.test.js +219 -0
  464. package/test/unit/fleet-sync-source.test.js +149 -0
  465. package/test/unit/logger-redaction.test.js +112 -0
  466. package/test/unit/package.test.js +403 -0
  467. package/test/unit/prepare-host.test.js +299 -0
  468. package/test/unit/process-environment.test.js +18 -0
  469. package/test/unit/propagation-message.test.js +78 -0
  470. package/test/unit/redeploy-plan.test.js +24 -0
  471. package/test/unit/release-bump.test.js +474 -0
  472. package/test/unit/ssh-output-redaction.test.js +28 -0
  473. package/test/unit/start-options.test.js +46 -0
  474. package/test/unit/test-tiers.test.js +193 -0
  475. package/vitest.config.js +58 -0
  476. package/.nycrc +0 -9
  477. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +0 -48
  478. package/manifests/mongodb/pv-pvc.yaml +0 -59
  479. package/scripts/link-local-underpost-cli.sh +0 -6
  480. package/src/api/user/user.build.js +0 -16
  481. package/src/cli/env.js +0 -177
  482. package/src/client/components/core/Blockchain.js +0 -41
  483. package/src/client/components/core/Blog.js +0 -9
  484. package/src/client/components/core/KeyboardAvoidance.js +0 -145
  485. package/src/client/public/default/assets/background/dark.jpg +0 -0
  486. package/src/client/public/default/assets/background/white0-min.jpg +0 -0
  487. package/src/client/public/default/assets/background/white0.jpg +0 -0
  488. package/src/client/public/doc/favicon.ico +0 -0
  489. package/src/client/public/doc/sitemap +0 -148
  490. package/src/server/cron.js +0 -476
package/Dockerfile CHANGED
@@ -6,7 +6,7 @@
6
6
  # Stage 1 — builder: clone the private deploy, build it, then scrub secrets.
7
7
  # ---------------------------------------------------------------------------
8
8
  FROM rockylinux/rockylinux:9 AS builder
9
- ARG UNDERPOST_VERSION=3.2.90
9
+ ARG UNDERPOST_VERSION=3.3.73
10
10
  # Pin Node to an exact patch: dnf's nodejs:24 module lags (24.14.1) while
11
11
  # underpost's dependencies require >=24.15.0, so install the official binary.
12
12
  ARG NODE_VERSION=24.15.0
@@ -14,7 +14,7 @@ ENV NODE_ENV=production
14
14
 
15
15
  RUN set -eux; \
16
16
  # `sudo` is required because underpost's build steps shell out to
17
- # `sudo cp`/`sudo rm` (src/server/start.js); the build runs as root so sudo
17
+ # `sudo cp`/`sudo rm` (src/server/runtime/start.js); the build runs as root so sudo
18
18
  # is just a passthrough, but the binary must exist.
19
19
  dnf install -y git openssl tar xz sudo; \
20
20
  arch="$(uname -m)"; \
@@ -26,10 +26,22 @@ RUN set -eux; \
26
26
  curl -fsSL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-${node_arch}.tar.xz" \
27
27
  | tar -xJ -C /usr/local --strip-components=1; \
28
28
  node --version; npm --version; \
29
- npm install -g underpost@${UNDERPOST_VERSION}; \
30
29
  dnf clean all; rm -rf /var/cache/dnf; \
31
30
  npm cache clean --force
32
31
 
32
+
33
+ # The builder's own `underpost clone` calls below run on this same CLI, and the runtime stage
34
+ # inherits it through `COPY --from=builder /usr/local/`.
35
+ COPY underpost-cli.tgz /tmp/underpost-cli.tgz
36
+ RUN set -eux; \
37
+ npm install -g /tmp/underpost-cli.tgz --omit=dev; \
38
+ rm -f /tmp/underpost-cli.tgz; \
39
+ npm cache clean --force; \
40
+ underpost --version; \
41
+ # The staged package must be the pinned release: a drift here would ship a CLI the
42
+ # deployment manifests were not built against.
43
+ underpost --version | grep -Fq "${UNDERPOST_VERSION}"
44
+
33
45
  WORKDIR /home/dd
34
46
 
35
47
  # Comma-separated instance codes to provision (backup dir + optional saga).
@@ -38,7 +50,7 @@ WORKDIR /home/dd
38
50
  # `--build-arg INSTANCE_CODES=...`. Declared as an ARG (not a marker-wrapped
39
51
  # shell string) so the value is clean — a `/** … */` literal in the shell would
40
52
  # glob-expand in the `for` loop below.
41
- ARG INSTANCE_CODES="amethyst-strata-expansion,FOREST"
53
+ ARG INSTANCE_CODES="amethyst-strata-expansion,FOREST,TEST"
42
54
 
43
55
  RUN --mount=type=secret,id=github_username \
44
56
  # --mount=type=secret,id=github_token \
@@ -83,7 +95,7 @@ RUN --mount=type=secret,id=github_username \
83
95
  cd /home/dd/engine; \
84
96
  # --- install deps + env, then replay build-safe itc provisioning ----------
85
97
  npm install; \
86
- node bin env dd-cyberia production; \
98
+ node bin app load --env production --args deploy-id=dd-cyberia; \
87
99
  ( cd /home/dd/engine/hardhat && npm install --include=dev ); \
88
100
  # --- build the client bundle (assets are now in place) --------------------
89
101
  cd /home/dd/engine; \
@@ -136,11 +148,15 @@ COPY --from=builder /usr/local/ /usr/local/
136
148
  RUN dnf install -y libstdc++ git sudo && dnf clean all && rm -rf /var/cache/dnf && \
137
149
  useradd --create-home --home-dir /home/dd --shell /usr/sbin/nologin dd && \
138
150
  # The runtime runs as `dd`, but `underpost start --build` shells out to `sudo cp`/`sudo rm`
139
- # (src/server/start.js). Grant passwordless sudo so those succeed without a TTY/password.
151
+ # (src/server/runtime/start.js). Grant passwordless sudo so those succeed without a TTY/password.
140
152
  printf 'dd ALL=(ALL) NOPASSWD:ALL\n' > /etc/sudoers.d/dd && chmod 0440 /etc/sudoers.d/dd && \
141
- # underpost persists its global env at $(npm root -g)/underpost/.env; the
142
- # non-root runtime user must be able to write it (fixes EACCES on start).
143
- chown -R dd:dd /usr/local/lib/node_modules/underpost
153
+ # underpost persists its global env and container state under
154
+ # `$(npm root -g)/underpost` (getUnderpostRootPath). That path is a STORE directory, not
155
+ # the CLI package tree: the staged package installs under its own package name, and
156
+ # `underpost start --build` re-links the bin at the pulled checkout without moving the
157
+ # store (src/server/runtime/start.js#linkRuntimeCli). Create it here — the non-root
158
+ # runtime user cannot mkdir inside /usr/local itself (EACCES on the first state write).
159
+ mkdir -p "$(npm root -g)/underpost" && chown -R dd:dd "$(npm root -g)/underpost"
144
160
 
145
161
  # Copy ONLY the scrubbed runtime tree — no .git, no token, no caches.
146
162
  COPY --from=builder --chown=dd:dd /home/dd/engine /home/dd/engine
package/Dockerfile.dev CHANGED
@@ -6,7 +6,7 @@
6
6
  # Stage 1 — builder: clone the private deploy, build it, then scrub secrets.
7
7
  # ---------------------------------------------------------------------------
8
8
  FROM rockylinux/rockylinux:9 AS builder
9
- ARG UNDERPOST_VERSION=3.2.90
9
+ ARG UNDERPOST_VERSION=3.3.73
10
10
  # Pin Node to an exact patch: dnf's nodejs:24 module lags (24.14.1) while
11
11
  # underpost's dependencies require >=24.15.0, so install the official binary.
12
12
  ARG NODE_VERSION=24.15.0
@@ -14,7 +14,7 @@ ENV NODE_ENV=development
14
14
 
15
15
  RUN set -eux; \
16
16
  # `sudo` is required because underpost's build steps shell out to
17
- # `sudo cp`/`sudo rm` (src/server/start.js); the build runs as root so sudo
17
+ # `sudo cp`/`sudo rm` (src/server/runtime/start.js); the build runs as root so sudo
18
18
  # is just a passthrough, but the binary must exist.
19
19
  dnf install -y git openssl tar xz sudo; \
20
20
  arch="$(uname -m)"; \
@@ -26,10 +26,22 @@ RUN set -eux; \
26
26
  curl -fsSL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-${node_arch}.tar.xz" \
27
27
  | tar -xJ -C /usr/local --strip-components=1; \
28
28
  node --version; npm --version; \
29
- npm install -g underpost@${UNDERPOST_VERSION}; \
30
29
  dnf clean all; rm -rf /var/cache/dnf; \
31
30
  npm cache clean --force
32
31
 
32
+
33
+ # The builder's own `underpost clone` calls below run on this same CLI, and the runtime stage
34
+ # inherits it through `COPY --from=builder /usr/local/`.
35
+ COPY underpost-cli.tgz /tmp/underpost-cli.tgz
36
+ RUN set -eux; \
37
+ npm install -g /tmp/underpost-cli.tgz --omit=dev; \
38
+ rm -f /tmp/underpost-cli.tgz; \
39
+ npm cache clean --force; \
40
+ underpost --version; \
41
+ # The staged package must be the pinned release: a drift here would ship a CLI the
42
+ # deployment manifests were not built against.
43
+ underpost --version | grep -Fq "${UNDERPOST_VERSION}"
44
+
33
45
  WORKDIR /home/dd
34
46
 
35
47
  # Comma-separated instance codes to provision (backup dir + optional saga).
@@ -38,7 +50,7 @@ WORKDIR /home/dd
38
50
  # `--build-arg INSTANCE_CODES=...`. Declared as an ARG (not a marker-wrapped
39
51
  # shell string) so the value is clean — a `/** … */` literal in the shell would
40
52
  # glob-expand in the `for` loop below.
41
- ARG INSTANCE_CODES="amethyst-strata-expansion,FOREST"
53
+ ARG INSTANCE_CODES="amethyst-strata-expansion,FOREST,TEST"
42
54
 
43
55
  RUN --mount=type=secret,id=github_username \
44
56
  # --mount=type=secret,id=github_token \
@@ -83,7 +95,7 @@ RUN --mount=type=secret,id=github_username \
83
95
  cd /home/dd/engine; \
84
96
  # --- install deps + env, then replay build-safe itc provisioning ----------
85
97
  npm install; \
86
- node bin env dd-cyberia development; \
98
+ node bin app load --env development --args deploy-id=dd-cyberia; \
87
99
  ( cd /home/dd/engine/hardhat && npm install --include=dev ); \
88
100
  # --- build the client bundle (assets are now in place) --------------------
89
101
  cd /home/dd/engine; \
@@ -136,11 +148,15 @@ COPY --from=builder /usr/local/ /usr/local/
136
148
  RUN dnf install -y libstdc++ git sudo && dnf clean all && rm -rf /var/cache/dnf && \
137
149
  useradd --create-home --home-dir /home/dd --shell /usr/sbin/nologin dd && \
138
150
  # The runtime runs as `dd`, but `underpost start --build` shells out to `sudo cp`/`sudo rm`
139
- # (src/server/start.js). Grant passwordless sudo so those succeed without a TTY/password.
151
+ # (src/server/runtime/start.js). Grant passwordless sudo so those succeed without a TTY/password.
140
152
  printf 'dd ALL=(ALL) NOPASSWD:ALL\n' > /etc/sudoers.d/dd && chmod 0440 /etc/sudoers.d/dd && \
141
- # underpost persists its global env at $(npm root -g)/underpost/.env; the
142
- # non-root runtime user must be able to write it (fixes EACCES on start).
143
- chown -R dd:dd /usr/local/lib/node_modules/underpost
153
+ # underpost persists its global env and container state under
154
+ # `$(npm root -g)/underpost` (getUnderpostRootPath). That path is a STORE directory, not
155
+ # the CLI package tree: the staged package installs under its own package name, and
156
+ # `underpost start --build` re-links the bin at the pulled checkout without moving the
157
+ # store (src/server/runtime/start.js#linkRuntimeCli). Create it here — the non-root
158
+ # runtime user cannot mkdir inside /usr/local itself (EACCES on the first state write).
159
+ mkdir -p "$(npm root -g)/underpost" && chown -R dd:dd "$(npm root -g)/underpost"
144
160
 
145
161
  # Copy ONLY the scrubbed runtime tree — no .git, no token, no caches.
146
162
  COPY --from=builder --chown=dd:dd /home/dd/engine /home/dd/engine
package/Dockerfile.test CHANGED
@@ -6,7 +6,7 @@
6
6
  # Stage 1 — builder: clone the private deploy, build it, then scrub secrets.
7
7
  # ---------------------------------------------------------------------------
8
8
  FROM rockylinux/rockylinux:9 AS builder
9
- ARG UNDERPOST_VERSION=3.2.90
9
+ ARG UNDERPOST_VERSION=3.3.73
10
10
  # Pin Node to an exact patch: dnf's nodejs:24 module lags (24.14.1) while
11
11
  # underpost's dependencies require >=24.15.0, so install the official binary.
12
12
  ARG NODE_VERSION=24.15.0
@@ -14,7 +14,7 @@ ENV NODE_ENV=development
14
14
 
15
15
  RUN set -eux; \
16
16
  # `sudo` is required because underpost's build steps shell out to
17
- # `sudo cp`/`sudo rm` (src/server/start.js); the build runs as root so sudo
17
+ # `sudo cp`/`sudo rm` (src/server/runtime/start.js); the build runs as root so sudo
18
18
  # is just a passthrough, but the binary must exist.
19
19
  dnf install -y git openssl tar xz sudo; \
20
20
  arch="$(uname -m)"; \
@@ -71,7 +71,7 @@ RUN --mount=type=secret,id=github_token \
71
71
  \
72
72
  # --- install deps + env, then replay build-safe itc provisioning ----------
73
73
  npm install; \
74
- node bin env dd-cyberia development; \
74
+ node bin app load --env development --args deploy-id=dd-cyberia; \
75
75
  node bin fs --pull --recursive --deploy-id dd-cyberia --storage-file-path './engine-private/conf/dd-cyberia/storage.engine-cyberia.json'; \
76
76
  ( cd /home/dd/engine/hardhat && npm install --include=dev ); \
77
77
  ( cd /home/dd/engine && underpost clone underpostnet/cyberia-server ); \
@@ -140,7 +140,7 @@ COPY --from=builder /usr/local/ /usr/local/
140
140
  RUN dnf install -y libstdc++ git sudo && dnf clean all && rm -rf /var/cache/dnf && \
141
141
  useradd --create-home --home-dir /home/dd --shell /usr/sbin/nologin dd && \
142
142
  # The runtime runs as `dd`, but `underpost start --build` shells out to `sudo cp`/`sudo rm`
143
- # (src/server/start.js). Grant passwordless sudo so those succeed without a TTY/password.
143
+ # (src/server/runtime/start.js). Grant passwordless sudo so those succeed without a TTY/password.
144
144
  printf 'dd ALL=(ALL) NOPASSWD:ALL\n' > /etc/sudoers.d/dd && chmod 0440 /etc/sudoers.d/dd && \
145
145
  # underpost persists its global env at $(npm root -g)/underpost/.env; the
146
146
  # non-root runtime user must be able to write it (fixes EACCES on start).
package/README.md CHANGED
@@ -8,9 +8,29 @@
8
8
 
9
9
  _Stackable Rendering Layers as a Unified Tokenized Reality_
10
10
 
11
- [![Version](https://img.shields.io/npm/v/cyberia.svg)](https://www.npmjs.org/package/cyberia)
11
+ </div>
12
+
13
+ <!-- Tech stack -->
14
+ <div align="center">
15
+
16
+ <a target="_top" href='https://download.rockylinux.org/pub/rocky/9/'><img alt='rockylinux' src='https://img.shields.io/badge/Rocky Linux v9.8-100000?style=flat&logo=rockylinux&logoColor=white&labelColor=10b981&color=727273'/></a> <a target="_top" href='https://www.npmjs.com/package/npm?activeTab=versions'><img alt='npm' src='https://img.shields.io/badge/npm v11.6.2-100000?style=flat&logo=npm&logoColor=white&labelColor=CB3837&color=727273'/></a> <a target="_top" href='https://nodejs.org/download/release'><img alt='nodedotjs' src='https://img.shields.io/badge/node v24.15.0-100000?style=flat&logo=nodedotjs&logoColor=white&labelColor=5FA04E&color=727273'/></a> <a target="_top" href='https://pgp.mongodb.com/'><img alt='mongodb' src='https://img.shields.io/badge/mongodb_server v7.0-100000?style=flat&logo=mongodb&logoColor=white&labelColor=47A248&color=727273'/></a>
12
17
 
13
18
  </div>
19
+
20
+ <!-- CI/CD and health -->
21
+ <div align="center">
22
+
23
+ [![Node.js CI](https://img.shields.io/github/actions/workflow/status/underpostnet/engine-cyberia/docker-image.engine-cyberia.ci.yml?branch=main&label=Node.js%20CI)](https://github.com/underpostnet/engine-cyberia/actions/workflows/docker-image.engine-cyberia.ci.yml) [![Test](https://img.shields.io/github/actions/workflow/status/underpostnet/engine-cyberia/coverall.cyberia.ci.yml?branch=main&label=Test)](https://github.com/underpostnet/engine-cyberia/actions/workflows/coverall.cyberia.ci.yml) [![Coverage Status](https://coveralls.io/repos/github/underpostnet/engine-cyberia/badge.svg?branch=main)](https://coveralls.io/github/underpostnet/engine-cyberia?branch=main) [![Socket Badge](https://socket.dev/api/badge/npm/package/cyberia/3.3.73)](https://socket.dev/npm/package/cyberia/overview/3.3.73)
24
+
25
+ </div>
26
+
27
+ <!-- Distribution and package -->
28
+ <div align="center">
29
+
30
+ [![Version](https://img.shields.io/npm/v/cyberia.svg)](https://www.npmjs.com/package/cyberia) [![Downloads](https://img.shields.io/npm/dm/cyberia.svg)](https://www.npmjs.com/package/cyberia) [![jsDelivr](https://data.jsdelivr.com/v1/package/npm/cyberia/badge)](https://www.jsdelivr.com/package/npm/cyberia) [![License](https://img.shields.io/npm/l/cyberia.svg)](https://www.npmjs.com/package/cyberia)
31
+
32
+ </div>
33
+
14
34
  Cyberia is an MMORPG extension built on the Underpost Platform. The platform owns the
15
35
  toolchain, deployment surface, PWA delivery, and base infrastructure. Cyberia adds a three-service MMO
16
36
  runtime: `engine-cyberia`, `cyberia-server`, and `cyberia-client`.
package/bin/build.js CHANGED
@@ -2,23 +2,26 @@
2
2
 
3
3
  import { Command } from 'commander';
4
4
  import fs from 'fs-extra';
5
- import dotenv from 'dotenv';
6
- import { loggerFactory } from '../src/server/logger.js';
5
+ import { loggerFactory } from '../src/server/ops/logger.js';
7
6
  import { getCapVariableName } from '../src/client/components/core/CommonJs.js';
8
7
  import {
9
8
  getPathsSSR,
10
- resolveDeployList,
11
9
  syncPrivateConf,
12
10
  syncDeployIdSources,
13
11
  buildTemplate,
14
12
  updatePrivateEngineTestRepo,
15
- } from '../src/server/conf.js';
16
- import { loadDeployCatalog } from '../src/server/catalog.js';
13
+ } from '../src/server/runtime/conf.js';
14
+ import { resolveDeployList } from '../src/server/network/router.js';
15
+ import { loadDeployCatalog } from '../src/server/build/catalog.js';
16
+ import { buildProductPackageJson, productPackageOptionsFactory } from '../src/server/build/package.js';
17
+ import { COVERAGE_BUNDLE_DIRECTORY, bundleCoverageReport } from '../src/server/build/coverage.js';
18
+ import { shellExec } from '../src/server/runtime/process.js';
17
19
  import Underpost from '../src/index.js';
18
- import { DOCKER_SCRIPTS } from '../src/api/cyberia-server-defaults/cyberia-server-defaults.js';
19
20
 
20
- const baseConfPath = './engine-private/conf/dd-cron/.env.production';
21
- if (fs.existsSync(baseConfPath)) dotenv.config({ path: baseConfPath, override: true });
21
+ // The host environment this entrypoint publishes with, read through the domain that owns it
22
+ // rather than from a path: the durable source is one file per scope, and naming the pre-split
23
+ // file here left the build with no credentials at all once that file was retired.
24
+ for (const [key, value] of Object.entries(Underpost.host.read())) process.env[key] = value;
22
25
 
23
26
  const logger = loggerFactory(import.meta);
24
27
 
@@ -31,7 +34,7 @@ const basePath = '../pwa-microservices-template';
31
34
  * @param {string} confName - A concrete deploy id (e.g. `dd-prototype`).
32
35
  */
33
36
  const buildDeployTemplate = async (confName) => {
34
- const repoName = `engine-${confName.split('dd-')[1]}`;
37
+ const repoName = Underpost.repo.engineRepoFactory(confName);
35
38
  const catalog = await loadDeployCatalog(confName);
36
39
 
37
40
  if (catalog.sourceMoves.length) {
@@ -108,32 +111,28 @@ const buildDeployTemplate = async (confName) => {
108
111
  if (!fs.existsSync(`${basePath}/.github/workflows`))
109
112
  fs.mkdirSync(`${basePath}/.github/workflows`, { recursive: true });
110
113
 
111
- const originPackageJson = JSON.parse(fs.readFileSync(`./package.json`, 'utf8'));
112
- const packageJson = JSON.parse(fs.readFileSync(`${basePath}/package.json`, 'utf8'));
113
- packageJson.name = repoName.replace('engine-', '');
114
+ const sourcePackageJson = JSON.parse(fs.readFileSync(`./package.json`, 'utf8'));
115
+ const basePackageJson = JSON.parse(fs.readFileSync(`${basePath}/package.json`, 'utf8'));
116
+
117
+ // A packaged path may be a nested project with its own installed tree; the
118
+ // product resolves dependencies from its own lockfile, never from a copy.
119
+ const copyTemplatePaths = () => {
120
+ for (const path of catalog.templatePaths)
121
+ fs.copySync(`.${path}`, `${basePath}${path}`, {
122
+ filter: (src) => !src.split('/').includes('node_modules'),
123
+ });
124
+ };
125
+
126
+ // The manifest a product publishes is its catalog's declaration, resolved the same way for
127
+ // every product: only the files a product places in the template are its own business.
128
+ const packageOptions = productPackageOptionsFactory({ catalog, underpostVersion: Underpost.version });
114
129
 
115
130
  switch (confName) {
116
131
  case 'dd-cyberia': {
117
- fs.copyFileSync(`./bin/cyberia.js`, `${basePath}/bin/cyberia.js`);
118
132
  fs.copyFileSync(
119
133
  `./.github/workflows/publish.cyberia.ci.yml`,
120
134
  `${basePath}/.github/workflows/publish.cyberia.ci.yml`,
121
135
  );
122
- if (packageJson.bin) delete packageJson.bin.underpost;
123
- if (!packageJson.bin) packageJson.bin = {};
124
- packageJson.bin.cyberia = 'bin/index.js';
125
- packageJson.keywords = catalog.keywords;
126
- packageJson.description = catalog.description;
127
- const { CyberiaDependencies } = await import(`../src/api/cyberia-server-defaults/cyberia-server-defaults.js`);
128
- packageJson.dependencies = {
129
- underpost: '^' + Underpost.version.replace('v', ''),
130
- 'adm-zip': '^0.6.0',
131
- ...CyberiaDependencies,
132
- };
133
- packageJson.scripts = {
134
- ...packageJson.scripts,
135
- ...DOCKER_SCRIPTS,
136
- };
137
136
  fs.writeFileSync(`${basePath}/bin/index.js`, fs.readFileSync(`./bin/cyberia.js`, 'utf8'), 'utf8');
138
137
  // Canonical Cyberia doc; engine-cyberia/README.md is a generated copy — never hand-edited.
139
138
  fs.writeFileSync(
@@ -141,23 +140,27 @@ const buildDeployTemplate = async (confName) => {
141
140
  fs.readFileSync(`./src/client/public/cyberia-docs/CYBERIA.md`, 'utf8'),
142
141
  'utf8',
143
142
  );
144
- fs.copySync(`./hardhat`, `${basePath}/hardhat`);
145
- for (const path of catalog.templatePaths) fs.copySync(`.${path}`, `${basePath}${path}`);
143
+ copyTemplatePaths();
146
144
  break;
147
145
  }
148
146
  default:
149
- for (const path of catalog.templatePaths) fs.copySync(`.${path}`, `${basePath}${path}`);
147
+ copyTemplatePaths();
150
148
  break;
151
149
  }
152
150
 
153
- fs.writeFileSync(
154
- `${basePath}/package.json`,
155
- JSON.stringify(packageJson, null, 4).replaceAll('pwa-microservices-template', repoName),
156
- 'utf8',
157
- );
158
-
159
- fs.copySync(`./src/cli`, `${basePath}/src/cli`);
160
- if (!fs.existsSync(`${basePath}/images`)) fs.mkdirSync(`${basePath}/images`);
151
+ const packageJson = buildProductPackageJson({
152
+ basePackageJson,
153
+ sourcePackageJson,
154
+ catalog,
155
+ confName,
156
+ repositoryName: repoName,
157
+ ...packageOptions,
158
+ });
159
+ fs.writeFileSync(`${basePath}/package.json`, JSON.stringify(packageJson, null, 4), 'utf8');
160
+ if (fs.existsSync(`./deploy/${confName}`))
161
+ fs.copySync(`./deploy/${confName}`, `${basePath}/deploy/${confName}`, {
162
+ overwrite: true,
163
+ });
161
164
 
162
165
  fs.copyFileSync(`./.github/workflows/${repoName}.ci.yml`, `${basePath}/.github/workflows/${repoName}.ci.yml`);
163
166
  if (fs.existsSync(`./.github/workflows/docker-image.${repoName}.ci.yml`))
@@ -217,18 +220,36 @@ const buildDeployTemplate = async (confName) => {
217
220
  }
218
221
  };
219
222
 
223
+ /**
224
+ * Carries this build stage's coverage HTML report into the assembled template, so every
225
+ * container started from the published source serves the report instead of generating one.
226
+ */
227
+ const bundleDeployCoverage = () => {
228
+ const { bundled, from, to } = bundleCoverageReport('.', basePath);
229
+ if (bundled) return void logger.info('Build coverage artifact', { from, to });
230
+ logger.warn('No coverage report to bundle; the deploy will publish the unavailable page', {
231
+ hint: 'node bin/build <deploy-id> --coverage',
232
+ to,
233
+ });
234
+ };
235
+
220
236
  const program = new Command();
221
237
 
222
238
  program
223
239
  .name('build')
224
240
  .description('Assemble deploy id public templates and sync their private configuration repos.')
225
- .argument('<conf-name>', 'Deploy id, comma-separated list, or the "dd" meta id (fans out via dd.router).')
241
+ .argument('<conf-name>', 'Deploy id, comma-separated list, or the "dd" meta id (fans out via dd.routes).')
226
242
  .argument('[env]', 'Environment label (informational; kept for CI invocation compatibility).')
227
243
  .option('--conf', 'Sync each deploy id private configuration repo and exit (no template assembly).')
228
244
  .option(
229
245
  '--no-template-rebuild',
230
246
  'Skip the from-scratch base template reconstruction before assembly (assemble onto the existing template).',
231
247
  )
248
+ .option(
249
+ '--coverage',
250
+ `Run the test suite to refresh ./coverage before assembly, so the artifact carries a current ${COVERAGE_BUNDLE_DIRECTORY} report.`,
251
+ false,
252
+ )
232
253
  .option(
233
254
  '--update-private',
234
255
  'After assembling each deploy id, publish it to its private test source repo (underpostnet/engine-test-<id>) for isolated test deploys.',
@@ -246,12 +267,18 @@ program
246
267
  return;
247
268
  }
248
269
 
249
- // Reconstruct the base template from 0 before assembly so no src from a previous
250
- // build run leaks into this one. Opt out with --no-template-rebuild.
251
- if (options.templateRebuild) await buildTemplate({ toPath: basePath });
270
+ // Tests run here, in the build stage, and exactly once: the artifact carries the report so
271
+ // no container ever has to produce its own. Refreshing is opt-in because a template
272
+ // assembly is not otherwise a test run.
273
+ if (options.coverage) shellExec(`npm run test:coverage`);
252
274
 
253
275
  for (const deployId of deployList) {
276
+ // Reconstruct the base template from 0 before each deploy id so neither a previous
277
+ // build run nor the deploy id assembled before this one leaks into it. Opt out with
278
+ // --no-template-rebuild.
279
+ if (options.templateRebuild) await buildTemplate({ toPath: basePath });
254
280
  await buildDeployTemplate(deployId);
281
+ bundleDeployCoverage();
255
282
  // Publish the just-assembled tree to the deploy id's private test repo so a
256
283
  // pod started with `--private-test-repo` clones this work-in-progress source.
257
284
  if (options.updatePrivate) await updatePrivateEngineTestRepo(deployId);
@@ -3,8 +3,8 @@
3
3
  import { Command } from 'commander';
4
4
  import fs from 'fs-extra';
5
5
  import dotenv from 'dotenv';
6
- import { loggerFactory } from '../src/server/logger.js';
7
- import { buildTemplate, updatePrivateTemplateRepo } from '../src/server/conf.js';
6
+ import { loggerFactory } from '../src/server/ops/logger.js';
7
+ import { buildTemplate, updatePrivateTemplateRepo } from '../src/server/runtime/conf.js';
8
8
 
9
9
  if (fs.existsSync('./engine-private/conf/dd-cron/.env.production'))
10
10
  dotenv.config({ path: `./engine-private/conf/dd-cron/.env.production`, override: true });
@@ -20,10 +20,15 @@ program
20
20
  .argument('[src-path]', 'Engine source root to sync from.', './')
21
21
  .argument('[to-path]', 'Template output path.', '../pwa-microservices-template')
22
22
  .option('--update-private', 'Update private template repository', false)
23
+ .option('--no-clone', 'Fail instead of cloning when the template checkout is missing or foreign.')
23
24
  .action(async (srcPath, toPath, options) => {
24
25
  try {
25
26
  if (options.updatePrivate) return await updatePrivateTemplateRepo();
26
- await buildTemplate({ srcPath: srcPath.replaceAll(`'`, ''), toPath: toPath.replaceAll(`'`, '') });
27
+ await buildTemplate({
28
+ srcPath: srcPath.replaceAll(`'`, ''),
29
+ toPath: toPath.replaceAll(`'`, ''),
30
+ noClone: options.clone === false,
31
+ });
27
32
  } catch (error) {
28
33
  logger.error(error, error.stack);
29
34
  process.exit(1);