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,259 @@
1
+ <div align="center">
2
+
3
+ <img src="https://www.cyberiaonline.com/assets/splash/apple-touch-icon-precomposed.png" alt="CYBERIA Network Object Layer Engine"/>
4
+
5
+ <h1>CYBERIA</h1>
6
+
7
+ **Network Object Layers**
8
+
9
+ _Stackable Rendering Layers as a Unified Tokenized Reality_
10
+
11
+ [![Version](https://img.shields.io/npm/v/cyberia.svg)](https://www.npmjs.org/package/cyberia)
12
+
13
+ </div>
14
+ Cyberia is an MMORPG extension built on the Underpost Platform. The platform owns the
15
+ toolchain, deployment surface, PWA delivery, and base infrastructure. Cyberia adds a three-service MMO
16
+ runtime: `engine-cyberia`, `cyberia-server`, and `cyberia-client`.
17
+
18
+ `engine-cyberia` is the **sidecar-backed data layer**: a Node.js sidecar that owns content,
19
+ validation, persistence, the gRPC/REST data services, and asset metadata. It backs the authoritative
20
+ Go server and the WASM client with data — it does not run the simulation or the presentation.
21
+
22
+ ---
23
+
24
+ ## Ecosystem at a glance
25
+
26
+ ```text
27
+ ┌───────────────────────────────────────────────┐
28
+ │ UNDERPOST PLATFORM │
29
+ │ toolchain · deploy · PWA build · static │
30
+ │ delivery · cluster/image/db · monitoring │
31
+ │ │
32
+ │ underpost CLI ──▶ builds & deploys all │
33
+ └───────────────────────────────────────────────┘
34
+ │ hosts / delivers
35
+
36
+ ╔═══════════════════════════════ CYBERIA MMO ══════════════════════════════════╗
37
+ ║ ║
38
+ ║ ┌──────────────────┐ gRPC ┌──────────────────┐ WebSocket ║
39
+ ║ │ engine-cyberia │ ────────▶ │ cyberia-server │ ───────────┐ ║
40
+ ║ │ (Node.js) │ │ (Go) │ │ ║
41
+ ║ │ │ │ │ ▼ ║
42
+ ║ │ content │ │ authoritative │ ┌──────────────────┐ ║
43
+ ║ │ validation │ │ simulation │ │ cyberia-client │ ║
44
+ ║ │ persistence │ │ world tick │ │ (C / WASM) │ ║
45
+ ║ │ gRPC/REST data │ │ AOI replication │ │ │ ║
46
+ ║ │ asset metadata │ │ │ │ rendering │ ║
47
+ ║ └──────────────────┘ └──────────────────┘ │ input │ ║
48
+ ║ │ │ prediction │ ║
49
+ ║ └──────────────── REST (content/assets) ─────▶│ presentation │ ║
50
+ ║ └──────────────────┘ ║
51
+ ╚═══════════════════════════════════════════════════════════════════════════════╝
52
+
53
+ One source of truth per concern:
54
+ content & world config ── engine-cyberia
55
+ real-time world state ── cyberia-server
56
+ presentation & input ── cyberia-client
57
+ ```
58
+
59
+ ---
60
+
61
+ ## 1. Toolchain and base infrastructure
62
+
63
+ Underpost Platform is the operational backbone and the source of truth for deploy IDs, runtime
64
+ selection, host/path layout, generated client assets, and environment resolution.
65
+
66
+ | Area | What it owns |
67
+ | --------------- | ------------------------------------------------------------------------------------ |
68
+ | Toolchain | `underpost` CLI, build, deploy, release, metadata, secrets, environment selection |
69
+ | Infrastructure | bare metal, LXD, Kubernetes, K3s, kubeadm, images, SSH, runners |
70
+ | Data operations | MongoDB, MariaDB where needed, backups, cron, monitoring |
71
+ | Delivery | static build, SSR views, PWA packaging, service worker generation, host/path routing |
72
+
73
+ `underpost` is the shared control surface for everything infrastructural. Cyberia-specific work belongs
74
+ in the `cyberia` CLI, never in parallel platform commands. When a concern already exists in `underpost`,
75
+ reuse it instead of forking a Cyberia variant.
76
+
77
+ ---
78
+
79
+ ## 2. PWA workflow
80
+
81
+ Every deployed client ships as a static application shell with PWA support. The pipeline has exactly two
82
+ inputs:
83
+
84
+ - the deploy `ssr` configuration in `conf.dd-*.js` (or `conf.ssr.json`)
85
+ - the service worker source in `src/client/sw/core.sw.js`
86
+
87
+ Everything else — `index.html` pages, `sw.js`, the precache list — is **generated** during the client
88
+ build. Treat them as outputs only; never hand-edit them.
89
+
90
+ Runtime service-worker behavior:
91
+
92
+ | Request | Strategy |
93
+ | ------------- | -------------------------------- |
94
+ | static assets | stale-while-revalidate |
95
+ | API `GET` | network-first + short cache |
96
+ | API mutations | network-only + background replay |
97
+ | navigation | network-first + fallback shells |
98
+
99
+ Fallback selection: offline network → offline fallback view; origin/server failure → maintenance
100
+ fallback view. Only fallback-marked views are guaranteed precached.
101
+
102
+ ---
103
+
104
+ ## 3. Cyberia MMO extension
105
+
106
+ ### Responsibility split
107
+
108
+ | Service | Owns | Must not own |
109
+ | ---------------- | ------------------------------------------------------------------------- | --------------------------------------------- |
110
+ | `engine-cyberia` | content, validation, persistence, gRPC/REST data services, asset metadata | authoritative simulation, render policy |
111
+ | `cyberia-server` | authoritative simulation, world tick, gameplay mutation, AOI replication | content authority, presentation metadata |
112
+ | `cyberia-client` | rendering, input, prediction, interpolation, presentation | authoritative world state, gameplay authority |
113
+
114
+ Two boundaries are non-negotiable:
115
+
116
+ - Do not move authoritative logic into the client.
117
+ - Do not move content-authority logic into the Go runtime.
118
+
119
+ ### Data flow
120
+
121
+ ```text
122
+ engine-cyberia ──gRPC──▶ cyberia-server ──WebSocket──▶ cyberia-client
123
+ engine-cyberia ──REST──────────────────────────────▶ cyberia-client
124
+ ```
125
+
126
+ ### `engine-cyberia` as the sidecar-backed data layer
127
+
128
+ `engine-cyberia` is the only Cyberia service that owns content-backed data and asset metadata.
129
+
130
+ - Boot-time world configuration flows from `engine-cyberia` to `cyberia-server` over gRPC `GetFullInstance`.
131
+ - Client-facing assets, object layers, dialogues, and presentation hints flow from `engine-cyberia` to `cyberia-client` over REST.
132
+ - Simulation never migrates into the sidecar, and presentation policy never migrates out of the client.
133
+
134
+ ### Runtime / health model
135
+
136
+ Three supervised processes run in parallel, each with its own monitor and reconnect loop. Gameplay is live only when all three are healthy at once.
137
+
138
+ ```text
139
+ ┌──────────────────────────────────────────────────────────────┐
140
+ │ SUPERVISION (parallel) │
141
+ │ │
142
+ │ engine-cyberia cyberia-server cyberia-client │
143
+ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
144
+ │ │ monitor │ │ monitor │ │ monitor │ │
145
+ │ │ +reconnect │ │ +reconnect │ │ +reconnect │ │
146
+ │ └─────┬──────┘ └─────┬──────┘ └─────┬──────┘ │
147
+ │ │ │ │ │
148
+ │ └──────────┬──────────┴──────────┬──────────┘ │
149
+ │ ▼ ▼ │
150
+ │ all three up & connected? │
151
+ └────────────────────────────┬─────────────────────────────────┘
152
+
153
+ ┌─────────────────────┼─────────────────────┐
154
+ ▼ ▼ ▼
155
+ ┌───────────┐ ┌───────────┐ ┌───────────┐
156
+ │ HEALTHY │ │ DEGRADED │ │ STANDBY │
157
+ │ all 3 up │ │ ≥1 service│ │ gameplay │
158
+ │ gameplay │ │ reconnect-│ │ paused │
159
+ │ live │ │ ing / down│ │ until all │
160
+ │ │ │ │ │ 3 healthy │
161
+ └───────────┘ └───────────┘ └───────────┘
162
+ ```
163
+
164
+ | State | Meaning |
165
+ | ---------- | -------------------------------------------------------------------- |
166
+ | `healthy` | all three Cyberia services are up and connected |
167
+ | `degraded` | at least one service is reconnecting or unavailable |
168
+ | `standby` | gameplay is paused because the full three-service set is not healthy |
169
+
170
+ ---
171
+
172
+ ## User commands
173
+
174
+ Use `underpost` for platform, infrastructure, build, and deploy. Use `cyberia` for MMO content and
175
+ extension workflows. Both share the same helpers — never duplicate config, env, or path logic.
176
+
177
+ ### Platform (underpost)
178
+
179
+ ```bash
180
+ # Bootstrap a new app (local app serves on http://localhost:4001)
181
+ underpost new app-name
182
+
183
+ # Build the client bundle / static + PWA output
184
+ underpost client
185
+ npm run build # node bin client
186
+
187
+ # Deploy and operate
188
+ underpost deploy <deploy-id>
189
+ underpost monitor
190
+ ```
191
+
192
+ ### Cyberia (cyberia) — `bin/cyberia.js`
193
+
194
+ | Group | Command | Purpose |
195
+ | -------------- | -------------------------------------- | -------------------------------------------------------- |
196
+ | `ol` | `cyberia ol [item-id]` | ObjectLayer import, procedural generation, atlas/sprite |
197
+ | `instance` | `cyberia instance [instance-code]` | export / import / drop a Cyberia instance and its data |
198
+ | `client-hints` | `cyberia client-hints [instance-code]` | per-instance presentation hints (palette, camera, icons) |
199
+ | `chain` | `cyberia chain <sub>` | Hyperledger Besu + ERC-1155 ObjectLayerToken lifecycle |
200
+ | `run-workflow` | `cyberia run-workflow <name>` | named maintenance/build scripts from `scripts/` |
201
+
202
+ Common examples:
203
+
204
+ ```bash
205
+ # Object layer content
206
+ cyberia ol hatchet,sword --import # import specific items
207
+ cyberia ol --import-types skin,floors # batch import by type (or: all)
208
+ cyberia ol floor-desert --generate --seed fx-42 # procedural generation
209
+ cyberia ol hatchet --to-atlas-sprite-sheet # build atlas sprite sheet
210
+ cyberia ol --drop --client-public # drop data + static asset folders
211
+
212
+ # Instance data
213
+ cyberia instance FOREST --export ./backup
214
+ cyberia instance FOREST --import ./backup
215
+ cyberia instance FOREST --drop
216
+
217
+ # Presentation hints
218
+ cyberia client-hints cyberia-main --seed-defaults
219
+
220
+ # Chain / token lifecycle
221
+ cyberia chain deploy --chain-id 777771
222
+ cyberia chain status
223
+ cyberia chain register / mint / transfer / burn / pause / unpause
224
+
225
+ # Named workflows
226
+ cyberia run-workflow import-default-items
227
+ cyberia run-workflow seed-skill-config --instance-code default
228
+ cyberia run-workflow seed-dialogues
229
+ cyberia run-workflow build-manifest
230
+ cyberia run-workflow build-server-dashboard
231
+ ```
232
+
233
+ ### Run the MMO services
234
+
235
+ ```bash
236
+ # engine-cyberia (Node.js data/content services)
237
+ npm start # node src/server
238
+
239
+ # cyberia-server (Go authoritative simulation)
240
+ cd cyberia-server && go run main.go # dev
241
+ cd cyberia-server && go build -o cyberia-server . && ./cyberia-server
242
+
243
+ # cyberia-client (C / WASM presentation)
244
+ cd cyberia-client && make -f Web.mk clean && make -f Web.mk web
245
+ cd cyberia-client && make -f Web.mk serve-development # serves on :8082
246
+ ```
247
+
248
+ ---
249
+
250
+ ## Operational guardrails
251
+
252
+ - Prefer one source of truth for config, deploy IDs, runtime selection, startup behavior, and generated assets.
253
+ - Reuse existing helpers and conventions instead of creating parallel implementations.
254
+ - Do not duplicate parsing, env resolution, or path normalization logic across modules.
255
+ - Treat generated artifacts (`sw.js`, static pages, atlases, README, manifests) as outputs only.
256
+ - Host-level changes must be idempotent, reversible, and explicit; validate before mutating; keep
257
+ orchestration scripts safe to rerun.
258
+ - `engine-private/` is a private external dependency. Reference it only as private input; never assume
259
+ its contents exist locally.
@@ -0,0 +1,241 @@
1
+ # Entity Profile
2
+
3
+ **Module:** `src/api/cyberia-entity` · `src/api/cyberia-instance-conf`
4
+
5
+ ---
6
+
7
+ ## Overview
8
+
9
+ An **Entity** is any object in the Cyberia Online game world — players, bots, NPCs, resource nodes, terrain tiles, portals, and skill-spawned projectiles. Every entity is represented as an ordered stack of **Object Layer** item IDs, a position on the grid, a type discriminator, and a runtime state.
10
+
11
+ ---
12
+
13
+ ## CyberiaEntity Schema (MongoDB)
14
+
15
+ ```
16
+ CyberiaEntity {
17
+ entityType: String // see Entity Type Registry below
18
+ initCellX: Number // initial grid column
19
+ initCellY: Number // initial grid row
20
+ dimX: Number // width in cells (default: 1)
21
+ dimY: Number // height in cells (default: 1)
22
+ color: String // RGBA fallback color (no active OL texture)
23
+ objectLayerItemIds: [String] // ordered list of ObjectLayer item IDs
24
+
25
+ // Bot-specific (ignored for non-bot entities)
26
+ spawnRadius: Number // max wander / respawn radius in cells
27
+ aggroRange: Number // attack range in cells (0 = passive)
28
+ maxLife: Number // maximum HP (0 = immortal)
29
+ lifeRegen: Number // HP regeneration per tick
30
+ }
31
+ ```
32
+
33
+ ---
34
+
35
+ ## Entity Type Registry
36
+
37
+ | `entityType` | Behavior | Map-placed | Description |
38
+ | -------------- | --------------------- | ---------- | ----------------------------------------------------- |
39
+ | `player` | interactive | no | Local (self) player |
40
+ | `other_player` | interactive | no | Remote players in AOI |
41
+ | `bot` | `hostile` / `passive` | yes | AI-controlled bot |
42
+ | `skill` | `skill` | no | Runtime-spawned projectile (created by skill system) |
43
+ | `coin` | `coin` | no | Runtime-spawned collectible (dropped on entity death) |
44
+ | `floor` | static | yes | Terrain tile (walkable) |
45
+ | `obstacle` | static | yes | Collision tile (blocks movement) |
46
+ | `portal` | static | yes | Zone transition trigger |
47
+ | `foreground` | static | yes | Foreground decoration layer |
48
+ | `resource` | extractable | yes | Exploitable world object (drops items on extraction) |
49
+
50
+ ---
51
+
52
+ ## Runtime PlayerState (Go)
53
+
54
+ ```go
55
+ type PlayerState struct {
56
+ ID string // Go server player UUID
57
+ MapCode string // current map
58
+ Pos Point // world position (float64 X, Y)
59
+ Dims Dimensions // entity size
60
+ Color ColorRGBA // fallback solid color
61
+ Direction Direction // UP, UP_RIGHT, RIGHT, DOWN_RIGHT, DOWN, DOWN_LEFT, LEFT, UP_LEFT, NONE
62
+ Mode ObjectLayerMode // IDLE, WALKING, TELEPORTING
63
+ ObjectLayers []ObjectLayerState // active OL stack: { ItemID, Active, Quantity }
64
+ MaxLife float64
65
+ Life float64
66
+ LifeRegen float64
67
+ Coins uint32 // flat coin balance (single source of truth)
68
+ Frozen bool // FrozenInteractionState active
69
+ FreezeReason string // "dialogue" | "inventory" | ...
70
+ Path []PointI // A* path (for smooth movement)
71
+ AOI Rectangle // current area-of-interest bounds
72
+ SumStatsLimit int // max aggregate stat sum (equipment rules)
73
+ }
74
+ ```
75
+
76
+ ---
77
+
78
+ ## ObjectLayer State
79
+
80
+ Each entity carries an ordered stack of `ObjectLayerState` entries:
81
+
82
+ ```go
83
+ type ObjectLayerState struct {
84
+ ItemID string // references ObjectLayer.data.item.id
85
+ Active bool // equipped/activated (only activable types can be true)
86
+ Quantity int // inventory quantity (for stackable items)
87
+ }
88
+ ```
89
+
90
+ The **active layers** determine the entity's rendered appearance and mechanical stats. The `Active` field is managed by the equipment rules.
91
+
92
+ ---
93
+
94
+ ## Equipment Rules
95
+
96
+ Equipment rules govern which item types may be simultaneously active on a character:
97
+
98
+ ```javascript
99
+ EQUIPMENT_RULES_DEFAULTS = {
100
+ activeItemTypes: ['skin', 'breastplate', 'weapon'], // only these types may be activated
101
+ onePerType: true, // at most one active item per type
102
+ requireSkin: true, // player must always have an active skin if they own any
103
+ };
104
+ ```
105
+
106
+ **Validation on `item_activation` request:**
107
+
108
+ 1. Reject if `item.type` not in `activeItemTypes`.
109
+ 2. If `onePerType`, deactivate any currently active item of the same type before activating the new one.
110
+ 3. If `requireSkin`, ensure a skin remains active after the change.
111
+
112
+ ---
113
+
114
+ ## Z-Order Rendering
115
+
116
+ The C client composites layers bottom-to-top by `item.type`:
117
+
118
+ ```
119
+ z-order type
120
+ ────── ───────────────────
121
+ 0 floor / obstacle / portal / foreground
122
+ 1 skin (base character body)
123
+ 2 breastplate (armor overlay)
124
+ 3 weapon (weapon overlay)
125
+ ```
126
+
127
+ `get_priority_for_type()` in `entity_render.c` maps item type → z-order integer. Multiple layers of the same type are rendered in declared order within that z-level.
128
+
129
+ ---
130
+
131
+ ## Stat Aggregation
132
+
133
+ Stats are aggregated across all **active** Object Layers on an entity. The server enforces a `sumStatsLimit` — the maximum sum of all stat values allowed for the player. Attempting to equip items that would exceed this limit is rejected.
134
+
135
+ **Active stats sum:**
136
+
137
+ $$\text{activeStatsSum} = \sum_{\text{active layers}} (\text{effect} + \text{resistance} + \text{agility} + \text{range} + \text{intelligence} + \text{utility})$$
138
+
139
+ The `sumStatsLimit` and `activeStatsSum` are sent to the client on each AOI update so the inventory UI can show remaining equip budget.
140
+
141
+ ---
142
+
143
+ ## Entity Status Indicator (ESI)
144
+
145
+ The Go server computes a status `u8` per entity each AOI tick. The C client renders the corresponding icon above the entity nameplate.
146
+
147
+ ```go
148
+ // Status constants (entity_status.go) — MUST stay in sync with JS STATUS_ICONS array
149
+ StatusNone = 0 // skill/coin bots, world objects
150
+ StatusPassive = 1 // passive bot
151
+ StatusHostile = 2 // hostile bot
152
+ StatusFrozen = 3 // player in FrozenInteractionState
153
+ StatusPlayer = 4 // normal alive player
154
+ StatusDead = 5 // dead / respawning entity
155
+ StatusResource = 6 // static exploitable resource
156
+ StatusResourceExtracted = 7 // depleted resource (respawning)
157
+ StatusActionProvider = 8 // NPC with available actions (bouncing chat icon)
158
+ ```
159
+
160
+ ---
161
+
162
+ ## Per-EntityType Defaults
163
+
164
+ Instance configuration (`CyberiaInstanceConf`) defines canonical defaults per entity type:
165
+
166
+ | Field | Description |
167
+ | ------------- | --------------------------------------------------------------------------------- |
168
+ | `liveItemIds` | ObjectLayer item IDs applied when entity is alive with no explicit items assigned |
169
+ | `deadItemIds` | ObjectLayer item IDs for dead/ghost/respawning state |
170
+ | `dropItemIds` | Items granted to the extractor when a resource entity is depleted |
171
+ | `colorKey` | Named palette color used as solid fallback when no active OL texture is available |
172
+
173
+ ---
174
+
175
+ ## Bot Entity Profile
176
+
177
+ Bot entities extend the base schema with runtime AI state:
178
+
179
+ ```go
180
+ type BotState struct {
181
+ // Inherits all PlayerState fields
182
+ Behavior string // "hostile" | "passive" | "skill" | "coin"
183
+ SpawnRadius int // wander / respawn radius
184
+ AggroRange int // attack range (0 = passive)
185
+ SpawnPoint PointI // original spawn cell
186
+ RespawnTimer time.Time // next respawn timestamp
187
+ }
188
+ ```
189
+
190
+ **Bot behaviors:**
191
+
192
+ | Behavior | AI Actions | Description |
193
+ | --------- | --------------------------------------- | ------------------------ |
194
+ | `hostile` | pathfind to player, attack | Aggressive enemy bot |
195
+ | `passive` | random wander | Non-aggressive world NPC |
196
+ | `skill` | move in direction, despawn on collision | Projectile entity |
197
+ | `coin` | static, collectible | Coin drop entity |
198
+
199
+ ---
200
+
201
+ ## Resource Entity Profile
202
+
203
+ Resource entities have a specific lifecycle:
204
+
205
+ ```
206
+ Alive (StatusResource)
207
+ → Player extracts (tap interaction)
208
+ → dropItemIds granted to player inventory
209
+ → Entity transitions to StatusResourceExtracted
210
+ → Respawn timer starts
211
+ → Entity returns to StatusResource
212
+ ```
213
+
214
+ ---
215
+
216
+ ## Entity Lifecycle Diagram
217
+
218
+ ```mermaid
219
+ stateDiagram-v2
220
+ [*] --> Alive : Spawned by instance_loader
221
+ Alive --> Dead : Life reaches 0 (combat/skill)
222
+ Alive --> ResourceExtracted : Player extracts (resource type)
223
+ Dead --> Alive : Respawn timer elapsed
224
+ ResourceExtracted --> Alive : Respawn timer elapsed
225
+ Alive --> Frozen : Player opens modal (FrozenInteractionState)
226
+ Frozen --> Alive : Player closes modal
227
+ Alive --> [*] : Entity removed from AOI
228
+ ```
229
+
230
+ ---
231
+
232
+ ## Coin Balance Architecture
233
+
234
+ Coins use a **flat + display split** design to avoid O(N) inventory traversal:
235
+
236
+ | Field | Type | Purpose |
237
+ | ----------------------------- | ------------------ | -------------------------------------------------------------------------------------------------- |
238
+ | `entity.Coins` | `uint32` | **Single source of truth** — all economy operations read/write this field O(1) |
239
+ | `coinItemId ObjectLayer slot` | `ObjectLayerState` | **Display only** — `Active: false`, `Quantity = Coins`, synced by `syncCoinOL()` on every mutation |
240
+
241
+ The `coin` item type is never activable. The inventory UI automatically renders it with a lock indicator.