@underpostnet/cyberia 3.3.0 → 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 (471) hide show
  1. package/.dockerignore +1 -0
  2. package/.github/workflows/coverall.cyberia.ci.yml +34 -14
  3. package/.github/workflows/cyberia-client.cd.yml +5 -0
  4. package/.github/workflows/cyberia-server.cd.yml +5 -0
  5. package/.github/workflows/docker-image.cyberia-client.ci.yml +8 -5
  6. package/.github/workflows/docker-image.cyberia-client.dev.ci.yml +8 -3
  7. package/.github/workflows/docker-image.cyberia-server.ci.yml +8 -5
  8. package/.github/workflows/docker-image.cyberia-server.dev.ci.yml +8 -5
  9. package/.github/workflows/docker-image.engine-cyberia.ci.yml +15 -1
  10. package/.github/workflows/docker-image.engine-cyberia.dev.ci.yml +15 -1
  11. package/.github/workflows/engine-cyberia.cd.yml +3 -0
  12. package/.github/workflows/engine-cyberia.ci.yml +4 -5
  13. package/.github/workflows/ghpkg.ci.yml +35 -20
  14. package/.github/workflows/hardhat.ci.yml +12 -11
  15. package/.github/workflows/npmpkg.ci.yml +17 -15
  16. package/.github/workflows/pwa-microservices-template-test.ci.yml +2 -2
  17. package/.github/workflows/release.cd.yml +1 -0
  18. package/.prettierignore +1 -0
  19. package/AGENTS.md +47 -0
  20. package/CHANGELOG.md +565 -2510
  21. package/CLI-HELP.md +306 -147
  22. package/Dockerfile +25 -9
  23. package/Dockerfile.dev +25 -9
  24. package/Dockerfile.test +4 -4
  25. package/README.md +21 -1
  26. package/bin/build.js +66 -41
  27. package/bin/build.template.js +8 -3
  28. package/bin/cyberia.js +308 -91
  29. package/bin/deploy.js +18 -104
  30. package/bin/index.js +308 -91
  31. package/conf.js +91 -4
  32. package/deploy/cyberia-client/deploy.sh +47 -0
  33. package/deploy/cyberia-client/package.sh +18 -0
  34. package/deploy/cyberia-client/state.sh +14 -0
  35. package/deploy/cyberia-server/deploy.sh +47 -0
  36. package/deploy/cyberia-server/package.sh +18 -0
  37. package/deploy/cyberia-server/state.sh +14 -0
  38. package/deploy/dd-cyberia/deploy.sh +6 -26
  39. package/deploy/dd-cyberia/init.sh +35 -43
  40. package/deploy/dd-cyberia/package.sh +17 -0
  41. package/deploy/dd-cyberia/state.sh +14 -0
  42. package/deploy/dd-cyberia/sync-deploy.sh +92 -170
  43. package/deploy/lib/github-actions-logging.sh +594 -0
  44. package/deploy/lib/host.sh +185 -0
  45. package/deploy/lib/state.sh +62 -0
  46. package/deploy/pwa-microservices-template/deploy.sh +12 -39
  47. package/deploy/release/deploy.sh +9 -39
  48. package/deployment.yaml +7 -2
  49. package/docker-compose.yml +7 -7
  50. package/examples/static-page/README.md +19 -19
  51. package/examples/static-page/ssr-components/CustomPage.js +2 -2
  52. package/hardhat/hardhat.config.js +1 -6
  53. package/hardhat/package-lock.json +101 -40
  54. package/hardhat/package.json +2 -2
  55. package/manifests/alertmanager/deployment.yaml +81 -0
  56. package/manifests/blackbox-exporter/deployment.yaml +75 -0
  57. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +32 -7
  58. package/manifests/cronjobs/dd-cron/dd-cron-vultr.yaml +32 -7
  59. package/manifests/deployment/dd-cyberia-development/deployment.yaml +7 -2
  60. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  61. package/manifests/grafana/deployment.yaml +26 -7
  62. package/manifests/grafana/kustomization.yaml +1 -0
  63. package/manifests/grafana/service.yaml +6 -1
  64. package/manifests/mariadb/pv.yaml +1 -0
  65. package/manifests/mongodb/statefulset.yaml +9 -2
  66. package/manifests/mysql/pv-pvc.yaml +14 -1
  67. package/manifests/postgresql/pv.yaml +12 -1
  68. package/manifests/postgresql/pvc.yaml +1 -0
  69. package/manifests/prometheus/deployment.yaml +18 -22
  70. package/package.json +83 -10
  71. package/scripts/event-monitor.sh +56 -0
  72. package/scripts/k3s-node-setup.sh +27 -14
  73. package/scripts/kubeadm-node-setup.sh +31 -11
  74. package/scripts/maas-setup.sh +8 -8
  75. package/scripts/selinux-normalize.sh +907 -0
  76. package/scripts/shutdown-machine.sh +843 -0
  77. package/scripts/test-monitor.sh +3 -3
  78. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +1 -1
  79. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +2 -2
  80. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +2 -2
  81. package/src/api/core/core.controller.js +1 -1
  82. package/src/api/core/core.router.js +2 -2
  83. package/src/api/core/core.service.js +2 -2
  84. package/src/api/crypto/crypto.controller.js +1 -1
  85. package/src/api/crypto/crypto.service.js +1 -1
  86. package/src/api/cyberia-action/cyberia-action.controller.js +1 -1
  87. package/src/api/cyberia-action/cyberia-action.router.js +1 -1
  88. package/src/api/cyberia-action/cyberia-action.service.js +2 -2
  89. package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +1 -1
  90. package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +1 -1
  91. package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +2 -2
  92. package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +1 -1
  93. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +1 -1
  94. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +2 -2
  95. package/src/api/cyberia-entity/cyberia-entity.controller.js +1 -1
  96. package/src/api/cyberia-entity/cyberia-entity.router.js +1 -1
  97. package/src/api/cyberia-entity/cyberia-entity.service.js +2 -2
  98. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +1 -1
  99. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +1 -1
  100. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +2 -2
  101. package/src/api/cyberia-instance/cyberia-fallback-capture.js +466 -0
  102. package/src/api/cyberia-instance/cyberia-fallback-world.js +8 -0
  103. package/src/api/cyberia-instance/cyberia-instance-map.service.js +1 -1
  104. package/src/api/cyberia-instance/cyberia-instance.controller.js +1 -1
  105. package/src/api/cyberia-instance/cyberia-instance.router.js +2 -2
  106. package/src/api/cyberia-instance/cyberia-instance.service.js +2 -2
  107. package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +1 -1
  108. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +1 -1
  109. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +2 -2
  110. package/src/api/cyberia-map/cyberia-map.controller.js +1 -1
  111. package/src/api/cyberia-map/cyberia-map.router.js +1 -1
  112. package/src/api/cyberia-map/cyberia-map.service.js +2 -2
  113. package/src/api/cyberia-quest/cyberia-quest.controller.js +1 -1
  114. package/src/api/cyberia-quest/cyberia-quest.router.js +1 -1
  115. package/src/api/cyberia-quest/cyberia-quest.service.js +2 -2
  116. package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +1 -1
  117. package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +1 -1
  118. package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +2 -2
  119. package/src/api/cyberia-saga/cyberia-saga.controller.js +1 -1
  120. package/src/api/cyberia-saga/cyberia-saga.router.js +1 -1
  121. package/src/api/cyberia-saga/cyberia-saga.service.js +2 -2
  122. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +0 -26
  123. package/src/api/cyberia-skill/cyberia-skill.controller.js +1 -1
  124. package/src/api/cyberia-skill/cyberia-skill.router.js +1 -1
  125. package/src/api/cyberia-skill/cyberia-skill.service.js +2 -2
  126. package/src/api/default/default.controller.js +1 -1
  127. package/src/api/default/default.router.js +1 -1
  128. package/src/api/default/default.service.js +2 -2
  129. package/src/api/document/document.controller.js +1 -1
  130. package/src/api/document/document.router.js +1 -1
  131. package/src/api/document/document.service.js +2 -2
  132. package/src/api/file/file.controller.js +1 -1
  133. package/src/api/file/file.router.js +1 -1
  134. package/src/api/file/file.service.js +2 -2
  135. package/src/api/instance/instance.controller.js +1 -1
  136. package/src/api/instance/instance.router.js +1 -1
  137. package/src/api/instance/instance.service.js +2 -2
  138. package/src/api/ipfs/ipfs.controller.js +1 -1
  139. package/src/api/ipfs/ipfs.router.js +2 -2
  140. package/src/api/ipfs/ipfs.service.js +2 -2
  141. package/src/api/object-layer/object-layer.controller.js +1 -1
  142. package/src/api/object-layer/object-layer.router.js +2 -2
  143. package/src/api/object-layer/object-layer.service.js +3 -3
  144. package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +1 -1
  145. package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +1 -1
  146. package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +2 -2
  147. package/src/api/test/test.controller.js +1 -1
  148. package/src/api/test/test.service.js +1 -1
  149. package/src/api/user/guest.service.js +3 -3
  150. package/src/api/user/user.controller.js +1 -1
  151. package/src/api/user/user.router.js +2 -2
  152. package/src/api/user/user.service.js +4 -4
  153. package/src/api.js +5 -9
  154. package/src/cli/app.js +391 -0
  155. package/src/cli/baremetal.js +30 -35
  156. package/src/cli/client.js +306 -0
  157. package/src/cli/cloud-init.js +3 -3
  158. package/src/cli/cluster.js +184 -82
  159. package/src/cli/db.js +120 -68
  160. package/src/cli/deploy.js +153 -71
  161. package/src/cli/docker-compose.js +5 -5
  162. package/src/cli/domains.js +184 -0
  163. package/src/cli/dotenv-store.js +143 -0
  164. package/src/cli/event.js +2281 -0
  165. package/src/cli/fs.js +3 -3
  166. package/src/cli/host.js +672 -0
  167. package/src/cli/image.js +4 -6
  168. package/src/cli/index.js +322 -142
  169. package/src/cli/ipfs.js +34 -30
  170. package/src/cli/kickstart.js +1 -1
  171. package/src/cli/kubectl.js +218 -41
  172. package/src/cli/lxd.js +3 -3
  173. package/src/cli/monitor.js +1359 -26
  174. package/src/cli/package.js +90 -0
  175. package/src/cli/release.js +16 -12
  176. package/src/cli/repository.js +558 -363
  177. package/src/cli/run.js +331 -650
  178. package/src/cli/secrets.js +2158 -964
  179. package/src/cli/ssh.js +478 -279
  180. package/src/cli/state.js +394 -0
  181. package/src/cli/static.js +2 -2
  182. package/src/cli/system.js +1 -1
  183. package/src/cli/test.js +199 -125
  184. package/src/cli/vultr.js +61 -21
  185. package/src/cli/wireguard.js +1111 -306
  186. package/src/client/components/core/CalendarCore.js +53 -96
  187. package/src/client/components/core/Docs.js +258 -211
  188. package/src/client/components/core/FileExplorer.js +0 -21
  189. package/src/client/components/core/PanelForm.js +4 -4
  190. package/src/client/components/core/Repository.js +56 -0
  191. package/src/client/components/core/Translate.js +7 -0
  192. package/src/client/components/core/{FullScreen.js → ViewModeController.js} +42 -39
  193. package/src/client/components/core/Wallet.js +0 -11
  194. package/src/client/components/core/Worker.js +7 -1
  195. package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +2 -2
  196. package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +2 -1
  197. package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +2 -2
  198. package/src/client/components/default/AppShellDefault.js +1 -1
  199. package/src/client/components/default/SettingsDefault.js +2 -2
  200. package/src/client/components/itemledger/SettingsItemledger.js +2 -2
  201. package/src/client/components/underpost/AppShellUnderpost.js +3 -2
  202. package/src/client/components/underpost/SettingsUnderpost.js +2 -2
  203. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +32 -5
  204. package/src/client/public/cyberia-docs/CYBERIA.md +21 -1
  205. package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +23 -6
  206. package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
  207. package/src/client/public/cyberia-docs/WHITE-PAPER.md +1 -1
  208. package/src/client/public/default/android-chrome-144x144.png +0 -0
  209. package/src/client/public/default/android-chrome-192x192.png +0 -0
  210. package/src/client/public/default/android-chrome-256x256.png +0 -0
  211. package/src/client/public/default/android-chrome-36x36.png +0 -0
  212. package/src/client/public/default/android-chrome-384x384.png +0 -0
  213. package/src/client/public/default/android-chrome-48x48.png +0 -0
  214. package/src/client/public/default/android-chrome-512x512.png +0 -0
  215. package/src/client/public/default/android-chrome-72x72.png +0 -0
  216. package/src/client/public/default/android-chrome-96x96.png +0 -0
  217. package/src/client/public/default/apple-touch-icon-1024x1024.png +0 -0
  218. package/src/client/public/default/apple-touch-icon-114x114.png +0 -0
  219. package/src/client/public/default/apple-touch-icon-120x120.png +0 -0
  220. package/src/client/public/default/apple-touch-icon-144x144.png +0 -0
  221. package/src/client/public/default/apple-touch-icon-152x152.png +0 -0
  222. package/src/client/public/default/apple-touch-icon-167x167.png +0 -0
  223. package/src/client/public/default/apple-touch-icon-180x180.png +0 -0
  224. package/src/client/public/default/apple-touch-icon-57x57.png +0 -0
  225. package/src/client/public/default/apple-touch-icon-60x60.png +0 -0
  226. package/src/client/public/default/apple-touch-icon-72x72.png +0 -0
  227. package/src/client/public/default/apple-touch-icon-76x76.png +0 -0
  228. package/src/client/public/default/apple-touch-icon-precomposed.png +0 -0
  229. package/src/client/public/default/apple-touch-icon.png +0 -0
  230. package/src/client/public/default/apple-touch-startup-image-1125x2436.png +0 -0
  231. package/src/client/public/default/apple-touch-startup-image-1136x640.png +0 -0
  232. package/src/client/public/default/apple-touch-startup-image-1170x2532.png +0 -0
  233. package/src/client/public/default/apple-touch-startup-image-1179x2556.png +0 -0
  234. package/src/client/public/default/apple-touch-startup-image-1242x2208.png +0 -0
  235. package/src/client/public/default/apple-touch-startup-image-1242x2688.png +0 -0
  236. package/src/client/public/default/apple-touch-startup-image-1284x2778.png +0 -0
  237. package/src/client/public/default/apple-touch-startup-image-1290x2796.png +0 -0
  238. package/src/client/public/default/apple-touch-startup-image-1334x750.png +0 -0
  239. package/src/client/public/default/apple-touch-startup-image-1488x2266.png +0 -0
  240. package/src/client/public/default/apple-touch-startup-image-1536x2048.png +0 -0
  241. package/src/client/public/default/apple-touch-startup-image-1620x2160.png +0 -0
  242. package/src/client/public/default/apple-touch-startup-image-1640x2160.png +0 -0
  243. package/src/client/public/default/apple-touch-startup-image-1668x2224.png +0 -0
  244. package/src/client/public/default/apple-touch-startup-image-1668x2388.png +0 -0
  245. package/src/client/public/default/apple-touch-startup-image-1792x828.png +0 -0
  246. package/src/client/public/default/apple-touch-startup-image-2048x1536.png +0 -0
  247. package/src/client/public/default/apple-touch-startup-image-2048x2732.png +0 -0
  248. package/src/client/public/default/apple-touch-startup-image-2160x1620.png +0 -0
  249. package/src/client/public/default/apple-touch-startup-image-2160x1640.png +0 -0
  250. package/src/client/public/default/apple-touch-startup-image-2208x1242.png +0 -0
  251. package/src/client/public/default/apple-touch-startup-image-2224x1668.png +0 -0
  252. package/src/client/public/default/apple-touch-startup-image-2266x1488.png +0 -0
  253. package/src/client/public/default/apple-touch-startup-image-2388x1668.png +0 -0
  254. package/src/client/public/default/apple-touch-startup-image-2436x1125.png +0 -0
  255. package/src/client/public/default/apple-touch-startup-image-2532x1170.png +0 -0
  256. package/src/client/public/default/apple-touch-startup-image-2556x1179.png +0 -0
  257. package/src/client/public/default/apple-touch-startup-image-2688x1242.png +0 -0
  258. package/src/client/public/default/apple-touch-startup-image-2732x2048.png +0 -0
  259. package/src/client/public/default/apple-touch-startup-image-2778x1284.png +0 -0
  260. package/src/client/public/default/apple-touch-startup-image-2796x1290.png +0 -0
  261. package/src/client/public/default/apple-touch-startup-image-640x1136.png +0 -0
  262. package/src/client/public/default/apple-touch-startup-image-750x1334.png +0 -0
  263. package/src/client/public/default/apple-touch-startup-image-828x1792.png +0 -0
  264. package/src/client/public/default/assets/background/white.jpg +0 -0
  265. package/src/client/public/default/browserconfig.xml +1 -1
  266. package/src/client/public/default/favicon-16x16.png +0 -0
  267. package/src/client/public/default/favicon-32x32.png +0 -0
  268. package/src/client/public/default/favicon-48x48.png +0 -0
  269. package/src/client/public/default/favicon.ico +0 -0
  270. package/src/client/public/default/manifest.webmanifest +5 -5
  271. package/src/client/public/default/mstile-144x144.png +0 -0
  272. package/src/client/public/default/mstile-150x150.png +0 -0
  273. package/src/client/public/default/mstile-310x150.png +0 -0
  274. package/src/client/public/default/mstile-310x310.png +0 -0
  275. package/src/client/public/default/mstile-70x70.png +0 -0
  276. package/src/client/public/default/yandex-browser-50x50.png +0 -0
  277. package/src/client/public/default/yandex-browser-manifest.json +1 -1
  278. package/src/client/ssr/RootDocument.js +1 -1
  279. package/src/client/ssr/body/404.js +1 -1
  280. package/src/client/ssr/body/500.js +1 -1
  281. package/src/client/ssr/body/CacheControl.js +1 -1
  282. package/src/client/ssr/body/CyberiaDefaultSplashScreen.js +1 -1
  283. package/src/client/ssr/body/DefaultSplashScreen.js +1 -1
  284. package/src/client/ssr/body/SwaggerDarkMode.js +1 -1
  285. package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +1 -1
  286. package/src/client/ssr/head/CryptokoynScripts.js +1 -1
  287. package/src/client/ssr/head/Css.js +1 -1
  288. package/src/client/ssr/head/CyberiaPortalScripts.js +1 -1
  289. package/src/client/ssr/head/DefaultScripts.js +1 -1
  290. package/src/client/ssr/head/ItemledgerScripts.js +1 -1
  291. package/src/client/ssr/head/Microdata.js +1 -1
  292. package/src/client/ssr/head/Production.js +1 -1
  293. package/src/client/ssr/head/Pwa.js +1 -1
  294. package/src/client/ssr/head/PwaItemledger.js +1 -1
  295. package/src/client/ssr/head/Seo.js +1 -1
  296. package/src/client/ssr/head/UnderpostScripts.js +1 -1
  297. package/src/client/ssr/mailer/DefaultRecoverEmail.js +1 -1
  298. package/src/client/ssr/mailer/DefaultVerifyEmail.js +1 -1
  299. package/src/client/ssr/views/Cyberia404.js +7 -5
  300. package/src/client/ssr/views/CyberiaServerMetrics.js +1 -1
  301. package/src/client/ssr/views/Maintenance.js +1 -1
  302. package/src/client/ssr/views/NoNetworkConnection.js +1 -1
  303. package/src/client/ssr/views/Test.js +1 -1
  304. package/src/client/sw/core.sw.js +20 -14
  305. package/src/client-builder/client-build-docs.js +61 -46
  306. package/src/client-builder/client-build-live.js +2 -2
  307. package/src/client-builder/client-build.js +38 -30
  308. package/src/client-builder/client-dev-server.js +3 -3
  309. package/src/client-builder/client-icons.js +2 -2
  310. package/src/client-builder/ssr.js +3 -3
  311. package/src/client.build.js +3 -6
  312. package/src/client.dev.js +3 -6
  313. package/src/db/DataBaseProvider.js +186 -3
  314. package/src/db/mariadb/MariaDB.js +3 -2
  315. package/src/db/mongo/MongoBootstrap.js +273 -101
  316. package/src/db/mongo/MongooseDB.js +7 -8
  317. package/src/{server/valkey.js → db/valkey/Valkey.js} +5 -4
  318. package/src/grpc/cyberia/grpc-server.js +1 -1
  319. package/src/index.js +79 -23
  320. package/src/mailer/EmailRender.js +2 -2
  321. package/src/mailer/MailerInterceptor.js +87 -0
  322. package/src/mailer/MailerProvider.js +50 -6
  323. package/src/projects/cyberia/atlas-sprite-sheet-generator.js +1 -1
  324. package/src/projects/cyberia/besu-genesis-generator.js +3 -3
  325. package/src/projects/cyberia/catalog-cyberia.js +53 -10
  326. package/src/projects/cyberia/gemini-client.js +1 -1
  327. package/src/projects/cyberia/generate-saga.js +1 -1
  328. package/src/projects/cyberia/hot-reload-trigger.js +1 -1
  329. package/src/projects/cyberia/instance-data.js +1 -1
  330. package/src/projects/cyberia/ipfs-client.js +4 -4
  331. package/src/projects/cyberia/map-preview-generator.js +1 -1
  332. package/src/projects/cyberia/object-layer.js +1 -1
  333. package/src/projects/cyberia/semantic-layer-generator.js +1 -1
  334. package/src/projects/underpost/catalog-underpost.js +9 -1
  335. package/src/proxy.js +4 -7
  336. package/src/runtime/cyberia-client/Dockerfile +9 -4
  337. package/src/runtime/cyberia-client/Dockerfile.dev +8 -2
  338. package/src/runtime/cyberia-server/Dockerfile +9 -4
  339. package/src/runtime/cyberia-server/Dockerfile.dev +8 -2
  340. package/src/runtime/engine-cyberia/Dockerfile +25 -9
  341. package/src/runtime/engine-cyberia/Dockerfile.dev +25 -9
  342. package/src/runtime/engine-cyberia/Dockerfile.test +4 -4
  343. package/src/runtime/engine-cyberia/docker-compose.yml +7 -7
  344. package/src/runtime/express/Express.js +32 -27
  345. package/src/runtime/lampp/Lampp.js +22 -70
  346. package/src/runtime/nginx/Nginx.js +1 -1
  347. package/src/runtime/wp/Wp.js +16 -48
  348. package/src/server/{catalog.js → build/catalog.js} +15 -5
  349. package/src/server/build/coverage.js +117 -0
  350. package/src/server/build/execution.js +402 -0
  351. package/src/server/build/package.js +465 -0
  352. package/src/server/build/testing.js +528 -0
  353. package/src/server/{dns.js → network/dns.js} +144 -11
  354. package/src/server/{forward-proxy.js → network/forward-proxy.js} +10 -18
  355. package/src/server/{middlewares.js → network/middlewares.js} +3 -3
  356. package/src/server/network/node-capability.js +98 -0
  357. package/src/server/{peer.js → network/peer.js} +3 -3
  358. package/src/server/{proxy.js → network/proxy.js} +7 -13
  359. package/src/server/network/router.js +356 -0
  360. package/src/server/{tls.js → network/tls.js} +2 -2
  361. package/src/server/{underpost-compression.js → network/underpost-compression.js} +1 -1
  362. package/src/server/{underpost-gateway.js → network/underpost-gateway.js} +7 -7
  363. package/src/server/{underpost-ingress.js → network/underpost-ingress.js} +2 -2
  364. package/src/server/{cri.js → ops/cri.js} +2 -2
  365. package/src/server/{cron.js → ops/cron.js} +349 -74
  366. package/src/server/ops/event-notification.js +284 -0
  367. package/src/server/{logger.js → ops/logger.js} +108 -23
  368. package/src/server/ops/monitoring.js +1724 -0
  369. package/src/server/{systemd.js → ops/systemd.js} +55 -1
  370. package/src/server/{conf.js → runtime/conf.js} +513 -422
  371. package/src/server/runtime/config-scope.js +215 -0
  372. package/src/server/runtime/environment.js +149 -0
  373. package/src/server/{process.js → runtime/process.js} +153 -12
  374. package/src/server/{runtime-status.js → runtime/runtime-status.js} +155 -16
  375. package/src/server/{runtime.js → runtime/runtime.js} +12 -8
  376. package/src/server/{start.js → runtime/start.js} +128 -39
  377. package/src/server/{auth.js → security/auth.js} +7 -8
  378. package/src/server/security/container-storage.js +382 -0
  379. package/src/server/{crypto.js → security/crypto.js} +1 -1
  380. package/src/server/{selinux.js → security/selinux.js} +1 -1
  381. package/src/server/{backup.js → storage/backup.js} +17 -8
  382. package/src/server/{data-query.js → storage/data-query.js} +1 -1
  383. package/src/server/{downloader.js → storage/downloader.js} +2 -2
  384. package/src/server/storage/repository.js +68 -0
  385. package/src/server.js +4 -7
  386. package/src/ws/IoInterface.js +1 -1
  387. package/src/ws/IoServer.js +1 -1
  388. package/src/ws/core/core.ws.connection.js +1 -1
  389. package/src/ws/core/core.ws.emit.js +1 -1
  390. package/src/ws/core/core.ws.server.js +1 -1
  391. package/src/ws/default/default.ws.connection.js +1 -1
  392. package/src/ws/default/default.ws.emit.js +1 -1
  393. package/src/ws/default/default.ws.server.js +1 -1
  394. package/test/e2e/event-e2e-public-ingress-down.js +45 -0
  395. package/test/e2e/event-e2e-wireguard-server-down.js +38 -0
  396. package/test/e2e/event-e2e-wireguard-spoke-down.js +40 -0
  397. package/test/{api.test.js → integration/app/api.test.js} +33 -14
  398. package/test/integration/app/cyberia/cyberia-cli-plain-reads.test.js +30 -0
  399. package/test/{cyberia-instance-conf-defaults.test.js → integration/app/cyberia/cyberia-instance-conf-defaults.test.js} +1 -1
  400. package/test/integration/app/cyberia/cyberia-load.test.js +467 -0
  401. package/test/integration/app/cyberia/fallback-world-capture.test.js +253 -0
  402. package/test/integration/app/cyberia/object-layer-item-id.test.js +327 -0
  403. package/test/{shape-generator.test.js → integration/app/cyberia/shape-generator.test.js} +1 -1
  404. package/test/integration/infra/1-security/config-scope.test.js +305 -0
  405. package/test/integration/infra/1-security/container-storage.test.js +356 -0
  406. package/test/integration/infra/1-security/in-pod-cli-surface.test.js +86 -0
  407. package/test/integration/infra/1-security/secret-onboarding.test.js +930 -0
  408. package/test/{selinux.test.js → integration/infra/1-security/selinux.test.js} +2 -4
  409. package/test/{sops-secret-store.test.js → integration/infra/1-security/sops-secret-store.test.js} +415 -61
  410. package/test/integration/infra/1-security/systemd-service.test.js +70 -0
  411. package/test/integration/infra/1-security/underpost-config-secret.test.js +367 -0
  412. package/test/integration/infra/2-network/dns-firewall.test.js +566 -0
  413. package/test/integration/infra/2-network/node-capability.test.js +182 -0
  414. package/test/integration/infra/2-network/wireguard-cli.test.js +1163 -0
  415. package/test/{wireguard-edge.test.js → integration/infra/2-network/wireguard-edge.test.js} +609 -55
  416. package/test/{cluster-instances.test.js → integration/infra/3-cluster/cluster-instances.test.js} +11 -15
  417. package/test/{deploy-node-placement.test.js → integration/infra/3-cluster/deploy-node-placement.test.js} +3 -3
  418. package/test/integration/infra/3-cluster/docker-compose-stack.test.js +313 -0
  419. package/test/integration/infra/4-ingress/deploy-routes.test.js +379 -0
  420. package/test/integration/infra/4-ingress/gateway-static-assets.test.js +453 -0
  421. package/test/{instance-traffic-plan.test.js → integration/infra/4-ingress/instance-traffic-plan.test.js} +10 -6
  422. package/test/{underpost-gateway.test.js → integration/infra/4-ingress/underpost-gateway.test.js} +6 -6
  423. package/test/{underpost-ingress.test.js → integration/infra/4-ingress/underpost-ingress.test.js} +4 -4
  424. package/test/integration/infra/5-observability/cron-jobs.test.js +652 -0
  425. package/test/{deploy-monitor.test.js → integration/infra/5-observability/deploy-monitor.test.js} +29 -31
  426. package/test/integration/infra/5-observability/event-notification.test.js +197 -0
  427. package/test/integration/infra/5-observability/event-remediation.test.js +502 -0
  428. package/test/integration/infra/5-observability/event-targets.test.js +1174 -0
  429. package/test/integration/infra/5-observability/monitoring-stack.test.js +902 -0
  430. package/test/support/shell-harness.js +73 -0
  431. package/test/unit/build-template.test.js +97 -0
  432. package/test/unit/build-workflow-offline.test.js +132 -0
  433. package/test/unit/catalog.test.js +71 -0
  434. package/test/unit/client-build-docs.test.js +334 -0
  435. package/test/unit/conf-loading.test.js +303 -0
  436. package/test/unit/conf-resolution.test.js +979 -0
  437. package/test/unit/coverage-artifact.test.js +130 -0
  438. package/test/{crypto.test.js → unit/crypto.test.js} +1 -1
  439. package/test/unit/deploy-env-resolution.test.js +38 -0
  440. package/test/unit/deploy-log-table.test.js +447 -0
  441. package/test/unit/execution-profiles.test.js +219 -0
  442. package/test/unit/fleet-sync-source.test.js +149 -0
  443. package/test/unit/logger-redaction.test.js +112 -0
  444. package/test/unit/package.test.js +403 -0
  445. package/test/unit/prepare-host.test.js +299 -0
  446. package/test/unit/process-environment.test.js +18 -0
  447. package/test/unit/propagation-message.test.js +78 -0
  448. package/test/unit/redeploy-plan.test.js +24 -0
  449. package/test/unit/release-bump.test.js +474 -0
  450. package/test/unit/ssh-output-redaction.test.js +28 -0
  451. package/test/unit/start-options.test.js +46 -0
  452. package/test/unit/test-tiers.test.js +193 -0
  453. package/vitest.config.js +58 -0
  454. package/.nycrc +0 -9
  455. package/deploy/lib/logging.sh +0 -96
  456. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +0 -48
  457. package/manifests/mongodb/pv-pvc.yaml +0 -59
  458. package/scripts/coverall-test-cyberia.sh +0 -24
  459. package/scripts/coverall-test.sh +0 -24
  460. package/scripts/link-local-underpost-cli.sh +0 -6
  461. package/src/api/user/user.build.js +0 -16
  462. package/src/cli/env.js +0 -177
  463. package/src/client/components/core/Blockchain.js +0 -41
  464. package/src/client/components/core/Blog.js +0 -9
  465. package/src/client/components/core/KeyboardAvoidance.js +0 -145
  466. package/src/client/public/default/assets/background/dark.jpg +0 -0
  467. package/src/client/public/default/assets/background/white0-min.jpg +0 -0
  468. package/src/client/public/default/assets/background/white0.jpg +0 -0
  469. package/src/client/public/doc/favicon.ico +0 -0
  470. package/src/client/public/doc/sitemap +0 -148
  471. package/src/server/environment.js +0 -98
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Repository identity on the client.
3
+ *
4
+ * The owner is resolved at build time by `src/server/storage/repository.js` and travels
5
+ * in `renderPayload.repository`. Composing every GitHub, Pages and Coveralls URL
6
+ * from it is what keeps a fork's links pointing at the fork instead of upstream.
7
+ *
8
+ * @module src/client/components/core/Repository.js
9
+ * @namespace PwaRepository
10
+ */
11
+
12
+ /**
13
+ * Identity injected by the build.
14
+ * @returns {{owner: string, name: string, template: string, packageSuffix: string}}
15
+ * @memberof PwaRepository
16
+ */
17
+ const repositoryIdentity = () => window.renderPayload.repository;
18
+
19
+ /**
20
+ * Repository holding the prebuilt package and its published demo.
21
+ * @returns {string}
22
+ * @memberof PwaRepository
23
+ */
24
+ const packageRepository = () => {
25
+ const { template, packageSuffix } = repositoryIdentity();
26
+ return `${template}${packageSuffix}`;
27
+ };
28
+
29
+ /**
30
+ * Composes a github.com URL under the resolved owner.
31
+ * @param {...string} segments - Path segments after the owner.
32
+ * @returns {string}
33
+ * @memberof PwaRepository
34
+ */
35
+ const githubUrl = (...segments) =>
36
+ `https://github.com/${[repositoryIdentity().owner, ...segments].filter(Boolean).join('/')}/`;
37
+
38
+ /**
39
+ * Composes a GitHub Pages URL under the resolved owner.
40
+ * @param {string} repository - Repository publishing the page.
41
+ * @returns {string}
42
+ * @memberof PwaRepository
43
+ */
44
+ const githubPagesUrl = (repository) => `https://${repositoryIdentity().owner}.github.io/${repository}/`;
45
+
46
+ /**
47
+ * Coveralls report for the engine repository this build came from.
48
+ * @returns {string}
49
+ * @memberof PwaRepository
50
+ */
51
+ const coverallsUrl = () => {
52
+ const { owner, name } = repositoryIdentity();
53
+ return `https://coveralls.io/github/${owner}/${name}`;
54
+ };
55
+
56
+ export { coverallsUrl, githubPagesUrl, githubUrl, packageRepository, repositoryIdentity };
@@ -42,6 +42,13 @@ class Translate {
42
42
  static hasChangedListener(key) {
43
43
  return translateEvents.has(key);
44
44
  }
45
+ static text(keyLang, options = { disableTextFormat: false }) {
46
+ const translations = Translate.Data[keyLang];
47
+ if (!translations) return options.disableTextFormat ? keyLang : textFormatted(keyLang);
48
+ const lang = s('html')?.lang || 'en';
49
+ const value = translations[lang] ?? translations.en ?? keyLang;
50
+ return options.disableTextFormat ? value : textFormatted(value);
51
+ }
45
52
  static async emitChanged(detail) {
46
53
  await translateEvents.emit(TranslateEventType.changed, detail);
47
54
  }
@@ -1,20 +1,20 @@
1
1
  /**
2
2
  * Utility module for fullscreen mode management with cross-browser and PWA compatibility.
3
3
  * Provides robust fullscreen detection, event handling, and UI synchronization.
4
- * @module src/client/components/core/FullScreen.js
5
- * @namespace FullScreenClient
4
+ * @module src/client/components/core/ViewModeController.js
5
+ * @namespace ViewModeControllerClient
6
6
  */
7
7
  import { Responsive } from './Responsive.js';
8
8
  import { ToggleSwitch } from './ToggleSwitch.js';
9
9
  import { Translate } from './Translate.js';
10
- import { checkFullScreen, fullScreenIn, fullScreenOut, s } from './VanillaJs.js';
10
+ import { fullScreenIn, fullScreenOut, s } from './VanillaJs.js';
11
11
  /**
12
12
  * Manages fullscreen mode state, event handling, and UI synchronization.
13
13
  * Supports all major browsers and PWA/Nativefier environments with comprehensive
14
14
  * vendor-prefixed API detection.
15
- * @memberof FullScreenClient
15
+ * @memberof ViewModeControllerClient
16
16
  */
17
- class FullScreen {
17
+ class ViewModeController {
18
18
  /**
19
19
  * Internal state flag tracking the intended fullscreen mode.
20
20
  * @type {boolean}
@@ -43,7 +43,7 @@ class FullScreen {
43
43
  * - Mozilla (Firefox)
44
44
  * - Microsoft (IE/Edge)
45
45
  * @private
46
- * @memberof FullScreenClient.FullScreen
46
+ * @memberof ViewModeControllerClient.ViewModeController
47
47
  * @returns {boolean} True if currently in fullscreen mode, false otherwise.
48
48
  */
49
49
  static _isFullScreen() {
@@ -62,16 +62,16 @@ class FullScreen {
62
62
  * Prevents race conditions using the _syncInProgress flag.
63
63
  * Updates the toggle switch only if there's a mismatch between UI and actual state.
64
64
  * @private
65
- * @memberof FullScreenClient.FullScreen
65
+ * @memberof ViewModeControllerClient.ViewModeController
66
66
  * @returns {void}
67
67
  */
68
68
  static _syncToggleState() {
69
- if (FullScreen._syncInProgress) return;
70
- FullScreen._syncInProgress = true;
71
- const actualFullScreen = FullScreen._isFullScreen();
69
+ if (ViewModeController._syncInProgress) return;
70
+ ViewModeController._syncInProgress = true;
71
+ const actualFullScreen = ViewModeController._isFullScreen();
72
72
  // Only update if there's a mismatch
73
- if (FullScreen._fullScreenSwitch !== actualFullScreen) {
74
- FullScreen._fullScreenSwitch = actualFullScreen;
73
+ if (ViewModeController._fullScreenSwitch !== actualFullScreen) {
74
+ ViewModeController._fullScreenSwitch = actualFullScreen;
75
75
  // Update toggle switch UI if it exists
76
76
  const toggle = s('.fullscreen');
77
77
  if (toggle && ToggleSwitch.Tokens[`fullscreen`]) {
@@ -82,18 +82,18 @@ class FullScreen {
82
82
  }
83
83
  }
84
84
  setTimeout(() => {
85
- FullScreen._syncInProgress = false;
85
+ ViewModeController._syncInProgress = false;
86
86
  }, 100);
87
87
  }
88
88
  /**
89
89
  * Event handler for fullscreen change events.
90
90
  * Triggers UI state synchronization when fullscreen mode changes.
91
91
  * @private
92
- * @memberof FullScreenClient.FullScreen
92
+ * @memberof ViewModeControllerClient.ViewModeController
93
93
  * @returns {void}
94
94
  */
95
95
  static _handleFullScreenChange() {
96
- FullScreen._syncToggleState();
96
+ ViewModeController._syncToggleState();
97
97
  }
98
98
  /**
99
99
  * Attaches all necessary event listeners for fullscreen mode detection.
@@ -103,20 +103,20 @@ class FullScreen {
103
103
  * - ESC key detection (fallback for manual fullscreen exit)
104
104
  * Only attaches listeners once to prevent duplicates.
105
105
  * @private
106
- * @memberof FullScreenClient.FullScreen
106
+ * @memberof ViewModeControllerClient.ViewModeController
107
107
  * @returns {void}
108
108
  */
109
109
  static _addEventListeners() {
110
- if (FullScreen._eventListenersAdded) return;
110
+ if (ViewModeController._eventListenersAdded) return;
111
111
  const events = ['fullscreenchange', 'webkitfullscreenchange', 'mozfullscreenchange', 'MSFullscreenChange'];
112
112
  events.forEach((eventName) => {
113
- document.addEventListener(eventName, () => FullScreen._handleFullScreenChange(), false);
113
+ document.addEventListener(eventName, () => ViewModeController._handleFullScreenChange(), false);
114
114
  });
115
115
  // Additional check for PWA/Nativefier window resize events
116
116
  window.addEventListener(
117
117
  'resize',
118
118
  () => {
119
- setTimeout(() => FullScreen._syncToggleState(), 150);
119
+ setTimeout(() => ViewModeController._syncToggleState(), 150);
120
120
  },
121
121
  false,
122
122
  );
@@ -125,77 +125,80 @@ class FullScreen {
125
125
  'keydown',
126
126
  (e) => {
127
127
  if (e.key === 'Escape' || e.keyCode === 27) {
128
- setTimeout(() => FullScreen._syncToggleState(), 100);
128
+ setTimeout(() => ViewModeController._syncToggleState(), 100);
129
129
  }
130
130
  },
131
131
  false,
132
132
  );
133
- FullScreen._eventListenersAdded = true;
133
+ ViewModeController._eventListenersAdded = true;
134
134
  }
135
135
  /**
136
136
  * Enters fullscreen mode if not already in fullscreen.
137
137
  * Updates internal state and triggers fullscreen API.
138
138
  * Verifies the state change after a delay to ensure synchronization.
139
139
  * @private
140
- * @memberof FullScreenClient.FullScreen
140
+ * @memberof ViewModeControllerClient.ViewModeController
141
141
  * @returns {void}
142
142
  */
143
143
  static _enterFullScreen() {
144
- if (FullScreen._isFullScreen()) return;
145
- FullScreen._fullScreenSwitch = true;
144
+ if (ViewModeController._isFullScreen()) return;
145
+ ViewModeController._fullScreenSwitch = true;
146
146
  fullScreenIn();
147
147
  // Verify after attempt
148
- setTimeout(() => FullScreen._syncToggleState(), 300);
148
+ setTimeout(() => ViewModeController._syncToggleState(), 300);
149
149
  }
150
150
  /**
151
151
  * Exits fullscreen mode if currently in fullscreen.
152
152
  * Updates internal state and triggers fullscreen exit API.
153
153
  * Verifies the state change after a delay to ensure synchronization.
154
154
  * @private
155
- * @memberof FullScreenClient.FullScreen
155
+ * @memberof ViewModeControllerClient.ViewModeController
156
156
  * @returns {void}
157
157
  */
158
158
  static _exitFullScreen() {
159
- if (!FullScreen._isFullScreen()) return;
160
- FullScreen._fullScreenSwitch = false;
159
+ if (!ViewModeController._isFullScreen()) return;
160
+ ViewModeController._fullScreenSwitch = false;
161
161
  fullScreenOut();
162
162
  // Verify after attempt
163
- setTimeout(() => FullScreen._syncToggleState(), 300);
163
+ setTimeout(() => ViewModeController._syncToggleState(), 300);
164
164
  }
165
165
  /**
166
166
  * Renders the fullscreen toggle setting UI component.
167
167
  * Initializes fullscreen state detection, sets up event listeners,
168
168
  * and creates a toggle switch for user interaction.
169
169
  * Integrates with the Responsive system for dynamic updates.
170
- * @memberof FullScreenClient.FullScreen
170
+ * @memberof ViewModeControllerClient.ViewModeController
171
171
  * @returns {Promise<string>} A promise resolving to the HTML string for the fullscreen setting component.
172
172
  */
173
173
  static async RenderSetting() {
174
174
  // Initialize state from actual fullscreen status
175
- FullScreen._fullScreenSwitch = FullScreen._isFullScreen();
175
+ ViewModeController._fullScreenSwitch = ViewModeController._isFullScreen();
176
176
  // Setup event listeners once
177
- FullScreen._addEventListeners();
177
+ ViewModeController._addEventListeners();
178
178
  // Update responsive event
179
- Responsive.onChanged(() => {
180
- FullScreen._syncToggleState();
181
- }, { key: 'full-screen-settings' });
179
+ Responsive.onChanged(
180
+ () => {
181
+ ViewModeController._syncToggleState();
182
+ },
183
+ { key: 'full-screen-settings' },
184
+ );
182
185
  return html`<div class="in section-mp">
183
186
  ${await ToggleSwitch.instance({
184
187
  wrapper: true,
185
188
  wrapperLabel: html`<i class="fa-solid fa-expand"></i> ${Translate.instance('fullscreen')}`,
186
189
  id: 'fullscreen',
187
190
  disabledOnClick: true,
188
- checked: FullScreen._fullScreenSwitch,
191
+ checked: ViewModeController._fullScreenSwitch,
189
192
  on: {
190
193
  unchecked: () => {
191
- FullScreen._exitFullScreen();
194
+ ViewModeController._exitFullScreen();
192
195
  },
193
196
  checked: () => {
194
- FullScreen._enterFullScreen();
197
+ ViewModeController._enterFullScreen();
195
198
  },
196
199
  },
197
200
  })}
198
201
  </div>`;
199
202
  }
200
203
  }
201
- export { FullScreen };
204
+ export { ViewModeController };
@@ -1,5 +1,4 @@
1
1
  import { CryptoService } from '../../services/crypto/crypto.service.js';
2
- import { UserService } from '../../services/user/user.service.js';
3
2
  import { Auth } from './Auth.js';
4
3
  import { BtnIcon } from './BtnIcon.js';
5
4
  import { getId } from './CommonJs.js';
@@ -21,16 +20,6 @@ class Wallet {
21
20
  hash: 'SHA-256',
22
21
  };
23
22
  const format = 'jwk';
24
- (async () => {
25
- return;
26
- const { data: payload } = await UserService.get({ id: 'public-key-sign-token' });
27
- const signature = await window.crypto.subtle.sign(
28
- algorithm,
29
- keyPair.privateKey,
30
- new TextEncoder().encode(payload),
31
- );
32
- const base64Signature = btoa(String.fromCharCode(...new Uint8Array(signature)));
33
- })();
34
23
  const keyPair = await window.crypto.subtle.generateKey(algorithm, true, ['sign', 'verify']);
35
24
  const privateKey = await window.crypto.subtle.exportKey(format, keyPair.privateKey);
36
25
  const publicKey = await window.crypto.subtle.exportKey(format, keyPair.publicKey);
@@ -150,7 +150,13 @@ class PwaWorker {
150
150
  }
151
151
  const run = async () => {
152
152
  const registration = await this.getRegistration();
153
- if (!registration) await this.register();
153
+ if (registration) {
154
+ try {
155
+ await registration.update();
156
+ } catch (error) {
157
+ logger.error('Error updating service worker:', error);
158
+ }
159
+ } else await this.register();
154
160
  };
155
161
  if (document.readyState === 'complete') run();
156
162
  else window.addEventListener('load', run, { once: true });
@@ -1,11 +1,11 @@
1
1
  import { Css } from '../core/Css.js';
2
- import { FullScreen } from '../core/FullScreen.js';
2
+ import { ViewModeController } from '../core/ViewModeController.js';
3
3
  import { Translate } from '../core/Translate.js';
4
4
  import { Worker } from '../core/Worker.js';
5
5
 
6
6
  class SettingsCryptokoyn {
7
7
  static async instance() {
8
- let render = await FullScreen.RenderSetting();
8
+ let render = await ViewModeController.RenderSetting();
9
9
  render += await Css.RenderSetting();
10
10
  render += await Translate.RenderSetting();
11
11
  render += await Worker.RenderSetting();
@@ -3,6 +3,7 @@ import { BtnIcon } from '../core/BtnIcon.js';
3
3
  import { getId, newInstance, random } from '../core/CommonJs.js';
4
4
  import { Css, ThemeEvents, Themes, darkTheme } from '../core/Css.js';
5
5
  import { Docs } from '../core/Docs.js';
6
+ import { githubUrl } from '../core/Repository.js';
6
7
  import { EventsUI } from '../core/EventsUI.js';
7
8
  import { LogIn } from '../core/LogIn.js';
8
9
  import { LogOut } from '../core/LogOut.js';
@@ -567,7 +568,7 @@ class AppShellCyberiaPortal {
567
568
  html`<img class="inl cyberia-menu-icon" src="${getProxyPath()}assets/ui-icons/arrow-right.png" />`,
568
569
  coverageUrl: () => `${getProxyPath()}docs/hardhat-coverage`,
569
570
  demoUrl: () => `https://client.cyberiaonline.com/`,
570
- lastReleaseUrl: () => `https://github.com/underpostnet/engine-cyberia.git`,
571
+ lastReleaseUrl: () => githubUrl('engine-cyberia'),
571
572
  }),
572
573
  handleType: 'bar',
573
574
  observer: true,
@@ -1,11 +1,11 @@
1
1
  import { Css } from '../core/Css.js';
2
- import { FullScreen } from '../core/FullScreen.js';
2
+ import { ViewModeController } from '../core/ViewModeController.js';
3
3
  import { Translate } from '../core/Translate.js';
4
4
  import { Worker } from '../core/Worker.js';
5
5
 
6
6
  class SettingsCyberiaPortal {
7
7
  static async instance() {
8
- let render = await FullScreen.RenderSetting();
8
+ let render = await ViewModeController.RenderSetting();
9
9
  render += await Css.RenderSetting();
10
10
  render += await Translate.RenderSetting();
11
11
  render += await Worker.RenderSetting();
@@ -239,7 +239,7 @@ class AppShellDefault {
239
239
  `,
240
240
  );
241
241
  } else {
242
- const backgroundImage = `${getProxyPath()}assets/background/white0-min.jpg`;
242
+ const backgroundImage = `${getProxyPath()}assets/background/white.jpg`;
243
243
  htmls(
244
244
  `.style-ssr-background-image`,
245
245
  css`
@@ -1,11 +1,11 @@
1
1
  import { Css } from '../core/Css.js';
2
- import { FullScreen } from '../core/FullScreen.js';
2
+ import { ViewModeController } from '../core/ViewModeController.js';
3
3
  import { Translate } from '../core/Translate.js';
4
4
  import { Worker } from '../core/Worker.js';
5
5
 
6
6
  class SettingsDefault {
7
7
  static async instance() {
8
- let render = await FullScreen.RenderSetting();
8
+ let render = await ViewModeController.RenderSetting();
9
9
  render += await Css.RenderSetting();
10
10
  render += await Translate.RenderSetting();
11
11
  render += await Worker.RenderSetting();
@@ -1,11 +1,11 @@
1
1
  import { Css } from '../core/Css.js';
2
- import { FullScreen } from '../core/FullScreen.js';
2
+ import { ViewModeController } from '../core/ViewModeController.js';
3
3
  import { Translate } from '../core/Translate.js';
4
4
  import { Worker } from '../core/Worker.js';
5
5
 
6
6
  class SettingsItemledger {
7
7
  static async instance() {
8
- let render = await FullScreen.RenderSetting();
8
+ let render = await ViewModeController.RenderSetting();
9
9
  render += await Css.RenderSetting();
10
10
  render += await Translate.RenderSetting();
11
11
  render += await Worker.RenderSetting();
@@ -18,6 +18,7 @@ import { CyberpunkBloggerUnderpost } from './CyberpunkBloggerUnderpost.js';
18
18
  import { Badge } from '../core/Badge.js';
19
19
  import { SettingsUnderpost } from './SettingsUnderpost.js';
20
20
  import { Recover } from '../core/Recover.js';
21
+ import { githubUrl, repositoryIdentity } from '../core/Repository.js';
21
22
  import { PanelForm } from '../core/PanelForm.js';
22
23
  import { SearchBox } from '../core/SearchBox.js';
23
24
  import { DocumentSearchProvider } from './DocumentSearchProvider.js';
@@ -214,7 +215,7 @@ class AppShellUnderpost {
214
215
  text: html`<span class="menu-label-text">${Translate.instance('github')}</span>`,
215
216
  }),
216
217
  attrs: `data-id="github"`,
217
- tabHref: `https://github.com/underpostnet/`,
218
+ tabHref: githubUrl(),
218
219
  handleContainerClass: 'handle-btn-container',
219
220
  tooltipHtml: await Badge.instance(buildBadgeToolTipMenuOption('github')),
220
221
  })}
@@ -683,7 +684,7 @@ class AppShellUnderpost {
683
684
  });
684
685
 
685
686
  EventsUI.onClick(`.main-btn-github`, async () => {
686
- location.href = `https://github.com/underpostnet/pwa-microservices-template/`;
687
+ location.href = githubUrl(repositoryIdentity().template);
687
688
  });
688
689
  }
689
690
  }
@@ -1,11 +1,11 @@
1
1
  import { Css } from '../core/Css.js';
2
- import { FullScreen } from '../core/FullScreen.js';
2
+ import { ViewModeController } from '../core/ViewModeController.js';
3
3
  import { Translate } from '../core/Translate.js';
4
4
  import { Worker } from '../core/Worker.js';
5
5
 
6
6
  class SettingsUnderpost {
7
7
  static async instance() {
8
- let render = await FullScreen.RenderSetting();
8
+ let render = await ViewModeController.RenderSetting();
9
9
  render += await Css.RenderSetting();
10
10
  render += await Translate.RenderSetting();
11
11
  render += await Worker.RenderSetting();
@@ -87,6 +87,9 @@ cyberia instance [instance-code] [options]
87
87
  | `--import [path]` | Import from a backup directory (upsert, preserves UUIDs) |
88
88
  | `--conf` | With `--export`/`--import`: only `cyberia-instance.json` + `-conf.json` |
89
89
  | `--drop` | Drop all documents associated with the instance code |
90
+ | `--export-current-fallbackworld` | Capture the in-memory procedural fallback world, then export it |
91
+ | `--keep-fallback-codes` | Capture using the raw `fallback-map-*` / canonical action-quest codes |
92
+ | `--fallback-url <url>` | Capture the world a running engine serves instead of regenerating it |
90
93
  | `--env-path <path>` · `--mongo-host <host>` · `--dev` | env / DB / dev overrides |
91
94
 
92
95
  ```bash
@@ -95,6 +98,30 @@ cyberia instance FOREST --import ./backups/FOREST
95
98
  cyberia instance FOREST --drop
96
99
  ```
97
100
 
101
+ ### Capturing the procedural fallback world
102
+
103
+ The fallback world is never persisted: every engine process rebuilds it from the code defaults at
104
+ boot and serves it whenever a requested instance is absent. `--export-current-fallbackworld` freezes
105
+ that in-memory world into MongoDB under a real instance code — maps and portal topology, the
106
+ instance conf, and the content collections the fallback path serves from code rather than the DB
107
+ (skills, entity-type defaults, dialogues, actions, quests) — and then exports it like any other
108
+ instance.
109
+
110
+ ```bash
111
+ # Freeze the current fallback world as PROC-1 and back it up
112
+ cyberia instance PROC-1 --export-current-fallbackworld --dev
113
+
114
+ # Restore it later as an ordinary persisted instance
115
+ cyberia instance PROC-1 --import --dev
116
+ ```
117
+
118
+ Map, action and quest codes are namespaced under the instance code (`fallback-map-0` →
119
+ `PROC-1-map-0`) so successive captures never overwrite each other; `--keep-fallback-codes` writes
120
+ the canonical codes verbatim instead. Sprites are the one thing a capture cannot synthesise: when a
121
+ referenced item id has no `ObjectLayer` document the command aborts and names the ids to import with
122
+ `cyberia ol <ids> --import`. Staged fallback default items live only in the serving engine process,
123
+ so pass `--fallback-url http://localhost:4001` to capture a live world rather than regenerating it.
124
+
98
125
  ---
99
126
 
100
127
  ## `cyberia client-hints` — presentation hints
@@ -198,7 +225,7 @@ cyberia run-workflow build-server-dashboard
198
225
  ## Bringing up the full stack locally
199
226
 
200
227
  ```bash
201
- node bin run cluster 'express,dd-cyberia' --dev
228
+ node bin run cluster --deploy-id dd-cyberia --dev
202
229
  ```
203
230
 
204
231
  One command, no extra flags. It resets and rebuilds the node, deploys MongoDB / IPFS / Valkey, imports each database from its git backup, installs the Gateway API control plane, and deploys `dd-cyberia` behind it.
@@ -213,16 +240,16 @@ The run ends with a gateway status report: listener and route conditions, the wo
213
240
 
214
241
  ### With the MMO services
215
242
 
216
- The optional third path segment brings up custom instances from `engine-private/conf/dd-cyberia/conf.instances.json` in the same run:
243
+ `--instance-id` brings up custom instances from `engine-private/conf/dd-cyberia/conf.instances.json` in the same run:
217
244
 
218
245
  ```bash
219
- node bin run cluster 'express,dd-cyberia,mmo-server' --dev
220
- node bin run cluster 'express,dd-cyberia,mmo-server+mmo-client' --dev
246
+ node bin run cluster --deploy-id dd-cyberia --instance-id mmo-server --dev
247
+ node bin run cluster --deploy-id dd-cyberia --instance-id mmo-server,mmo-client --dev
221
248
  ```
222
249
 
223
250
  Each id runs only where `dd-cyberia` declares it, and only once the portal workload has rolled out — `cyberia-server` dials the engine's gRPC ClusterIP for its world configuration at boot, so the content authority has to be serving first. `mmo-server` names the whole variant family (`amethyst-strata-expansion`, `FOREST`, `TEST`); `mmo-server-forest` names one variant.
224
251
 
225
- `server.cyberiaonline.com` and `client.cyberiaonline.com` are issued the same self-signed certificates as the portal hosts and written into the same `/etc/hosts` pass, so the three services are reachable over TLS from a local browser without further setup. In production the same segment issues cert-manager certificates instead.
252
+ `server.cyberiaonline.com` and `client.cyberiaonline.com` are issued the same self-signed certificates as the portal hosts and written into the same `/etc/hosts` pass, so the three services are reachable over TLS from a local browser without further setup. In production the same flag issues cert-manager certificates instead.
226
253
 
227
254
  To place the static documents again without redeploying — after rebuilding the portal client, for instance:
228
255
 
@@ -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`.
@@ -20,7 +20,7 @@ hardhat/
20
20
  ObjectLayerToken.sol ERC-1155 multi-token contract
21
21
  scripts/
22
22
  deployObjectLayerToken.js Deployment script
23
- test/ Contract tests (Mocha + ethers v6)
23
+ test/ Contract tests (node:test + viem)
24
24
  deployments/ Deployment artifacts (auto-generated)
25
25
  ignition/ Hardhat Ignition modules (optional)
26
26
  networks/ Network-specific genesis configs
@@ -199,15 +199,32 @@ The artifact is consumed by:
199
199
 
200
200
  ## Running Tests
201
201
 
202
+ Contract tests are the `contracts` tier of the platform runner, so they run
203
+ alongside every other suite and report to the same dashboard:
204
+
202
205
  ```bash
203
- cd hardhat
204
- npx hardhat test
206
+ underpost test contracts # this tier only
207
+ underpost test contracts --allure # also write results for the dashboard
208
+ underpost test contracts --grep Burning
209
+ underpost test # every tier, contracts last
210
+ ```
211
+
212
+ Hardhat's own tasks stay available for contract-only work:
205
213
 
206
- # With gas report
207
- REPORT_GAS=true npx hardhat test
214
+ ```bash
215
+ cd hardhat
216
+ npm test # hardhat test
217
+ npm run coverage # Solidity line/statement coverage
218
+ REPORT_GAS=true npm test
208
219
  ```
209
220
 
210
- Tests use **Mocha + ethers v6** via `@nomicfoundation/hardhat-toolbox-mocha-ethers`. The `hardhat` in-process network simulates Besu behavior.
221
+ Tests use **node:test + viem** via `@nomicfoundation/hardhat-toolbox-viem`. The
222
+ `hardhat` in-process network simulates Besu behavior.
223
+
224
+ The tier runs the suites on Node's test runner rather than through `hardhat
225
+ test`: Hardhat pins its own reporter, and Node's can emit the JUnit results the
226
+ Allure dashboard ingests while still printing a readable run. Compilation still
227
+ goes through `hardhat build` first, so artifacts and the EVM are identical.
211
228
 
212
229
  ---
213
230
 
@@ -1,6 +1,6 @@
1
1
  # Cyberia Online — Development Roadmap
2
2
 
3
- **Current version:** 3.3.0 | **Target milestone:** Open Alpha
3
+ **Current version:** 3.3.73 | **Target milestone:** Open Alpha
4
4
 
5
5
  ---
6
6
 
@@ -18,7 +18,7 @@ _Stackable Rendering Layers as a Unified Tokenized Reality_
18
18
 
19
19
  ---
20
20
 
21
- **Version:** 3.3.0 | **Status:** Draft | **Authors:** Underpost Engineering
21
+ **Version:** 3.3.73 | **Status:** Draft | **Authors:** Underpost Engineering
22
22
 
23
23
  ---
24
24