cyberia 3.2.5 → 3.2.12

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 (381) hide show
  1. package/.github/workflows/engine-cyberia.cd.yml +8 -2
  2. package/.github/workflows/npmpkg.ci.yml +1 -0
  3. package/.github/workflows/pwa-microservices-template-test.ci.yml +1 -1
  4. package/.github/workflows/release.cd.yml +2 -2
  5. package/.vscode/extensions.json +9 -9
  6. package/.vscode/settings.json +20 -4
  7. package/CHANGELOG.md +563 -1
  8. package/CLI-HELP.md +130 -34
  9. package/Dockerfile +0 -4
  10. package/README.md +194 -607
  11. package/bin/build.js +42 -12
  12. package/bin/build.template.js +187 -0
  13. package/bin/cyberia.js +1367 -281
  14. package/bin/deploy.js +582 -3
  15. package/bin/index.js +1367 -281
  16. package/bump.config.js +26 -0
  17. package/conf.js +195 -111
  18. package/deployment.yaml +6 -222
  19. package/hardhat/package-lock.json +118 -149
  20. package/hardhat/package.json +5 -4
  21. package/jsconfig.json +1 -1
  22. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +2 -2
  23. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +2 -2
  24. package/manifests/deployment/dd-cyberia-development/deployment.yaml +6 -222
  25. package/manifests/deployment/dd-cyberia-development/proxy.yaml +10 -118
  26. package/manifests/deployment/dd-default-development/deployment.yaml +2 -6
  27. package/manifests/deployment/dd-test-development/deployment.yaml +138 -66
  28. package/manifests/deployment/dd-test-development/proxy.yaml +41 -5
  29. package/manifests/kind-config-dev.yaml +8 -0
  30. package/manifests/lxd/lxd-admin-profile.yaml +12 -3
  31. package/manifests/mongodb/pv-pvc.yaml +44 -8
  32. package/manifests/mongodb/statefulset.yaml +55 -68
  33. package/manifests/mongodb-4.4/headless-service.yaml +10 -0
  34. package/manifests/mongodb-4.4/kustomization.yaml +3 -1
  35. package/manifests/mongodb-4.4/mongodb-nodeport.yaml +17 -0
  36. package/manifests/mongodb-4.4/pv-pvc.yaml +10 -14
  37. package/manifests/mongodb-4.4/statefulset.yaml +79 -0
  38. package/manifests/mongodb-4.4/storage-class.yaml +9 -0
  39. package/manifests/valkey/statefulset.yaml +1 -1
  40. package/manifests/valkey/valkey-nodeport.yaml +17 -0
  41. package/package.json +45 -24
  42. package/proxy.yaml +10 -118
  43. package/scripts/ipxe-setup.sh +52 -49
  44. package/scripts/k3s-node-setup.sh +83 -48
  45. package/scripts/lxd-vm-setup.sh +193 -8
  46. package/scripts/maas-nat-firewalld.sh +145 -0
  47. package/scripts/nat-iptables.sh +103 -18
  48. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +18 -18
  49. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +7 -14
  50. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +38 -33
  51. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +91 -36
  52. package/src/api/core/core.controller.js +10 -10
  53. package/src/api/core/core.router.js +19 -14
  54. package/src/api/core/core.service.js +15 -15
  55. package/src/api/crypto/crypto.controller.js +8 -8
  56. package/src/api/crypto/crypto.router.js +18 -12
  57. package/src/api/crypto/crypto.service.js +11 -11
  58. package/src/api/cyberia-action/cyberia-action.controller.js +74 -0
  59. package/src/api/cyberia-action/cyberia-action.model.js +87 -0
  60. package/src/api/cyberia-action/cyberia-action.router.js +31 -0
  61. package/src/api/cyberia-action/cyberia-action.service.js +42 -0
  62. package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +74 -0
  63. package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +99 -0
  64. package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +98 -0
  65. package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +152 -0
  66. package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +13 -13
  67. package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +11 -11
  68. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +25 -20
  69. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +22 -22
  70. package/src/api/cyberia-entity/cyberia-entity.controller.js +10 -10
  71. package/src/api/cyberia-entity/cyberia-entity.router.js +22 -18
  72. package/src/api/cyberia-entity/cyberia-entity.service.js +15 -15
  73. package/src/api/cyberia-instance/cyberia-fallback-world.js +83 -198
  74. package/src/api/cyberia-instance/cyberia-instance.controller.js +14 -14
  75. package/src/api/cyberia-instance/cyberia-instance.model.js +3 -0
  76. package/src/api/cyberia-instance/cyberia-instance.router.js +57 -52
  77. package/src/api/cyberia-instance/cyberia-instance.service.js +32 -67
  78. package/src/api/cyberia-instance/cyberia-portal-connector.js +20 -246
  79. package/src/api/cyberia-instance/cyberia-world-generator.js +505 -0
  80. package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +10 -10
  81. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +18 -49
  82. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +22 -18
  83. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +19 -15
  84. package/src/api/cyberia-map/cyberia-map.controller.js +10 -10
  85. package/src/api/cyberia-map/cyberia-map.router.js +35 -30
  86. package/src/api/cyberia-map/cyberia-map.service.js +17 -17
  87. package/src/api/cyberia-quest/cyberia-quest.controller.js +74 -0
  88. package/src/api/cyberia-quest/cyberia-quest.model.js +67 -0
  89. package/src/api/cyberia-quest/cyberia-quest.router.js +31 -0
  90. package/src/api/cyberia-quest/cyberia-quest.service.js +42 -0
  91. package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +74 -0
  92. package/src/api/cyberia-quest-progress/cyberia-quest-progress.model.js +49 -0
  93. package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +31 -0
  94. package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +42 -0
  95. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +451 -0
  96. package/src/api/default/default.controller.js +10 -10
  97. package/src/api/default/default.router.js +22 -18
  98. package/src/api/default/default.service.js +15 -15
  99. package/src/api/document/document.controller.js +12 -12
  100. package/src/api/document/document.model.js +10 -16
  101. package/src/api/document/document.router.js +28 -23
  102. package/src/api/document/document.service.js +100 -23
  103. package/src/api/file/file.controller.js +8 -8
  104. package/src/api/file/file.model.js +10 -10
  105. package/src/api/file/file.router.js +19 -13
  106. package/src/api/file/file.service.js +45 -43
  107. package/src/api/instance/instance.controller.js +10 -10
  108. package/src/api/instance/instance.model.js +4 -10
  109. package/src/api/instance/instance.router.js +29 -24
  110. package/src/api/instance/instance.service.js +16 -16
  111. package/src/api/ipfs/ipfs.controller.js +12 -12
  112. package/src/api/ipfs/ipfs.model.js +4 -13
  113. package/src/api/ipfs/ipfs.router.js +21 -16
  114. package/src/api/ipfs/ipfs.service.js +22 -36
  115. package/src/api/object-layer/object-layer.controller.js +12 -12
  116. package/src/api/object-layer/object-layer.model.js +4 -17
  117. package/src/api/object-layer/object-layer.router.js +512 -507
  118. package/src/api/object-layer/object-layer.service.js +29 -26
  119. package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +10 -10
  120. package/src/api/object-layer-render-frames/object-layer-render-frames.model.js +6 -16
  121. package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +22 -18
  122. package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +19 -15
  123. package/src/api/test/test.controller.js +8 -8
  124. package/src/api/test/test.router.js +17 -12
  125. package/src/api/test/test.service.js +8 -8
  126. package/src/api/types.js +24 -0
  127. package/src/api/user/guest.service.js +100 -0
  128. package/src/api/user/user.controller.js +6 -6
  129. package/src/api/user/user.model.js +8 -13
  130. package/src/api/user/user.router.js +297 -288
  131. package/src/api/user/user.service.js +103 -55
  132. package/src/cli/baremetal.js +132 -101
  133. package/src/cli/cluster.js +732 -217
  134. package/src/cli/db.js +106 -62
  135. package/src/cli/deploy.js +260 -149
  136. package/src/cli/fs.js +90 -9
  137. package/src/cli/image.js +43 -1
  138. package/src/cli/index.js +106 -16
  139. package/src/cli/ipfs.js +4 -6
  140. package/src/cli/kubectl.js +4 -1
  141. package/src/cli/lxd.js +1099 -223
  142. package/src/cli/monitor.js +9 -3
  143. package/src/cli/release.js +336 -86
  144. package/src/cli/repository.js +136 -53
  145. package/src/cli/run.js +599 -76
  146. package/src/cli/secrets.js +11 -2
  147. package/src/cli/ssh.js +1 -1
  148. package/src/cli/static.js +43 -115
  149. package/src/cli/test.js +9 -3
  150. package/src/client/Cryptokoyn.index.js +18 -21
  151. package/src/client/CyberiaPortal.index.js +19 -23
  152. package/src/client/Default.index.js +30 -36
  153. package/src/client/Itemledger.index.js +20 -26
  154. package/src/client/Underpost.index.js +19 -23
  155. package/src/client/components/core/404.js +4 -4
  156. package/src/client/components/core/500.js +4 -4
  157. package/src/client/components/core/Account.js +73 -60
  158. package/src/client/components/core/AgGrid.js +23 -33
  159. package/src/client/components/core/Alert.js +12 -13
  160. package/src/client/components/core/AppStore.js +1 -1
  161. package/src/client/components/core/Auth.js +40 -37
  162. package/src/client/components/core/Badge.js +7 -13
  163. package/src/client/components/core/BtnIcon.js +15 -17
  164. package/src/client/components/core/CalendarCore.js +42 -63
  165. package/src/client/components/core/Chat.js +13 -15
  166. package/src/client/components/core/ClientEvents.js +163 -0
  167. package/src/client/components/core/ColorPaletteElement.js +309 -0
  168. package/src/client/components/core/Content.js +17 -14
  169. package/src/client/components/core/Css.js +15 -71
  170. package/src/client/components/core/CssCore.js +12 -16
  171. package/src/client/components/core/D3Chart.js +4 -4
  172. package/src/client/components/core/Docs.js +64 -91
  173. package/src/client/components/core/DropDown.js +69 -91
  174. package/src/client/components/core/EventBus.js +96 -0
  175. package/src/client/components/core/EventsUI.js +14 -17
  176. package/src/client/components/core/FileExplorer.js +96 -228
  177. package/src/client/components/core/FullScreen.js +47 -75
  178. package/src/client/components/core/Input.js +24 -69
  179. package/src/client/components/core/Keyboard.js +25 -18
  180. package/src/client/components/core/KeyboardAvoidance.js +145 -0
  181. package/src/client/components/core/LoadingAnimation.js +25 -31
  182. package/src/client/components/core/LogIn.js +41 -41
  183. package/src/client/components/core/LogOut.js +23 -14
  184. package/src/client/components/core/Modal.js +544 -219
  185. package/src/client/components/core/NotificationManager.js +14 -18
  186. package/src/client/components/core/Panel.js +54 -50
  187. package/src/client/components/core/PanelForm.js +81 -177
  188. package/src/client/components/core/Polyhedron.js +110 -214
  189. package/src/client/components/core/PublicProfile.js +39 -32
  190. package/src/client/components/core/Recover.js +48 -44
  191. package/src/client/components/core/Responsive.js +88 -32
  192. package/src/client/components/core/RichText.js +9 -18
  193. package/src/client/components/core/Router.js +24 -3
  194. package/src/client/components/core/SearchBox.js +37 -37
  195. package/src/client/components/core/SignUp.js +39 -30
  196. package/src/client/components/core/SocketIo.js +31 -2
  197. package/src/client/components/core/SocketIoHandler.js +6 -6
  198. package/src/client/components/core/ToggleSwitch.js +8 -20
  199. package/src/client/components/core/ToolTip.js +5 -17
  200. package/src/client/components/core/Translate.js +56 -59
  201. package/src/client/components/core/Validator.js +26 -16
  202. package/src/client/components/core/Wallet.js +15 -26
  203. package/src/client/components/core/Worker.js +211 -276
  204. package/src/client/components/core/windowGetDimensions.js +7 -7
  205. package/src/client/components/cryptokoyn/{MenuCryptokoyn.js → AppShellCryptokoyn.js} +57 -57
  206. package/src/client/components/cryptokoyn/CssCryptokoyn.js +15 -15
  207. package/src/client/components/cryptokoyn/LogInCryptokoyn.js +6 -4
  208. package/src/client/components/cryptokoyn/LogOutCryptokoyn.js +6 -4
  209. package/src/client/components/cryptokoyn/RouterCryptokoyn.js +37 -0
  210. package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +4 -4
  211. package/src/client/components/cryptokoyn/SignUpCryptokoyn.js +6 -4
  212. package/src/client/components/cyberia/InstanceEngineCyberia.js +141 -60
  213. package/src/client/components/cyberia/MapEngineCyberia.js +691 -214
  214. package/src/client/components/cyberia/ObjectLayerEngine.js +19 -0
  215. package/src/client/components/cyberia/ObjectLayerEngineModal.js +1204 -94
  216. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +196 -298
  217. package/src/client/components/cyberia/SharedDefaultsCyberia.js +330 -0
  218. package/src/client/components/cyberia-portal/{MenuCyberiaPortal.js → AppShellCyberiaPortal.js} +102 -102
  219. package/src/client/components/cyberia-portal/CssCyberiaPortal.js +15 -15
  220. package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +6 -4
  221. package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +6 -4
  222. package/src/client/components/cyberia-portal/MainBodyCyberiaPortal.js +4 -4
  223. package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +60 -0
  224. package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +4 -4
  225. package/src/client/components/cyberia-portal/SignUpCyberiaPortal.js +6 -4
  226. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +4 -4
  227. package/src/client/components/default/{MenuDefault.js → AppShellDefault.js} +87 -87
  228. package/src/client/components/default/CssDefault.js +12 -12
  229. package/src/client/components/default/LogInDefault.js +6 -4
  230. package/src/client/components/default/LogOutDefault.js +6 -4
  231. package/src/client/components/default/RouterDefault.js +47 -0
  232. package/src/client/components/default/SettingsDefault.js +4 -4
  233. package/src/client/components/default/SignUpDefault.js +6 -4
  234. package/src/client/components/default/TranslateDefault.js +3 -3
  235. package/src/client/components/itemledger/{MenuItemledger.js → AppShellItemledger.js} +57 -57
  236. package/src/client/components/itemledger/CssItemledger.js +15 -15
  237. package/src/client/components/itemledger/LogInItemledger.js +6 -4
  238. package/src/client/components/itemledger/LogOutItemledger.js +6 -4
  239. package/src/client/components/itemledger/RouterItemledger.js +38 -0
  240. package/src/client/components/itemledger/SettingsItemledger.js +4 -4
  241. package/src/client/components/itemledger/SignUpItemledger.js +6 -4
  242. package/src/client/components/itemledger/TranslateItemledger.js +3 -3
  243. package/src/client/components/underpost/{MenuUnderpost.js → AppShellUnderpost.js} +88 -88
  244. package/src/client/components/underpost/CssUnderpost.js +14 -14
  245. package/src/client/components/underpost/CyberpunkBloggerUnderpost.js +4 -4
  246. package/src/client/components/underpost/DocumentSearchProvider.js +1 -1
  247. package/src/client/components/underpost/LabGalleryUnderpost.js +12 -15
  248. package/src/client/components/underpost/LogInUnderpost.js +6 -4
  249. package/src/client/components/underpost/LogOutUnderpost.js +6 -4
  250. package/src/client/components/underpost/RouterUnderpost.js +45 -0
  251. package/src/client/components/underpost/SettingsUnderpost.js +4 -4
  252. package/src/client/components/underpost/SignUpUnderpost.js +6 -4
  253. package/src/client/components/underpost/TranslateUnderpost.js +4 -4
  254. package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +235 -0
  255. package/src/client/public/cyberia-docs/ARCHITECTURE.md +83 -0
  256. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +204 -0
  257. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +291 -0
  258. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +278 -0
  259. package/src/client/public/cyberia-docs/CYBERIA.md +259 -0
  260. package/src/client/public/cyberia-docs/ENTITY-PROFILE.md +241 -0
  261. package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +300 -0
  262. package/src/client/public/cyberia-docs/OFF-CHAIN-ECONOMY.md +279 -0
  263. package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +206 -0
  264. package/src/client/public/cyberia-docs/ROADMAP.md +240 -0
  265. package/src/client/public/cyberia-docs/UNDERPOST-PLATFORM.md +106 -0
  266. package/src/client/public/cyberia-docs/WHITE-PAPER.md +732 -0
  267. package/src/client/services/atlas-sprite-sheet/atlas-sprite-sheet.service.js +14 -20
  268. package/src/client/services/core/core.service.js +17 -49
  269. package/src/client/services/crypto/crypto.service.js +8 -13
  270. package/src/client/services/cyberia-action/cyberia-action.service.js +99 -0
  271. package/src/client/services/cyberia-client-hints/cyberia-client-hints.service.js +99 -0
  272. package/src/client/services/cyberia-dialogue/cyberia-dialogue.service.js +10 -16
  273. package/src/client/services/cyberia-entity/cyberia-entity.management.js +5 -5
  274. package/src/client/services/cyberia-entity/cyberia-entity.service.js +10 -16
  275. package/src/client/services/cyberia-instance/cyberia-instance.management.js +6 -6
  276. package/src/client/services/cyberia-instance/cyberia-instance.service.js +12 -18
  277. package/src/client/services/cyberia-instance-conf/cyberia-instance-conf.service.js +10 -16
  278. package/src/client/services/cyberia-map/cyberia-map.management.js +6 -6
  279. package/src/client/services/cyberia-map/cyberia-map.service.js +12 -18
  280. package/src/client/services/cyberia-quest/cyberia-quest.service.js +99 -0
  281. package/src/client/services/cyberia-quest-progress/cyberia-quest-progress.service.js +99 -0
  282. package/src/client/services/default/default.management.js +159 -267
  283. package/src/client/services/default/default.service.js +10 -16
  284. package/src/client/services/document/document.service.js +14 -19
  285. package/src/client/services/file/file.service.js +8 -13
  286. package/src/client/services/instance/instance.management.js +5 -5
  287. package/src/client/services/instance/instance.service.js +10 -15
  288. package/src/client/services/ipfs/ipfs.service.js +12 -18
  289. package/src/client/services/object-layer/object-layer.management.js +12 -12
  290. package/src/client/services/object-layer/object-layer.service.js +20 -26
  291. package/src/client/services/object-layer-render-frames/object-layer-render-frames.service.js +10 -16
  292. package/src/client/services/test/test.service.js +8 -13
  293. package/src/client/services/user/guest.service.js +86 -0
  294. package/src/client/services/user/user.management.js +5 -5
  295. package/src/client/services/user/user.service.js +14 -20
  296. package/src/client/ssr/body/404.js +3 -3
  297. package/src/client/ssr/body/500.js +3 -3
  298. package/src/client/ssr/body/CacheControl.js +5 -2
  299. package/src/client/ssr/body/DefaultSplashScreen.js +19 -12
  300. package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +13 -6
  301. package/src/client/ssr/head/PwaItemledger.js +197 -60
  302. package/src/client/ssr/mailer/DefaultRecoverEmail.js +19 -20
  303. package/src/client/ssr/mailer/DefaultVerifyEmail.js +15 -16
  304. package/src/client/ssr/views/CyberiaServerMetrics.js +982 -0
  305. package/src/client/ssr/{offline → views}/Maintenance.js +12 -11
  306. package/src/client/ssr/{offline → views}/NoNetworkConnection.js +3 -3
  307. package/src/client/ssr/{pages → views}/Test.js +2 -2
  308. package/src/client/sw/core.sw.js +274 -0
  309. package/src/db/DataBaseProvider.js +115 -15
  310. package/src/db/mariadb/MariaDB.js +2 -1
  311. package/src/db/mongo/MongoBootstrap.js +657 -0
  312. package/src/db/mongo/MongooseDB.js +129 -21
  313. package/src/grpc/cyberia/grpc-server.js +185 -105
  314. package/src/index.js +1 -1
  315. package/src/runtime/cyberia-client/Dockerfile +101 -0
  316. package/src/runtime/cyberia-client/Dockerfile.dev +82 -0
  317. package/src/runtime/cyberia-server/Dockerfile +62 -0
  318. package/src/runtime/cyberia-server/Dockerfile.dev +71 -0
  319. package/src/runtime/express/Dockerfile +4 -4
  320. package/src/runtime/express/Express.js +2 -2
  321. package/src/runtime/lampp/Dockerfile +8 -7
  322. package/src/runtime/wp/Dockerfile +11 -17
  323. package/src/runtime/wp/Wp.js +8 -5
  324. package/src/server/atlas-sprite-sheet-generator.js +4 -2
  325. package/src/server/auth.js +2 -2
  326. package/src/server/client-build-docs.js +46 -47
  327. package/src/server/client-build.js +371 -132
  328. package/src/server/client-formatted.js +47 -16
  329. package/src/server/conf.js +91 -87
  330. package/src/server/data-query.js +32 -20
  331. package/src/server/dns.js +22 -0
  332. package/src/server/ipfs-client.js +232 -91
  333. package/src/server/object-layer.js +1 -6
  334. package/src/server/process.js +192 -45
  335. package/src/server/proxy.js +9 -2
  336. package/src/server/runtime.js +1 -1
  337. package/src/server/semantic-layer-generator-floor.js +11 -51
  338. package/src/server/semantic-layer-generator-resource.js +259 -0
  339. package/src/server/semantic-layer-generator-skin.js +41 -171
  340. package/src/server/semantic-layer-generator.js +122 -14
  341. package/src/server/shape-generator.js +108 -0
  342. package/src/server/start.js +34 -8
  343. package/src/server/valkey.js +143 -235
  344. package/src/ws/IoInterface.js +16 -16
  345. package/src/ws/core/channels/core.ws.chat.js +11 -11
  346. package/src/ws/core/channels/core.ws.mailer.js +29 -29
  347. package/src/ws/core/channels/core.ws.stream.js +19 -19
  348. package/src/ws/core/core.ws.connection.js +8 -8
  349. package/src/ws/core/core.ws.server.js +6 -5
  350. package/src/ws/default/channels/default.ws.main.js +10 -10
  351. package/src/ws/default/default.ws.connection.js +4 -4
  352. package/src/ws/default/default.ws.server.js +4 -3
  353. package/tsconfig.docs.json +15 -0
  354. package/typedoc.dd-cyberia.json +29 -0
  355. package/typedoc.json +29 -0
  356. package/WHITE-PAPER.md +0 -1540
  357. package/bin/file.js +0 -196
  358. package/bin/vs.js +0 -74
  359. package/bin/zed.js +0 -84
  360. package/hardhat/README.md +0 -531
  361. package/hardhat/WHITE-PAPER.md +0 -1540
  362. package/jsdoc.dd-cyberia.json +0 -68
  363. package/jsdoc.json +0 -68
  364. package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +0 -413
  365. package/src/api/object-layer/README.md +0 -672
  366. package/src/client/components/core/ColorPalette.js +0 -5267
  367. package/src/client/components/core/JoyStick.js +0 -80
  368. package/src/client/components/cryptokoyn/RoutesCryptokoyn.js +0 -39
  369. package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +0 -223
  370. package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +0 -62
  371. package/src/client/components/cyberia-portal/ServerCyberiaPortal.js +0 -136
  372. package/src/client/components/default/RoutesDefault.js +0 -49
  373. package/src/client/components/itemledger/RoutesItemledger.js +0 -40
  374. package/src/client/components/underpost/RoutesUnderpost.js +0 -47
  375. package/src/client/ssr/email/DefaultRecoverEmail.js +0 -21
  376. package/src/client/ssr/email/DefaultVerifyEmail.js +0 -17
  377. package/src/client/ssr/pages/CyberiaServerMetrics.js +0 -461
  378. package/src/client/sw/default.sw.js +0 -127
  379. package/src/client/sw/template.sw.js +0 -84
  380. package/src/grpc/cyberia/OFF_CHAIN_ECONOMY.md +0 -305
  381. package/src/grpc/cyberia/README.md +0 -326
