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.
- package/.github/workflows/engine-cyberia.cd.yml +8 -2
- package/.github/workflows/npmpkg.ci.yml +1 -0
- package/.github/workflows/pwa-microservices-template-test.ci.yml +1 -1
- package/.github/workflows/release.cd.yml +2 -2
- package/.vscode/extensions.json +9 -9
- package/.vscode/settings.json +20 -4
- package/CHANGELOG.md +563 -1
- package/CLI-HELP.md +130 -34
- package/Dockerfile +0 -4
- package/README.md +194 -607
- package/bin/build.js +42 -12
- package/bin/build.template.js +187 -0
- package/bin/cyberia.js +1367 -281
- package/bin/deploy.js +582 -3
- package/bin/index.js +1367 -281
- package/bump.config.js +26 -0
- package/conf.js +195 -111
- package/deployment.yaml +6 -222
- package/hardhat/package-lock.json +118 -149
- package/hardhat/package.json +5 -4
- package/jsconfig.json +1 -1
- package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +2 -2
- package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +2 -2
- package/manifests/deployment/dd-cyberia-development/deployment.yaml +6 -222
- package/manifests/deployment/dd-cyberia-development/proxy.yaml +10 -118
- package/manifests/deployment/dd-default-development/deployment.yaml +2 -6
- package/manifests/deployment/dd-test-development/deployment.yaml +138 -66
- package/manifests/deployment/dd-test-development/proxy.yaml +41 -5
- package/manifests/kind-config-dev.yaml +8 -0
- package/manifests/lxd/lxd-admin-profile.yaml +12 -3
- package/manifests/mongodb/pv-pvc.yaml +44 -8
- package/manifests/mongodb/statefulset.yaml +55 -68
- package/manifests/mongodb-4.4/headless-service.yaml +10 -0
- package/manifests/mongodb-4.4/kustomization.yaml +3 -1
- package/manifests/mongodb-4.4/mongodb-nodeport.yaml +17 -0
- package/manifests/mongodb-4.4/pv-pvc.yaml +10 -14
- package/manifests/mongodb-4.4/statefulset.yaml +79 -0
- package/manifests/mongodb-4.4/storage-class.yaml +9 -0
- package/manifests/valkey/statefulset.yaml +1 -1
- package/manifests/valkey/valkey-nodeport.yaml +17 -0
- package/package.json +45 -24
- package/proxy.yaml +10 -118
- package/scripts/ipxe-setup.sh +52 -49
- package/scripts/k3s-node-setup.sh +83 -48
- package/scripts/lxd-vm-setup.sh +193 -8
- package/scripts/maas-nat-firewalld.sh +145 -0
- package/scripts/nat-iptables.sh +103 -18
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +18 -18
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +7 -14
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +38 -33
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +91 -36
- package/src/api/core/core.controller.js +10 -10
- package/src/api/core/core.router.js +19 -14
- package/src/api/core/core.service.js +15 -15
- package/src/api/crypto/crypto.controller.js +8 -8
- package/src/api/crypto/crypto.router.js +18 -12
- package/src/api/crypto/crypto.service.js +11 -11
- package/src/api/cyberia-action/cyberia-action.controller.js +74 -0
- package/src/api/cyberia-action/cyberia-action.model.js +87 -0
- package/src/api/cyberia-action/cyberia-action.router.js +31 -0
- package/src/api/cyberia-action/cyberia-action.service.js +42 -0
- package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +74 -0
- package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +99 -0
- package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +98 -0
- package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +152 -0
- package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +13 -13
- package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +11 -11
- package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +25 -20
- package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +22 -22
- package/src/api/cyberia-entity/cyberia-entity.controller.js +10 -10
- package/src/api/cyberia-entity/cyberia-entity.router.js +22 -18
- package/src/api/cyberia-entity/cyberia-entity.service.js +15 -15
- package/src/api/cyberia-instance/cyberia-fallback-world.js +83 -198
- package/src/api/cyberia-instance/cyberia-instance.controller.js +14 -14
- package/src/api/cyberia-instance/cyberia-instance.model.js +3 -0
- package/src/api/cyberia-instance/cyberia-instance.router.js +57 -52
- package/src/api/cyberia-instance/cyberia-instance.service.js +32 -67
- package/src/api/cyberia-instance/cyberia-portal-connector.js +20 -246
- package/src/api/cyberia-instance/cyberia-world-generator.js +505 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +10 -10
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +18 -49
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +22 -18
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +19 -15
- package/src/api/cyberia-map/cyberia-map.controller.js +10 -10
- package/src/api/cyberia-map/cyberia-map.router.js +35 -30
- package/src/api/cyberia-map/cyberia-map.service.js +17 -17
- package/src/api/cyberia-quest/cyberia-quest.controller.js +74 -0
- package/src/api/cyberia-quest/cyberia-quest.model.js +67 -0
- package/src/api/cyberia-quest/cyberia-quest.router.js +31 -0
- package/src/api/cyberia-quest/cyberia-quest.service.js +42 -0
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +74 -0
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.model.js +49 -0
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +31 -0
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +42 -0
- package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +451 -0
- package/src/api/default/default.controller.js +10 -10
- package/src/api/default/default.router.js +22 -18
- package/src/api/default/default.service.js +15 -15
- package/src/api/document/document.controller.js +12 -12
- package/src/api/document/document.model.js +10 -16
- package/src/api/document/document.router.js +28 -23
- package/src/api/document/document.service.js +100 -23
- package/src/api/file/file.controller.js +8 -8
- package/src/api/file/file.model.js +10 -10
- package/src/api/file/file.router.js +19 -13
- package/src/api/file/file.service.js +45 -43
- package/src/api/instance/instance.controller.js +10 -10
- package/src/api/instance/instance.model.js +4 -10
- package/src/api/instance/instance.router.js +29 -24
- package/src/api/instance/instance.service.js +16 -16
- package/src/api/ipfs/ipfs.controller.js +12 -12
- package/src/api/ipfs/ipfs.model.js +4 -13
- package/src/api/ipfs/ipfs.router.js +21 -16
- package/src/api/ipfs/ipfs.service.js +22 -36
- package/src/api/object-layer/object-layer.controller.js +12 -12
- package/src/api/object-layer/object-layer.model.js +4 -17
- package/src/api/object-layer/object-layer.router.js +512 -507
- package/src/api/object-layer/object-layer.service.js +29 -26
- package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +10 -10
- package/src/api/object-layer-render-frames/object-layer-render-frames.model.js +6 -16
- package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +22 -18
- package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +19 -15
- package/src/api/test/test.controller.js +8 -8
- package/src/api/test/test.router.js +17 -12
- package/src/api/test/test.service.js +8 -8
- package/src/api/types.js +24 -0
- package/src/api/user/guest.service.js +100 -0
- package/src/api/user/user.controller.js +6 -6
- package/src/api/user/user.model.js +8 -13
- package/src/api/user/user.router.js +297 -288
- package/src/api/user/user.service.js +103 -55
- package/src/cli/baremetal.js +132 -101
- package/src/cli/cluster.js +732 -217
- package/src/cli/db.js +106 -62
- package/src/cli/deploy.js +260 -149
- package/src/cli/fs.js +90 -9
- package/src/cli/image.js +43 -1
- package/src/cli/index.js +106 -16
- package/src/cli/ipfs.js +4 -6
- package/src/cli/kubectl.js +4 -1
- package/src/cli/lxd.js +1099 -223
- package/src/cli/monitor.js +9 -3
- package/src/cli/release.js +336 -86
- package/src/cli/repository.js +136 -53
- package/src/cli/run.js +599 -76
- package/src/cli/secrets.js +11 -2
- package/src/cli/ssh.js +1 -1
- package/src/cli/static.js +43 -115
- package/src/cli/test.js +9 -3
- package/src/client/Cryptokoyn.index.js +18 -21
- package/src/client/CyberiaPortal.index.js +19 -23
- package/src/client/Default.index.js +30 -36
- package/src/client/Itemledger.index.js +20 -26
- package/src/client/Underpost.index.js +19 -23
- package/src/client/components/core/404.js +4 -4
- package/src/client/components/core/500.js +4 -4
- package/src/client/components/core/Account.js +73 -60
- package/src/client/components/core/AgGrid.js +23 -33
- package/src/client/components/core/Alert.js +12 -13
- package/src/client/components/core/AppStore.js +1 -1
- package/src/client/components/core/Auth.js +40 -37
- package/src/client/components/core/Badge.js +7 -13
- package/src/client/components/core/BtnIcon.js +15 -17
- package/src/client/components/core/CalendarCore.js +42 -63
- package/src/client/components/core/Chat.js +13 -15
- package/src/client/components/core/ClientEvents.js +163 -0
- package/src/client/components/core/ColorPaletteElement.js +309 -0
- package/src/client/components/core/Content.js +17 -14
- package/src/client/components/core/Css.js +15 -71
- package/src/client/components/core/CssCore.js +12 -16
- package/src/client/components/core/D3Chart.js +4 -4
- package/src/client/components/core/Docs.js +64 -91
- package/src/client/components/core/DropDown.js +69 -91
- package/src/client/components/core/EventBus.js +96 -0
- package/src/client/components/core/EventsUI.js +14 -17
- package/src/client/components/core/FileExplorer.js +96 -228
- package/src/client/components/core/FullScreen.js +47 -75
- package/src/client/components/core/Input.js +24 -69
- package/src/client/components/core/Keyboard.js +25 -18
- package/src/client/components/core/KeyboardAvoidance.js +145 -0
- package/src/client/components/core/LoadingAnimation.js +25 -31
- package/src/client/components/core/LogIn.js +41 -41
- package/src/client/components/core/LogOut.js +23 -14
- package/src/client/components/core/Modal.js +544 -219
- package/src/client/components/core/NotificationManager.js +14 -18
- package/src/client/components/core/Panel.js +54 -50
- package/src/client/components/core/PanelForm.js +81 -177
- package/src/client/components/core/Polyhedron.js +110 -214
- package/src/client/components/core/PublicProfile.js +39 -32
- package/src/client/components/core/Recover.js +48 -44
- package/src/client/components/core/Responsive.js +88 -32
- package/src/client/components/core/RichText.js +9 -18
- package/src/client/components/core/Router.js +24 -3
- package/src/client/components/core/SearchBox.js +37 -37
- package/src/client/components/core/SignUp.js +39 -30
- package/src/client/components/core/SocketIo.js +31 -2
- package/src/client/components/core/SocketIoHandler.js +6 -6
- package/src/client/components/core/ToggleSwitch.js +8 -20
- package/src/client/components/core/ToolTip.js +5 -17
- package/src/client/components/core/Translate.js +56 -59
- package/src/client/components/core/Validator.js +26 -16
- package/src/client/components/core/Wallet.js +15 -26
- package/src/client/components/core/Worker.js +211 -276
- package/src/client/components/core/windowGetDimensions.js +7 -7
- package/src/client/components/cryptokoyn/{MenuCryptokoyn.js → AppShellCryptokoyn.js} +57 -57
- package/src/client/components/cryptokoyn/CssCryptokoyn.js +15 -15
- package/src/client/components/cryptokoyn/LogInCryptokoyn.js +6 -4
- package/src/client/components/cryptokoyn/LogOutCryptokoyn.js +6 -4
- package/src/client/components/cryptokoyn/RouterCryptokoyn.js +37 -0
- package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +4 -4
- package/src/client/components/cryptokoyn/SignUpCryptokoyn.js +6 -4
- package/src/client/components/cyberia/InstanceEngineCyberia.js +141 -60
- package/src/client/components/cyberia/MapEngineCyberia.js +691 -214
- package/src/client/components/cyberia/ObjectLayerEngine.js +19 -0
- package/src/client/components/cyberia/ObjectLayerEngineModal.js +1204 -94
- package/src/client/components/cyberia/ObjectLayerEngineViewer.js +196 -298
- package/src/client/components/cyberia/SharedDefaultsCyberia.js +330 -0
- package/src/client/components/cyberia-portal/{MenuCyberiaPortal.js → AppShellCyberiaPortal.js} +102 -102
- package/src/client/components/cyberia-portal/CssCyberiaPortal.js +15 -15
- package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +6 -4
- package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +6 -4
- package/src/client/components/cyberia-portal/MainBodyCyberiaPortal.js +4 -4
- package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +60 -0
- package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +4 -4
- package/src/client/components/cyberia-portal/SignUpCyberiaPortal.js +6 -4
- package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +4 -4
- package/src/client/components/default/{MenuDefault.js → AppShellDefault.js} +87 -87
- package/src/client/components/default/CssDefault.js +12 -12
- package/src/client/components/default/LogInDefault.js +6 -4
- package/src/client/components/default/LogOutDefault.js +6 -4
- package/src/client/components/default/RouterDefault.js +47 -0
- package/src/client/components/default/SettingsDefault.js +4 -4
- package/src/client/components/default/SignUpDefault.js +6 -4
- package/src/client/components/default/TranslateDefault.js +3 -3
- package/src/client/components/itemledger/{MenuItemledger.js → AppShellItemledger.js} +57 -57
- package/src/client/components/itemledger/CssItemledger.js +15 -15
- package/src/client/components/itemledger/LogInItemledger.js +6 -4
- package/src/client/components/itemledger/LogOutItemledger.js +6 -4
- package/src/client/components/itemledger/RouterItemledger.js +38 -0
- package/src/client/components/itemledger/SettingsItemledger.js +4 -4
- package/src/client/components/itemledger/SignUpItemledger.js +6 -4
- package/src/client/components/itemledger/TranslateItemledger.js +3 -3
- package/src/client/components/underpost/{MenuUnderpost.js → AppShellUnderpost.js} +88 -88
- package/src/client/components/underpost/CssUnderpost.js +14 -14
- package/src/client/components/underpost/CyberpunkBloggerUnderpost.js +4 -4
- package/src/client/components/underpost/DocumentSearchProvider.js +1 -1
- package/src/client/components/underpost/LabGalleryUnderpost.js +12 -15
- package/src/client/components/underpost/LogInUnderpost.js +6 -4
- package/src/client/components/underpost/LogOutUnderpost.js +6 -4
- package/src/client/components/underpost/RouterUnderpost.js +45 -0
- package/src/client/components/underpost/SettingsUnderpost.js +4 -4
- package/src/client/components/underpost/SignUpUnderpost.js +6 -4
- package/src/client/components/underpost/TranslateUnderpost.js +4 -4
- package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +235 -0
- package/src/client/public/cyberia-docs/ARCHITECTURE.md +83 -0
- package/src/client/public/cyberia-docs/CYBERIA-CLI.md +204 -0
- package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +291 -0
- package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +278 -0
- package/src/client/public/cyberia-docs/CYBERIA.md +259 -0
- package/src/client/public/cyberia-docs/ENTITY-PROFILE.md +241 -0
- package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +300 -0
- package/src/client/public/cyberia-docs/OFF-CHAIN-ECONOMY.md +279 -0
- package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +206 -0
- package/src/client/public/cyberia-docs/ROADMAP.md +240 -0
- package/src/client/public/cyberia-docs/UNDERPOST-PLATFORM.md +106 -0
- package/src/client/public/cyberia-docs/WHITE-PAPER.md +732 -0
- package/src/client/services/atlas-sprite-sheet/atlas-sprite-sheet.service.js +14 -20
- package/src/client/services/core/core.service.js +17 -49
- package/src/client/services/crypto/crypto.service.js +8 -13
- package/src/client/services/cyberia-action/cyberia-action.service.js +99 -0
- package/src/client/services/cyberia-client-hints/cyberia-client-hints.service.js +99 -0
- package/src/client/services/cyberia-dialogue/cyberia-dialogue.service.js +10 -16
- package/src/client/services/cyberia-entity/cyberia-entity.management.js +5 -5
- package/src/client/services/cyberia-entity/cyberia-entity.service.js +10 -16
- package/src/client/services/cyberia-instance/cyberia-instance.management.js +6 -6
- package/src/client/services/cyberia-instance/cyberia-instance.service.js +12 -18
- package/src/client/services/cyberia-instance-conf/cyberia-instance-conf.service.js +10 -16
- package/src/client/services/cyberia-map/cyberia-map.management.js +6 -6
- package/src/client/services/cyberia-map/cyberia-map.service.js +12 -18
- package/src/client/services/cyberia-quest/cyberia-quest.service.js +99 -0
- package/src/client/services/cyberia-quest-progress/cyberia-quest-progress.service.js +99 -0
- package/src/client/services/default/default.management.js +159 -267
- package/src/client/services/default/default.service.js +10 -16
- package/src/client/services/document/document.service.js +14 -19
- package/src/client/services/file/file.service.js +8 -13
- package/src/client/services/instance/instance.management.js +5 -5
- package/src/client/services/instance/instance.service.js +10 -15
- package/src/client/services/ipfs/ipfs.service.js +12 -18
- package/src/client/services/object-layer/object-layer.management.js +12 -12
- package/src/client/services/object-layer/object-layer.service.js +20 -26
- package/src/client/services/object-layer-render-frames/object-layer-render-frames.service.js +10 -16
- package/src/client/services/test/test.service.js +8 -13
- package/src/client/services/user/guest.service.js +86 -0
- package/src/client/services/user/user.management.js +5 -5
- package/src/client/services/user/user.service.js +14 -20
- package/src/client/ssr/body/404.js +3 -3
- package/src/client/ssr/body/500.js +3 -3
- package/src/client/ssr/body/CacheControl.js +5 -2
- package/src/client/ssr/body/DefaultSplashScreen.js +19 -12
- package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +13 -6
- package/src/client/ssr/head/PwaItemledger.js +197 -60
- package/src/client/ssr/mailer/DefaultRecoverEmail.js +19 -20
- package/src/client/ssr/mailer/DefaultVerifyEmail.js +15 -16
- package/src/client/ssr/views/CyberiaServerMetrics.js +982 -0
- package/src/client/ssr/{offline → views}/Maintenance.js +12 -11
- package/src/client/ssr/{offline → views}/NoNetworkConnection.js +3 -3
- package/src/client/ssr/{pages → views}/Test.js +2 -2
- package/src/client/sw/core.sw.js +274 -0
- package/src/db/DataBaseProvider.js +115 -15
- package/src/db/mariadb/MariaDB.js +2 -1
- package/src/db/mongo/MongoBootstrap.js +657 -0
- package/src/db/mongo/MongooseDB.js +129 -21
- package/src/grpc/cyberia/grpc-server.js +185 -105
- package/src/index.js +1 -1
- package/src/runtime/cyberia-client/Dockerfile +101 -0
- package/src/runtime/cyberia-client/Dockerfile.dev +82 -0
- package/src/runtime/cyberia-server/Dockerfile +62 -0
- package/src/runtime/cyberia-server/Dockerfile.dev +71 -0
- package/src/runtime/express/Dockerfile +4 -4
- package/src/runtime/express/Express.js +2 -2
- package/src/runtime/lampp/Dockerfile +8 -7
- package/src/runtime/wp/Dockerfile +11 -17
- package/src/runtime/wp/Wp.js +8 -5
- package/src/server/atlas-sprite-sheet-generator.js +4 -2
- package/src/server/auth.js +2 -2
- package/src/server/client-build-docs.js +46 -47
- package/src/server/client-build.js +371 -132
- package/src/server/client-formatted.js +47 -16
- package/src/server/conf.js +91 -87
- package/src/server/data-query.js +32 -20
- package/src/server/dns.js +22 -0
- package/src/server/ipfs-client.js +232 -91
- package/src/server/object-layer.js +1 -6
- package/src/server/process.js +192 -45
- package/src/server/proxy.js +9 -2
- package/src/server/runtime.js +1 -1
- package/src/server/semantic-layer-generator-floor.js +11 -51
- package/src/server/semantic-layer-generator-resource.js +259 -0
- package/src/server/semantic-layer-generator-skin.js +41 -171
- package/src/server/semantic-layer-generator.js +122 -14
- package/src/server/shape-generator.js +108 -0
- package/src/server/start.js +34 -8
- package/src/server/valkey.js +143 -235
- package/src/ws/IoInterface.js +16 -16
- package/src/ws/core/channels/core.ws.chat.js +11 -11
- package/src/ws/core/channels/core.ws.mailer.js +29 -29
- package/src/ws/core/channels/core.ws.stream.js +19 -19
- package/src/ws/core/core.ws.connection.js +8 -8
- package/src/ws/core/core.ws.server.js +6 -5
- package/src/ws/default/channels/default.ws.main.js +10 -10
- package/src/ws/default/default.ws.connection.js +4 -4
- package/src/ws/default/default.ws.server.js +4 -3
- package/tsconfig.docs.json +15 -0
- package/typedoc.dd-cyberia.json +29 -0
- package/typedoc.json +29 -0
- package/WHITE-PAPER.md +0 -1540
- package/bin/file.js +0 -196
- package/bin/vs.js +0 -74
- package/bin/zed.js +0 -84
- package/hardhat/README.md +0 -531
- package/hardhat/WHITE-PAPER.md +0 -1540
- package/jsdoc.dd-cyberia.json +0 -68
- package/jsdoc.json +0 -68
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +0 -413
- package/src/api/object-layer/README.md +0 -672
- package/src/client/components/core/ColorPalette.js +0 -5267
- package/src/client/components/core/JoyStick.js +0 -80
- package/src/client/components/cryptokoyn/RoutesCryptokoyn.js +0 -39
- package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +0 -223
- package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +0 -62
- package/src/client/components/cyberia-portal/ServerCyberiaPortal.js +0 -136
- package/src/client/components/default/RoutesDefault.js +0 -49
- package/src/client/components/itemledger/RoutesItemledger.js +0 -40
- package/src/client/components/underpost/RoutesUnderpost.js +0 -47
- package/src/client/ssr/email/DefaultRecoverEmail.js +0 -21
- package/src/client/ssr/email/DefaultVerifyEmail.js +0 -17
- package/src/client/ssr/pages/CyberiaServerMetrics.js +0 -461
- package/src/client/sw/default.sw.js +0 -127
- package/src/client/sw/template.sw.js +0 -84
- package/src/grpc/cyberia/OFF_CHAIN_ECONOMY.md +0 -305
- 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.
|