@@ -0,0 +1,206 @@
1
+ # Quest System
2
+
3
+ **Module:** `src/api/cyberia-quest` · `src/api/cyberia-quest-progress`
4
+
5
+ ---
6
+
7
+ ## Overview
8
+
9
+ The Quest System is a **chain/tree-structured progression framework** linking NPC entities, player actions, map coordinates, and item rewards. Quests are the primary mechanism for guided player progression in Cyberia Online.
10
+
11
+ Quests are defined server-side as MongoDB documents and delivered to the client through the Engine REST API. Progress is tracked per-player in `CyberiaQuestProgress` documents.
12
+
13
+ > **Implementation status — Pre-alpha:** The Quest and QuestProgress MongoDB schemas and Engine REST API (`src/api/cyberia-quest`, `src/api/cyberia-quest-progress`) are defined and seeded. Go server integration (quest tracking, objective evaluation, reward delivery via FCT) is planned for the **Alpha milestone**. For pre-alpha, quest progress is ephemeral: it lives in the client session only and resets on page reload.
14
+
15
+ ---
16
+
17
+ ## Data Model
18
+
19
+ ### CyberiaQuest Schema
20
+
21
+ ```
22
+ CyberiaQuest {
23
+ code: String // stable slug, e.g. "fallback-intro-quest"
24
+ title: String
25
+ description: String
26
+
27
+ // Spatial origin — the NPC/entity cell that grants this quest
28
+ sourceMapCode: String
29
+ sourceCellX: Number
30
+ sourceCellY: Number
31
+
32
+ // Chain / tree unlock structure
33
+ prerequisiteCodes: [String] // AND logic — all must be completed to unlock
34
+ unlocksQuestCodes: [String] // quests activated on completion (chain or tree)
35
+
36
+ // Ordered linear step sequence
37
+ steps: [{
38
+ id: String
39
+ description: String
40
+ objectives: [{
41
+ type: String // 'collect' | 'talk' | 'kill'
42
+ itemId: String // semantic target (see Objective Types below)
43
+ quantity: Number // default: 1
44
+ }]
45
+ }]
46
+
47
+ // Rewards granted on quest completion
48
+ rewards: [{
49
+ itemId: String
50
+ quantity: Number
51
+ }]
52
+ }
53
+ ```
54
+
55
+ ### CyberiaQuestProgress Schema
56
+
57
+ ```
58
+ CyberiaQuestProgress {
59
+ playerId: String // Go server player UUID
60
+ questCode: String // references CyberiaQuest.code
61
+ status: String // 'active' | 'completed'
62
+
63
+ stepProgress: [{
64
+ stepId: String
65
+ objectiveProgress: [{
66
+ current: Number // current count toward objective
67
+ required: Number // denormalized from quest definition
68
+ }]
69
+ }]
70
+
71
+ startedAt: Date
72
+ completedAt: Date | null
73
+ }
74
+ ```
75
+
76
+ **Completeness is always computed, never stored.** A step is complete when all `objectiveProgress[i].current >= objectiveProgress[i].required`. The active step is always the first step where not all objectives are done.
77
+
78
+ ---
79
+
80
+ ## Objective Types
81
+
82
+ | `type` | `itemId` semantics | Completion trigger |
83
+ | --------- | -------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
84
+ | `collect` | ObjectLayer item ID that must appear in the player's inventory | Player inventory contains `>= quantity` of `itemId` |
85
+ | `talk` | `CyberiaAction.provideItemId` of the NPC to interact with | Player triggers a talk action where `provideItemId === itemId` and all `questDialogueCodes` viewed |
86
+ | `kill` | Skin item ID of the target entity (e.g. `"wason"`) | Player kills an entity whose active skin matches `itemId` |
87
+
88
+ ---
89
+
90
+ ## Quest Graph (Chain and Tree)
91
+
92
+ Quests form a **directed acyclic graph** via `prerequisiteCodes` → `unlocksQuestCodes`:
93
+
94
+ ```mermaid
95
+ graph LR
96
+ A["intro-quest\n(no prerequisites)"]
97
+ B["village-quest\n(requires: intro-quest)"]
98
+ C["forest-quest\n(requires: intro-quest)"]
99
+ D["final-quest\n(requires: village-quest AND forest-quest)"]
100
+
101
+ A -->|unlocksQuestCodes| B
102
+ A -->|unlocksQuestCodes| C
103
+ B -->|unlocksQuestCodes| D
104
+ C -->|unlocksQuestCodes| D
105
+ ```
106
+
107
+ **AND logic on prerequisites:** A quest only becomes available when **all** listed `prerequisiteCodes` are completed.
108
+
109
+ **Tree branching:** A quest can list multiple `unlocksQuestCodes`, enabling parallel quest branches that reconverge later.
110
+
111
+ ---
112
+
113
+ ## Quest Lifecycle
114
+
115
+ ```mermaid
116
+ sequenceDiagram
117
+ participant P as Player
118
+ participant G as Go Server
119
+ participant E as Engine (Node.js)
120
+ participant DB as MongoDB
121
+
122
+ P->>G: Tap NPC with grantQuestCode
123
+ G->>E: POST /api/cyberia-quest-progress (grant quest)
124
+ E->>DB: Create CyberiaQuestProgress { status: 'active' }
125
+ E-->>G: Progress document
126
+
127
+ loop For each game event (kill / collect / talk)
128
+ G->>E: PATCH /api/cyberia-quest-progress (increment objective)
129
+ E->>DB: objectiveProgress[i].current++
130
+ E-->>G: Updated progress
131
+ end
132
+
133
+ Note over G,E: All steps complete
134
+ G->>E: PATCH status → 'completed'
135
+ E->>DB: completedAt = now
136
+ G->>E: GET unlocksQuestCodes → activate successor quests
137
+ E->>DB: Create CyberiaQuestProgress for each unlocked quest
138
+ G-->>P: Deliver reward items (inventory grant + FCT ItemGain events)
139
+ ```
140
+
141
+ ---
142
+
143
+ ## Spatial Binding
144
+
145
+ Each `CyberiaQuest` can declare `sourceMapCode + sourceCellX + sourceCellY`, linking it to the map entity at that cell. This binding is used during instance initialization:
146
+
147
+ - `instance_loader.go` reads `CyberiaEntity.initCellX/initCellY` and correlates with quest `sourceCellX/sourceCellY` to assign quest-granting behaviors to the correct NPC entity at world construction time.
148
+ - The `ObjectLayerEngineModal` (Engine UI) allows editors to assign quest codes to entity cells visually.
149
+
150
+ ---
151
+
152
+ ## Reward Delivery
153
+
154
+ On quest completion, the Engine grants each `rewards[].{itemId, quantity}` to the player's inventory:
155
+
156
+ - Off-chain items are added to the player's `ObjectLayers` array in the Go server.
157
+ - If the item has an on-chain ERC-1155 token, the server relayer calls `mint(playerAddress, tokenId, quantity)` on the `ObjectLayerToken` contract.
158
+ - FCT `ItemGain` events (`MsgTypeItemFCT`, `FCTTypeItemGain`) are broadcast to the client for visual feedback.
159
+
160
+ ---
161
+
162
+ ## Step Progression Rules
163
+
164
+ 1. Steps are always processed in **declared order** — step N cannot advance until step N-1 is complete.
165
+ 2. Within a step, all objectives must be satisfied (any order).
166
+ 3. Quests do not fail — they remain `active` until completed or explicitly abandoned.
167
+ 4. The `required` count is **denormalized** from the quest definition into each `objectiveProgress` record at quest grant time, enabling O(1) progress checks without re-fetching the quest definition.
168
+
169
+ ---
170
+
171
+ ## Indexes
172
+
173
+ ```javascript
174
+ // CyberiaQuest
175
+ { code: 1 } // unique
176
+ { sourceMapCode: 1, sourceCellX: 1, sourceCellY: 1 }
177
+
178
+ // CyberiaQuestProgress
179
+ { playerId: 1, questCode: 1 } // unique
180
+ { playerId: 1, status: 1 }
181
+ ```
182
+
183
+ ---
184
+
185
+ ## Example Quest Document
186
+
187
+ ```json
188
+ {
189
+ "code": "wason-intro",
190
+ "title": "Meet Wason",
191
+ "description": "Find the village elder to begin your journey.",
192
+ "sourceMapCode": "cyberia-village",
193
+ "sourceCellX": 12,
194
+ "sourceCellY": 8,
195
+ "prerequisiteCodes": [],
196
+ "unlocksQuestCodes": ["wason-collection"],
197
+ "steps": [
198
+ {
199
+ "id": "step-talk",
200
+ "description": "Speak with Wason.",
201
+ "objectives": [{ "type": "talk", "itemId": "wason", "quantity": 1 }]
202
+ }
203
+ ],
204
+ "rewards": [{ "itemId": "health-potion", "quantity": 2 }]
205
+ }
206
+ ```
@@ -0,0 +1,240 @@
1
+ # Cyberia Online — Development Roadmap
2
+
3
+ **Current version:** 3.2.12 | **Target milestone:** Open Alpha
4
+
5
+ ---
6
+
7
+ ## Project Context
8
+
9
+ Cyberia Online is a real-time tap-based sandbox MMORPG built on three layers:
10
+
11
+ - **cyberia-client** (C/WASM) — browser-based game client
12
+ - **cyberia-server** (Go) — authoritative real-time game server (binary WebSocket AOI)
13
+ - **engine-cyberia** (Node.js) — data persistence, gRPC data service, REST API, content pipeline
14
+
15
+ The **Cyberia CLI** (`cyberia`) is an extension of the **Underpost CLI** specifically for this ecosystem. Underpost is the end-to-end bare-metal infrastructure platform; `cyberia` adds the game's content pipeline, economy toolchain, and MMO engine management. Unrecognized commands pass through to `underpost` for general infrastructure operations.
16
+
17
+ ---
18
+
19
+ ## Core Design Principle: Item ID as the Universal Identity
20
+
21
+ The central data-transmission primitive is the **item ID (`data.item.id`)** — a human-readable string slug (e.g. `hatchet`, `skin-dark-001`, `floor-desert`) that identifies an Object Layer entity.
22
+
23
+ **Why item IDs, not ObjectIds or hashes:**
24
+
25
+ - The Go server and C client never transmit full ObjectLayer documents over the game wire.
26
+ - The binary AOI protocol sends only item ID strings per entity in the AOI update packets.
27
+ - The C client uses these item IDs to independently request visual data and atlas metadata from the Engine REST API (`GET /api/object-layer/{itemId}`, `GET /api/atlas-sprite-sheet/{cid}`).
28
+ - This creates a clean separation: the **Go server** manages authoritative game state (positions, HP, coin balances, equipment activation); the **Engine REST API** manages and serves asset/metadata resolution; the **C client** handles all rendering and compositing.
29
+
30
+ ```
31
+ Go Server (binary AOI)
32
+ → sends entity itemId stack per AOI tick
33
+ → C client decodes itemIds
34
+ → C client independently fetches ObjectLayer metadata from Engine REST API
35
+ → C client fetches atlas CID blobs from Engine REST API
36
+ → C client composites layers + renders
37
+ ```
38
+
39
+ **gRPC is used only at startup** for world reconstruction (maps, entities, instance config, ObjectLayer cache warm-up). At runtime, the Go server holds all game state in memory and communicates with clients exclusively over binary WebSocket.
40
+
41
+ ---
42
+
43
+ ## Server Types (Production Topology)
44
+
45
+ Three server modes are planned, addressing different user needs and scaling properties:
46
+
47
+ | Mode | Session Persistence | Auth | Inventory | Economy |
48
+ | ------------------------- | ------------------------------------------- | -------------------------------- | ----------------------------------- | --------------------------------- |
49
+ | **Anonymous Off-Chain** | Ephemeral (in-memory, resets on disconnect) | None | itemId-based in-memory | Off-chain only |
50
+ | **Centralized Off-Chain** | Persistent (MongoDB via gRPC) | Username / password (User model) | Server-authoritative MongoDB | Off-chain only |
51
+ | **On-Chain** | Decentralized (Hyperledger Besu + IPFS) | secp256k1 ETH keys (EIP-712) | ObjectLayerToken ERC-1155 ownership | On-chain: CKY + NFT/semi-fungible |
52
+
53
+ ---
54
+
55
+ ## Release Policy
56
+
57
+ All release versions have **publicly available features** with no paywalled content. If a server's player capacity is reached, a **queue system** is implemented rather than hard-blocking users.
58
+
59
+ **Queue system standard:** Token-bucket or FIFO queue with estimated wait time displayed to the user, following the pattern used by major MMOs (World of Warcraft realm queues, FFXIV login queues). The queue is server-side; clients poll a lightweight `/api/v1/queue-status` endpoint. A server-sent event (SSE) or WebSocket notification fires when the slot is granted.
60
+
61
+ ---
62
+
63
+ ## Phase 1 — Pre-Alpha: Anonymous Off-Chain (Ephemeral Sessions)
64
+
65
+ **Status:** In progress — core game loop functional; action/quest systems pending.
66
+
67
+ ### What works today
68
+
69
+ - Binary WebSocket AOI protocol (entity movement, combat, HP, FCT)
70
+ - Object Layer item equip/unequip (`item_activation`) with equipment rules enforced
71
+ - Fountain & Sink coin economy (bot spawn coins, kill transfer, coin collect)
72
+ - Skill system: projectile, doppelganger, coin drop/transaction
73
+ - Bot AI: hostile/passive behavior, A\* pathfinding, aggro, respawn
74
+ - FrozenInteractionState entry/exit (`freeze_start`/`freeze_end`)
75
+ - ObjectLayer hot-reload via gRPC manifest diff (incremental update without restart)
76
+ - Go server metrics REST API (`/api/v1/metrics*`)
77
+ - Procedural content pipeline: floor, skin, resource semantic generators
78
+ - CLI toolchain: `cyberia ol`, `cyberia instance`, `cyberia run-workflow`
79
+
80
+ ### Remaining work for Pre-Alpha checkpoint
81
+
82
+ All items below target selected-user testing with **ephemeral, in-memory sessions** (state resets on disconnect):
83
+
84
+ | Task | Component | Notes |
85
+ | ------------------------------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
86
+ | NPC action routing in Go server | `cyberia-server` | Tap NPC entity → look up `CyberiaAction` from gRPC-loaded data; dispatch to action handler |
87
+ | Dialogue system integration | `cyberia-server` + `cyberia-client` | `freeze_start` → client shows dialogue modal; server validates talk objectives |
88
+ | Shop transaction handler | `cyberia-server` | Deduct coin balance, grant item to inventory (in-memory only) |
89
+ | Craft transaction handler | `cyberia-server` | Consume ingredients from in-memory inventory, grant output items |
90
+ | Quest tracking (in-memory) | `cyberia-server` | `CyberiaQuestProgress` lives only in player session struct; no persistence |
91
+ | Quest objective evaluation | `cyberia-server` | Intercept kill/collect/talk events; update in-memory progress |
92
+ | Quest reward delivery | `cyberia-server` | On step/quest completion: grant items + coins via FCT |
93
+ | Action/quest data via gRPC | `proto + engine + go` | Extend `GetFullInstanceResponse` with `CyberiaAction[]` and `CyberiaQuest[]` |
94
+ | Portal transitions | `cyberia-server` | Implement inter-map portal traversal (`portal` entity type collision) |
95
+ | Player capacity queue | `cyberia-server` | FIFO queue with `/api/v1/queue-status` SSE; deny connect when at capacity |
96
+
97
+ ### Pre-Alpha data contract
98
+
99
+ ```
100
+ Player session (in-memory Go struct only):
101
+ PlayerState {
102
+ ID: string // ephemeral UUID per connect
103
+ ObjectLayers: []ObjectLayerState // equipped item IDs + active flags
104
+ CoinBalance: uint32 // Fountain/Sink coin wallet
105
+ QuestProgress: []QuestProgress // ephemeral quest state (no persistence)
106
+ Frozen: bool
107
+ MapCode: string
108
+ Pos: Vec2
109
+ Life: float64
110
+ }
111
+ ```
112
+
113
+ No account, no persistent identity, no cross-session carry-over.
114
+
115
+ ---
116
+
117
+ ## Phase 2 — Alpha: Centralized Off-Chain (Persistent Sessions)
118
+
119
+ **Target:** Persistent player identity, inventory, and progress stored in MongoDB via gRPC.
120
+
121
+ ### Architecture additions
122
+
123
+ ```
124
+ cyberia-server (Go)
125
+ ↕ gRPC (new RPCs: GetPlayerState, SavePlayerState, CreateSession, etc.)
126
+ engine-cyberia (Node.js)
127
+ ↕ MongoDB
128
+ User (src/api/user) — account: email, username, password, sessions
129
+ PlayerState (new model) — per-player: inventory, coin balance, quest progress
130
+ ```
131
+
132
+ ### Milestone goals
133
+
134
+ | Task | Component | Notes |
135
+ | -------------------------- | ---------------- | -------------------------------------------------------------------- |
136
+ | `GetPlayerState` gRPC RPC | `proto + engine` | Returns saved inventory + coin balance + quest progress for a userId |
137
+ | `SavePlayerState` gRPC RPC | `proto + engine` | Persists player state on clean disconnect or periodic checkpoint |
138
+ | User model integration | `engine-cyberia` | Existing `src/api/user` (email/username/password + session tokens) |
139
+ | Player state model | `engine-cyberia` | New `src/api/player-state` Mongoose model linked to User |
140
+ | Go server session auth | `cyberia-server` | On connect: verify session token with Engine, load persistent state |
141
+ | Go server state checkpoint | `cyberia-server` | Periodic or on-disconnect `SavePlayerState` gRPC call |
142
+ | Alpha gRPC contract | `proto` | New service or new RPCs within `CyberiaDataService` |
143
+
144
+ ### Data contract (alpha)
145
+
146
+ ```
147
+ User (MongoDB):
148
+ email, username, passwordHash, role, activeSessions[]
149
+
150
+ PlayerState (MongoDB):
151
+ userId: ObjectId → User
152
+ instanceCode: string
153
+ coinBalance: uint32
154
+ inventory: [{ itemId: string, active: bool, quantity: int }]
155
+ questProgress: [{ questCode: string, stepId: string, objectives: [...] }]
156
+ ```
157
+
158
+ ---
159
+
160
+ ## Phase 3 — Beta: On-Chain (Decentralized, ETH-Key Sessions)
161
+
162
+ **Target:** Frictionless, zero-gas transactions directly with Ethereum secp256k1 keys on Hyperledger Besu. Full Object Layer ownership, interoperability, and decentralized player progress sync.
163
+
164
+ ### Architecture additions
165
+
166
+ ```
167
+ cyberia-client (C/WASM)
168
+ → EIP-712 sign-on: sign { domain, address, timestamp } with ETH private key
169
+ → session token = EIP-712 signature (no password)
170
+ → Engine verifies signature against ObjectLayerToken deployer / public address
171
+ → Go server loads on-chain inventory from ERC-1155 balances
172
+
173
+ Hyperledger Besu (IBFT2/QBFT, chainId 777771, gasPrice 0)
174
+ ObjectLayerToken (ERC-1155)
175
+ Token 0: CKY fungible (10M initial supply, 18 decimals)
176
+ Token IDs ≥ 1: Object Layer items (NFT supply=1, semi-fungible supply>1)
177
+ ```
178
+
179
+ ### Key properties
180
+
181
+ - **Zero-gas transactions** — Besu permissioned network, `gasPrice: 0` for all players.
182
+ - **secp256k1 key = player identity** — same key pair authenticates across all three domains (`cryptokoyn.net`, `itemledger.com`, `cyberiaonline.com`).
183
+ - **Inventory = ERC-1155 balances** — `balanceOf(playerAddress, tokenId)` is the authoritative inventory.
184
+ - **No server-side wallet custody** — player holds their own key; the server validates on-chain state.
185
+ - **Interoperability** — items owned on-chain can be used in any Cyberia instance that queries `ObjectLayerToken`.
186
+ - **Decentralized progress sync** — quest progress and equipment state checkpointed to Besu events.
187
+
188
+ ### EIP-712 domain
189
+
190
+ ```json
191
+ {
192
+ "name": "CyberiaObjectLayer",
193
+ "version": "1",
194
+ "chainId": 777771,
195
+ "verifyingContract": "<ObjectLayerToken address>"
196
+ }
197
+ ```
198
+
199
+ ### Milestone goals
200
+
201
+ | Task | Component | Notes |
202
+ | -------------------------------- | --------------------- | ---------------------------------------------------------------------------------------------- |
203
+ | EIP-712 sign-on in C client | `cyberia-client` | JS bridge calls `ethers.signTypedData` (MetaMask or injected key) |
204
+ | Signature verification in Engine | `engine-cyberia` | REST endpoint verifies EIP-712 sig; returns session token |
205
+ | On-chain inventory read | `engine-cyberia` | `balanceOf` query on ObjectLayerToken per item type for player address |
206
+ | On-chain inventory → gRPC | `proto + engine + go` | `GetPlayerState` returns on-chain balances as inventory |
207
+ | CKY transfer via Go server | `cyberia-server` | Kill transfer calls Engine which calls `ObjectLayerToken.safeTransferFrom` via gasless relayer |
208
+ | Gasless relayer | `engine-cyberia` | Engine holds the coinbase key; signs and submits Besu transactions on behalf of players |
209
+ | Item registration pipeline | `cyberia chain` CLI | `cyberia chain register` / `batch-register` to publish ObjectLayer items on-chain |
210
+ | ItemFCT on-chain binding | `cyberia-server` | ItemGain/Loss FCT events trigger Engine relayer to mint/burn on Besu |
211
+
212
+ ---
213
+
214
+ ## Domain Architecture
215
+
216
+ | Domain | Role | Smart Contract |
217
+ | ------------------- | -------------------------- | ------------------------------ |
218
+ | `cryptokoyn.net` | CKY fungible token hub | ObjectLayerToken Token ID 0 |
219
+ | `itemledger.com` | Object Layer item registry | ObjectLayerToken Token IDs ≥ 1 |
220
+ | `cyberiaonline.com` | Game runtime | Uses both token domains |
221
+
222
+ ---
223
+
224
+ ## Technology Stack Summary
225
+
226
+ | Layer | Technology | Purpose |
227
+ | ---------------- | -------------------------------- | --------------------------- |
228
+ | Game client | C / WASM / Emscripten / Raylib | In-browser rendering |
229
+ | Game server | Go / chi / gorilla WS | Real-time AOI |
230
+ | Engine | Node.js / Express / Mongoose | Data persistence + gRPC |
231
+ | Database | MongoDB (StatefulSet) | Game world data |
232
+ | Cache | Valkey | Session cache |
233
+ | Asset storage | IPFS + Kubo + IPFS Cluster | Content-addressed assets |
234
+ | Inter-service | gRPC + Protobuf | Go ↔ Node.js data pipeline |
235
+ | Blockchain | Hyperledger Besu (IBFT2/QBFT) | Permissioned EVM |
236
+ | Smart contracts | Solidity 0.8.27 / OpenZeppelin 5 | ERC-1155 ObjectLayerToken |
237
+ | Contract tooling | Hardhat 3.x + Ethers v6 | Compile, test, deploy |
238
+ | Infrastructure | Kubernetes (kubeadm / kind) | Container orchestration |
239
+ | Infra CLI | Underpost CLI | Bare-metal automation |
240
+ | Game CLI | Cyberia CLI (extends Underpost) | Content + economy toolchain |
@@ -0,0 +1,106 @@
1
+ # Underpost Platform
2
+
3
+ Underpost Platform is the base product. It owns the toolchain, deployment surface, PWA delivery, and operational infrastructure. Cyberia is an MMO extension that runs on top of it; Cyberia is not the platform.
4
+
5
+ ---
6
+
7
+ ## Toolchain and base infrastructure
8
+
9
+ Underpost Platform covers the shared delivery surface for applications and extensions:
10
+
11
+ | Area | What it owns |
12
+ | --------------- | ------------------------------------------------------------------------------------ |
13
+ | Toolchain | `underpost` CLI, build, deploy, release, metadata, secrets, environment selection |
14
+ | Infrastructure | bare metal, LXD, Kubernetes, K3s, kubeadm, images, SSH, runners |
15
+ | Data operations | MongoDB, MariaDB where needed, backups, cron, monitoring |
16
+ | Delivery | static build, SSR views, PWA packaging, service worker generation, host/path routing |
17
+
18
+ The platform is the operational backbone. It should stay the source of truth for deploy IDs, runtime selection, host/path layout, generated client assets, and environment resolution.
19
+
20
+ ---
21
+
22
+ ## Underpost CLI
23
+
24
+ `underpost` is the shared control surface for platform operations. Top-level commands (`underpost <cmd> --help` for options):
25
+
26
+ | Group | Command | Purpose |
27
+ | ------------------ | ----------- | ------------------------------------------------------------- |
28
+ | **Project / repo** | `new` | Initialize a new project, service, or configuration |
29
+ | | `clone` | Clone a GitHub repository into the current directory |
30
+ | | `pull` | Pull latest changes from a repository |
31
+ | | `cmt` | Manage commits (commit types and options) |
32
+ | | `push` | Push committed changes to a remote repository |
33
+ | | `install` | Import Underpost npm dependencies by copying |
34
+ | | `root` | Print the npm installation root path |
35
+ | **Build / config** | `client` | Build client assets / single replicas; sync environment ports |
36
+ | | `static` | Static build of pages, bundles, and documentation |
37
+ | | `env` | Set env vars and config for a deploy ID |
38
+ | | `config` | Manage Underpost configuration via operators |
39
+ | | `metadata` | Import/export cluster metadata |
40
+ | **Deploy / infra** | `cluster` | Manage Kubernetes clusters (defaults to Kind init) |
41
+ | | `deploy` | Manage deployments (defaults to development pods) |
42
+ | | `image` | Build, save, and load Docker images into clusters |
43
+ | | `secret` | Manage secrets across platforms |
44
+ | | `lxd` | Manage LXD VMs as K3s nodes (control plane / workers) |
45
+ | | `baremetal` | Bare-metal provisioning workflows |
46
+ | | `ip` | Show current public machine IP addresses |
47
+ | **Data / ops** | `db` | Database backup / restore and related operations |
48
+ | | `cron` | Run cron jobs or generate/apply K8s CronJob manifests |
49
+ | | `fs` | File storage (defaults to upload) |
50
+ | | `monitor` | Health-server monitoring for deployments |
51
+ | | `ssh` | Manage SSH credentials and sessions for cluster nodes |
52
+ | | `run` | Run scripts via named runners |
53
+ | | `test` | Run the test suites |
54
+ | | `release` | Release orchestrator for building and shipping CLI versions |
55
+
56
+ Cyberia-specific operations belong in `cyberia`, not in parallel platform commands. Use the base CLI for infrastructure and delivery, then layer Cyberia workflows on top.
57
+
58
+ ---
59
+
60
+ ## PWA delivery model
61
+
62
+ Every deployed client is delivered as a static application shell with PWA support.
63
+
64
+ - SSR views declare which pages exist and which fallbacks are precached.
65
+ - The service worker is generated from the configured view set.
66
+ - Offline and maintenance fallbacks are part of the build output, not hand-maintained runtime artifacts.
67
+ - Generated outputs such as `sw.js`, static pages, and compiled bundles are outputs only; never edit them by hand.
68
+
69
+ ```text
70
+ conf.dd-*.js / conf.ssr.json + src/client/sw/core.sw.js
71
+
72
+ └──── underpost client / build ────▶ generated index.html + sw.js + precache
73
+ ```
74
+
75
+ Keep those two inputs as the only authored PWA sources.
76
+
77
+ ---
78
+
79
+ ## Cyberia on top of the platform
80
+
81
+ Cyberia adds a three-service MMO runtime on top of the base platform:
82
+
83
+ | Service | Responsibility |
84
+ | ---------------- | ------------------------------------------------------------------------- |
85
+ | `engine-cyberia` | content, validation, persistence, gRPC/REST data services, asset metadata |
86
+ | `cyberia-server` | authoritative simulation and tick processing |
87
+ | `cyberia-client` | rendering, input, prediction, presentation |
88
+
89
+ ---
90
+
91
+ ## Operational rules
92
+
93
+ - Prefer one source of truth for config, deploy IDs, runtime selection, startup behavior, and generated assets.
94
+ - Reuse existing helpers and conventions instead of creating parallel implementations.
95
+ - Do not duplicate parsing, env resolution, or path normalization logic across modules.
96
+ - Treat generated artifacts as outputs only; never hand-edit them.
97
+ - `engine-private/` is a private external dependency. Reference it as private input only and never assume its contents exist locally.
98
+
99
+ ---
100
+
101
+ ## Safety and orchestration
102
+
103
+ - Any host-level change must be idempotent, reversible, and explicit.
104
+ - Never assume mounts, users, groups, namespaces, or volumes already exist.
105
+ - Validate before mutating: check paths, permissions, ownership, and target state first.
106
+ - Keep orchestration scripts resilient to interruption and safe to rerun.