@underpostnet/cyberia 3.2.80

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 (821) hide show
  1. package/.dockerignore +14 -0
  2. package/.env.example +144 -0
  3. package/.github/workflows/cyberia-client.cd.yml +40 -0
  4. package/.github/workflows/cyberia-server.cd.yml +40 -0
  5. package/.github/workflows/docker-image.cyberia-client.ci.yml +71 -0
  6. package/.github/workflows/docker-image.cyberia-client.dev.ci.yml +70 -0
  7. package/.github/workflows/docker-image.cyberia-server.ci.yml +71 -0
  8. package/.github/workflows/docker-image.cyberia-server.dev.ci.yml +71 -0
  9. package/.github/workflows/docker-image.engine-cyberia.ci.yml +53 -0
  10. package/.github/workflows/docker-image.engine-cyberia.dev.ci.yml +53 -0
  11. package/.github/workflows/engine-cyberia.cd.yml +157 -0
  12. package/.github/workflows/engine-cyberia.ci.yml +125 -0
  13. package/.github/workflows/ghpkg.ci.yml +160 -0
  14. package/.github/workflows/gitlab.ci.yml +20 -0
  15. package/.github/workflows/hardhat.ci.yml +82 -0
  16. package/.github/workflows/npmpkg.ci.yml +126 -0
  17. package/.github/workflows/publish.ci.yml +87 -0
  18. package/.github/workflows/publish.cyberia.ci.yml +79 -0
  19. package/.github/workflows/pwa-microservices-template-page.cd.yml +65 -0
  20. package/.github/workflows/pwa-microservices-template-test.ci.yml +33 -0
  21. package/.github/workflows/release.cd.yml +46 -0
  22. package/.nycrc +9 -0
  23. package/.prettierignore +12 -0
  24. package/.prettierrc +9 -0
  25. package/.vscode/extensions.json +10 -0
  26. package/.vscode/settings.json +26 -0
  27. package/CHANGELOG.md +2516 -0
  28. package/CLI-HELP.md +1099 -0
  29. package/Dockerfile +161 -0
  30. package/Dockerfile.dev +161 -0
  31. package/Dockerfile.test +165 -0
  32. package/LICENSE +21 -0
  33. package/README.md +259 -0
  34. package/baremetal/commission-workflows.json +211 -0
  35. package/baremetal/packer-workflows.json +24 -0
  36. package/bin/build.js +261 -0
  37. package/bin/build.template.js +33 -0
  38. package/bin/cyberia.js +5627 -0
  39. package/bin/deploy.js +1547 -0
  40. package/bin/index.js +5627 -0
  41. package/bump.config.js +27 -0
  42. package/compose.env +144 -0
  43. package/conf.js +952 -0
  44. package/deployment.yaml +418 -0
  45. package/docker-compose.yml +434 -0
  46. package/examples/static-page/README.md +150 -0
  47. package/examples/static-page/ssr-components/CustomPage.js +554 -0
  48. package/examples/static-page/static-config-example.json +57 -0
  49. package/hardhat/.env.example +31 -0
  50. package/hardhat/contracts/ObjectLayerToken.sol +391 -0
  51. package/hardhat/deployments/.gitkeep +0 -0
  52. package/hardhat/deployments/hardhat-ObjectLayerToken.json +11 -0
  53. package/hardhat/hardhat.config.js +136 -0
  54. package/hardhat/ignition/modules/.gitkeep +0 -0
  55. package/hardhat/ignition/modules/ObjectLayerToken.js +21 -0
  56. package/hardhat/networks/besu-object-layer.network.json +138 -0
  57. package/hardhat/package-lock.json +2871 -0
  58. package/hardhat/package.json +43 -0
  59. package/hardhat/scripts/deployObjectLayerToken.js +98 -0
  60. package/hardhat/test/ObjectLayerToken.js +696 -0
  61. package/hardhat/types/ethers-contracts/ObjectLayerToken.ts +690 -0
  62. package/hardhat/types/ethers-contracts/common.ts +92 -0
  63. package/hardhat/types/ethers-contracts/factories/ObjectLayerToken__factory.ts +1055 -0
  64. package/hardhat/types/ethers-contracts/factories/index.ts +4 -0
  65. package/hardhat/types/ethers-contracts/hardhat.d.ts +47 -0
  66. package/hardhat/types/ethers-contracts/index.ts +6 -0
  67. package/ipfs/configure-ipfs.sh +13 -0
  68. package/jsconfig.json +9 -0
  69. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +48 -0
  70. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +48 -0
  71. package/manifests/deployment/adminer/deployment.yaml +32 -0
  72. package/manifests/deployment/adminer/kustomization.yaml +7 -0
  73. package/manifests/deployment/adminer/service.yaml +13 -0
  74. package/manifests/deployment/dd-cyberia-development/deployment.yaml +418 -0
  75. package/manifests/deployment/dd-cyberia-development/grpc-service.yaml +17 -0
  76. package/manifests/deployment/dd-cyberia-development/proxy.yaml +189 -0
  77. package/manifests/deployment/dd-cyberia-development/pv-pvc.yaml +164 -0
  78. package/manifests/deployment/dd-default-development/deployment.yaml +163 -0
  79. package/manifests/deployment/dd-default-development/proxy.yaml +46 -0
  80. package/manifests/deployment/fastapi/backend-deployment.yml +120 -0
  81. package/manifests/deployment/fastapi/backend-service.yml +19 -0
  82. package/manifests/deployment/fastapi/frontend-deployment.yml +54 -0
  83. package/manifests/deployment/fastapi/frontend-service.yml +15 -0
  84. package/manifests/deployment/fastapi/initial_data.sh +8 -0
  85. package/manifests/deployment/kafka/deployment.yaml +67 -0
  86. package/manifests/deployment/mongo-express/deployment.yaml +62 -0
  87. package/manifests/deployment/phpmyadmin/deployment.yaml +54 -0
  88. package/manifests/deployment/playwright/deployment.yaml +52 -0
  89. package/manifests/deployment/spark/spark-pi-py.yaml +20 -0
  90. package/manifests/deployment/tensorflow/tf-gpu-test.yaml +63 -0
  91. package/manifests/envoy-service-nodeport.yaml +22 -0
  92. package/manifests/grafana/deployment.yaml +64 -0
  93. package/manifests/grafana/kustomization.yaml +7 -0
  94. package/manifests/grafana/pvc.yaml +12 -0
  95. package/manifests/grafana/service.yaml +14 -0
  96. package/manifests/grafana/storage-class.yaml +9 -0
  97. package/manifests/ipfs/configmap.yaml +64 -0
  98. package/manifests/ipfs/headless-service.yaml +35 -0
  99. package/manifests/ipfs/kustomization.yaml +8 -0
  100. package/manifests/ipfs/statefulset.yaml +149 -0
  101. package/manifests/ipfs/storage-class.yaml +9 -0
  102. package/manifests/kind-config-dev.yaml +20 -0
  103. package/manifests/kind-config.yaml +12 -0
  104. package/manifests/kubeadm-calico-config.yaml +14 -0
  105. package/manifests/letsencrypt-prod.yaml +14 -0
  106. package/manifests/lxd/lxd-admin-profile.yaml +26 -0
  107. package/manifests/lxd/lxd-preseed.yaml +30 -0
  108. package/manifests/mariadb/kustomization.yaml +9 -0
  109. package/manifests/mariadb/pv.yaml +12 -0
  110. package/manifests/mariadb/pvc.yaml +10 -0
  111. package/manifests/mariadb/service.yaml +10 -0
  112. package/manifests/mariadb/statefulset.yaml +56 -0
  113. package/manifests/mariadb/storage-class.yaml +10 -0
  114. package/manifests/mongodb/headless-service.yaml +10 -0
  115. package/manifests/mongodb/kustomization.yaml +11 -0
  116. package/manifests/mongodb/pv-pvc.yaml +59 -0
  117. package/manifests/mongodb/statefulset.yaml +113 -0
  118. package/manifests/mongodb/storage-class.yaml +9 -0
  119. package/manifests/mongodb-4.4/headless-service.yaml +10 -0
  120. package/manifests/mongodb-4.4/kustomization.yaml +9 -0
  121. package/manifests/mongodb-4.4/mongodb-nodeport.yaml +17 -0
  122. package/manifests/mongodb-4.4/pv-pvc.yaml +19 -0
  123. package/manifests/mongodb-4.4/service-deployment.yaml +61 -0
  124. package/manifests/mongodb-4.4/statefulset.yaml +79 -0
  125. package/manifests/mongodb-4.4/storage-class.yaml +9 -0
  126. package/manifests/mysql/kustomization.yaml +7 -0
  127. package/manifests/mysql/pv-pvc.yaml +27 -0
  128. package/manifests/mysql/statefulset.yaml +55 -0
  129. package/manifests/postgresql/configmap.yaml +9 -0
  130. package/manifests/postgresql/kustomization.yaml +10 -0
  131. package/manifests/postgresql/pv.yaml +15 -0
  132. package/manifests/postgresql/pvc.yaml +13 -0
  133. package/manifests/postgresql/service.yaml +10 -0
  134. package/manifests/postgresql/statefulset.yaml +37 -0
  135. package/manifests/prometheus/deployment.yaml +82 -0
  136. package/manifests/pv-pvc-dd.yaml +34 -0
  137. package/manifests/valkey/kustomization.yaml +7 -0
  138. package/manifests/valkey/service.yaml +10 -0
  139. package/manifests/valkey/statefulset.yaml +37 -0
  140. package/manifests/valkey/valkey-nodeport.yaml +17 -0
  141. package/mongodb/entrypoint.sh +76 -0
  142. package/nginx.conf +128 -0
  143. package/nodemon.json +6 -0
  144. package/package.json +101 -0
  145. package/packer/images/Rocky9Amd64/Makefile +62 -0
  146. package/packer/images/Rocky9Amd64/QUICKSTART.md +113 -0
  147. package/packer/images/Rocky9Amd64/README.md +122 -0
  148. package/packer/images/Rocky9Amd64/http/rocky9.ks.pkrtpl.hcl +114 -0
  149. package/packer/images/Rocky9Amd64/rocky9.pkr.hcl +164 -0
  150. package/packer/images/Rocky9Arm64/Makefile +69 -0
  151. package/packer/images/Rocky9Arm64/README.md +122 -0
  152. package/packer/images/Rocky9Arm64/http/rocky9.ks.pkrtpl.hcl +114 -0
  153. package/packer/images/Rocky9Arm64/rocky9.pkr.hcl +171 -0
  154. package/packer/scripts/fuse-nbd +64 -0
  155. package/packer/scripts/fuse-tar-root +63 -0
  156. package/proxy.yaml +189 -0
  157. package/pv-pvc.yaml +164 -0
  158. package/scripts/device-scan.sh +65 -0
  159. package/scripts/disk-clean.sh +182 -0
  160. package/scripts/disk-devices.sh +13 -0
  161. package/scripts/gen-fqdns.sh +14 -0
  162. package/scripts/gpu-diag.sh +19 -0
  163. package/scripts/ip-info.sh +118 -0
  164. package/scripts/ipxe-setup.sh +200 -0
  165. package/scripts/k3s-node-setup.sh +124 -0
  166. package/scripts/kubeadm-node-setup.sh +317 -0
  167. package/scripts/link-local-underpost-cli.sh +6 -0
  168. package/scripts/lxd-vm-setup.sh +208 -0
  169. package/scripts/maas-nat-firewalld.sh +145 -0
  170. package/scripts/maas-setup.sh +135 -0
  171. package/scripts/maas-upload-boot-resource.sh +183 -0
  172. package/scripts/nat-iptables.sh +111 -0
  173. package/scripts/nvim.sh +91 -0
  174. package/scripts/packer-init-vars-file.sh +40 -0
  175. package/scripts/packer-setup.sh +289 -0
  176. package/scripts/ports-ls.sh +33 -0
  177. package/scripts/quick-tftp.sh +19 -0
  178. package/scripts/rhel-grpc-setup.sh +56 -0
  179. package/scripts/rocky-kickstart.sh +986 -0
  180. package/scripts/rocky-pwa.sh +200 -0
  181. package/scripts/rocky-setup.sh +106 -0
  182. package/scripts/rpmfusion-ffmpeg-setup.sh +32 -0
  183. package/scripts/ssl.sh +170 -0
  184. package/scripts/test-monitor.sh +248 -0
  185. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +30 -0
  186. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +155 -0
  187. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +39 -0
  188. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +382 -0
  189. package/src/api/core/core.controller.js +8 -0
  190. package/src/api/core/core.model.js +11 -0
  191. package/src/api/core/core.router.js +23 -0
  192. package/src/api/core/core.service.js +30 -0
  193. package/src/api/crypto/crypto.controller.js +10 -0
  194. package/src/api/crypto/crypto.model.js +23 -0
  195. package/src/api/crypto/crypto.router.js +23 -0
  196. package/src/api/crypto/crypto.service.js +64 -0
  197. package/src/api/cyberia-action/cyberia-action.controller.js +8 -0
  198. package/src/api/cyberia-action/cyberia-action.model.js +79 -0
  199. package/src/api/cyberia-action/cyberia-action.router.js +21 -0
  200. package/src/api/cyberia-action/cyberia-action.service.js +58 -0
  201. package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +27 -0
  202. package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +100 -0
  203. package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +70 -0
  204. package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +152 -0
  205. package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +8 -0
  206. package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +36 -0
  207. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +20 -0
  208. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +57 -0
  209. package/src/api/cyberia-entity/cyberia-entity.controller.js +6 -0
  210. package/src/api/cyberia-entity/cyberia-entity.model.js +25 -0
  211. package/src/api/cyberia-entity/cyberia-entity.router.js +17 -0
  212. package/src/api/cyberia-entity/cyberia-entity.service.js +42 -0
  213. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +6 -0
  214. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.model.js +67 -0
  215. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +17 -0
  216. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +46 -0
  217. package/src/api/cyberia-instance/cyberia-fallback-world.js +337 -0
  218. package/src/api/cyberia-instance/cyberia-instance-boot.service.js +57 -0
  219. package/src/api/cyberia-instance/cyberia-instance-map.service.js +583 -0
  220. package/src/api/cyberia-instance/cyberia-instance.controller.js +42 -0
  221. package/src/api/cyberia-instance/cyberia-instance.model.js +117 -0
  222. package/src/api/cyberia-instance/cyberia-instance.router.js +75 -0
  223. package/src/api/cyberia-instance/cyberia-instance.service.js +190 -0
  224. package/src/api/cyberia-instance/cyberia-portal-connector.js +260 -0
  225. package/src/api/cyberia-instance/cyberia-world-generator.js +618 -0
  226. package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +6 -0
  227. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +200 -0
  228. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +17 -0
  229. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +46 -0
  230. package/src/api/cyberia-map/cyberia-map.controller.js +6 -0
  231. package/src/api/cyberia-map/cyberia-map.model.js +33 -0
  232. package/src/api/cyberia-map/cyberia-map.router.js +19 -0
  233. package/src/api/cyberia-map/cyberia-map.service.js +76 -0
  234. package/src/api/cyberia-quest/cyberia-quest.controller.js +9 -0
  235. package/src/api/cyberia-quest/cyberia-quest.model.js +67 -0
  236. package/src/api/cyberia-quest/cyberia-quest.router.js +26 -0
  237. package/src/api/cyberia-quest/cyberia-quest.service.js +97 -0
  238. package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +6 -0
  239. package/src/api/cyberia-quest-progress/cyberia-quest-progress.model.js +49 -0
  240. package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +21 -0
  241. package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +42 -0
  242. package/src/api/cyberia-saga/cyberia-saga.controller.js +6 -0
  243. package/src/api/cyberia-saga/cyberia-saga.model.js +59 -0
  244. package/src/api/cyberia-saga/cyberia-saga.router.js +17 -0
  245. package/src/api/cyberia-saga/cyberia-saga.service.js +42 -0
  246. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +1076 -0
  247. package/src/api/cyberia-skill/cyberia-skill.controller.js +6 -0
  248. package/src/api/cyberia-skill/cyberia-skill.model.js +50 -0
  249. package/src/api/cyberia-skill/cyberia-skill.router.js +17 -0
  250. package/src/api/cyberia-skill/cyberia-skill.service.js +42 -0
  251. package/src/api/default/default.controller.js +6 -0
  252. package/src/api/default/default.model.js +20 -0
  253. package/src/api/default/default.router.js +21 -0
  254. package/src/api/default/default.service.js +42 -0
  255. package/src/api/document/document.controller.js +9 -0
  256. package/src/api/document/document.model.js +95 -0
  257. package/src/api/document/document.router.js +32 -0
  258. package/src/api/document/document.service.js +633 -0
  259. package/src/api/file/file.controller.js +15 -0
  260. package/src/api/file/file.model.js +127 -0
  261. package/src/api/file/file.ref.json +39 -0
  262. package/src/api/file/file.router.js +36 -0
  263. package/src/api/file/file.service.js +499 -0
  264. package/src/api/instance/instance.controller.js +8 -0
  265. package/src/api/instance/instance.model.js +34 -0
  266. package/src/api/instance/instance.router.js +27 -0
  267. package/src/api/instance/instance.service.js +75 -0
  268. package/src/api/ipfs/ipfs.controller.js +8 -0
  269. package/src/api/ipfs/ipfs.model.js +77 -0
  270. package/src/api/ipfs/ipfs.router.js +26 -0
  271. package/src/api/ipfs/ipfs.service.js +145 -0
  272. package/src/api/object-layer/object-layer.controller.js +18 -0
  273. package/src/api/object-layer/object-layer.model.js +200 -0
  274. package/src/api/object-layer/object-layer.router.js +729 -0
  275. package/src/api/object-layer/object-layer.service.js +894 -0
  276. package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +6 -0
  277. package/src/api/object-layer-render-frames/object-layer-render-frames.model.js +93 -0
  278. package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +17 -0
  279. package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +46 -0
  280. package/src/api/test/test.controller.js +14 -0
  281. package/src/api/test/test.model.js +14 -0
  282. package/src/api/test/test.router.js +23 -0
  283. package/src/api/test/test.service.js +35 -0
  284. package/src/api/types.js +24 -0
  285. package/src/api/user/guest.service.js +100 -0
  286. package/src/api/user/postman_collection.json +216 -0
  287. package/src/api/user/user.build.js +16 -0
  288. package/src/api/user/user.controller.js +35 -0
  289. package/src/api/user/user.model.js +142 -0
  290. package/src/api/user/user.router.js +367 -0
  291. package/src/api/user/user.service.js +582 -0
  292. package/src/api.js +23 -0
  293. package/src/cli/baremetal.js +3947 -0
  294. package/src/cli/cloud-init.js +673 -0
  295. package/src/cli/cluster.js +1395 -0
  296. package/src/cli/db.js +1533 -0
  297. package/src/cli/deploy.js +1542 -0
  298. package/src/cli/docker-compose.js +802 -0
  299. package/src/cli/env.js +177 -0
  300. package/src/cli/fs.js +380 -0
  301. package/src/cli/image.js +389 -0
  302. package/src/cli/index.js +1059 -0
  303. package/src/cli/ipfs.js +182 -0
  304. package/src/cli/kickstart.js +271 -0
  305. package/src/cli/kubectl.js +214 -0
  306. package/src/cli/lxd.js +1232 -0
  307. package/src/cli/monitor.js +659 -0
  308. package/src/cli/release.js +595 -0
  309. package/src/cli/repository.js +1969 -0
  310. package/src/cli/run.js +3326 -0
  311. package/src/cli/secrets.js +151 -0
  312. package/src/cli/ssh.js +975 -0
  313. package/src/cli/static.js +653 -0
  314. package/src/cli/system.js +332 -0
  315. package/src/cli/test.js +176 -0
  316. package/src/client/Cryptokoyn.index.js +30 -0
  317. package/src/client/CyberiaPortal.index.js +31 -0
  318. package/src/client/Default.index.js +77 -0
  319. package/src/client/Itemledger.index.js +35 -0
  320. package/src/client/Underpost.index.js +31 -0
  321. package/src/client/components/core/404.js +20 -0
  322. package/src/client/components/core/500.js +20 -0
  323. package/src/client/components/core/Account.js +630 -0
  324. package/src/client/components/core/AgGrid.js +238 -0
  325. package/src/client/components/core/Alert.js +76 -0
  326. package/src/client/components/core/AppStore.js +69 -0
  327. package/src/client/components/core/Auth.js +353 -0
  328. package/src/client/components/core/Badge.js +26 -0
  329. package/src/client/components/core/Blockchain.js +41 -0
  330. package/src/client/components/core/Blog.js +9 -0
  331. package/src/client/components/core/BtnIcon.js +109 -0
  332. package/src/client/components/core/CalendarCore.js +437 -0
  333. package/src/client/components/core/Chat.js +62 -0
  334. package/src/client/components/core/ClientEvents.js +163 -0
  335. package/src/client/components/core/ColorPaletteElement.js +309 -0
  336. package/src/client/components/core/CommonJs.js +1014 -0
  337. package/src/client/components/core/Content.js +349 -0
  338. package/src/client/components/core/Css.js +1134 -0
  339. package/src/client/components/core/CssCore.js +881 -0
  340. package/src/client/components/core/D3Chart.js +44 -0
  341. package/src/client/components/core/Docs.js +478 -0
  342. package/src/client/components/core/DropDown.js +321 -0
  343. package/src/client/components/core/EventBus.js +96 -0
  344. package/src/client/components/core/EventsUI.js +130 -0
  345. package/src/client/components/core/FileExplorer.js +1406 -0
  346. package/src/client/components/core/FullScreen.js +201 -0
  347. package/src/client/components/core/Input.js +537 -0
  348. package/src/client/components/core/Keyboard.js +80 -0
  349. package/src/client/components/core/KeyboardAvoidance.js +145 -0
  350. package/src/client/components/core/LoadingAnimation.js +152 -0
  351. package/src/client/components/core/LogIn.js +212 -0
  352. package/src/client/components/core/LogOut.js +72 -0
  353. package/src/client/components/core/Logger.js +22 -0
  354. package/src/client/components/core/Modal.js +2956 -0
  355. package/src/client/components/core/NotificationManager.js +80 -0
  356. package/src/client/components/core/Pagination.js +252 -0
  357. package/src/client/components/core/Panel.js +1308 -0
  358. package/src/client/components/core/PanelForm.js +915 -0
  359. package/src/client/components/core/Polyhedron.js +947 -0
  360. package/src/client/components/core/PublicProfile.js +895 -0
  361. package/src/client/components/core/Recover.js +211 -0
  362. package/src/client/components/core/Responsive.js +146 -0
  363. package/src/client/components/core/RichText.js +33 -0
  364. package/src/client/components/core/Router.js +523 -0
  365. package/src/client/components/core/Scroll.js +76 -0
  366. package/src/client/components/core/SearchBox.js +1007 -0
  367. package/src/client/components/core/SignUp.js +153 -0
  368. package/src/client/components/core/SocketIo.js +163 -0
  369. package/src/client/components/core/SocketIoHandler.js +75 -0
  370. package/src/client/components/core/Stream.js +161 -0
  371. package/src/client/components/core/ToggleSwitch.js +89 -0
  372. package/src/client/components/core/ToolTip.js +78 -0
  373. package/src/client/components/core/Translate.js +694 -0
  374. package/src/client/components/core/Validator.js +140 -0
  375. package/src/client/components/core/VanillaJs.js +485 -0
  376. package/src/client/components/core/Wallet.js +95 -0
  377. package/src/client/components/core/WebComponent.js +44 -0
  378. package/src/client/components/core/Webhook.js +58 -0
  379. package/src/client/components/core/Worker.js +313 -0
  380. package/src/client/components/core/windowGetDimensions.js +269 -0
  381. package/src/client/components/cryptokoyn/AppShellCryptokoyn.js +352 -0
  382. package/src/client/components/cryptokoyn/AppStoreCryptokoyn.js +5 -0
  383. package/src/client/components/cryptokoyn/CssCryptokoyn.js +212 -0
  384. package/src/client/components/cryptokoyn/LogInCryptokoyn.js +16 -0
  385. package/src/client/components/cryptokoyn/LogOutCryptokoyn.js +12 -0
  386. package/src/client/components/cryptokoyn/RouterCryptokoyn.js +37 -0
  387. package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +16 -0
  388. package/src/client/components/cryptokoyn/SignUpCryptokoyn.js +11 -0
  389. package/src/client/components/cryptokoyn/SocketIoCryptokoyn.js +6 -0
  390. package/src/client/components/cyberia/ActionEngineCyberia.js +1867 -0
  391. package/src/client/components/cyberia/EntityEngineCyberia.js +585 -0
  392. package/src/client/components/cyberia/InstanceEngineCyberia.js +1088 -0
  393. package/src/client/components/cyberia/InstanceSelectionView.js +900 -0
  394. package/src/client/components/cyberia/MapEngineCyberia.js +1976 -0
  395. package/src/client/components/cyberia/ObjectLayerEngine.js +1540 -0
  396. package/src/client/components/cyberia/ObjectLayerEngineModal.js +2420 -0
  397. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +1522 -0
  398. package/src/client/components/cyberia/SharedDefaultsCyberia.js +528 -0
  399. package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +772 -0
  400. package/src/client/components/cyberia-portal/AppStoreCyberiaPortal.js +5 -0
  401. package/src/client/components/cyberia-portal/CssCyberiaPortal.js +254 -0
  402. package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +21 -0
  403. package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +16 -0
  404. package/src/client/components/cyberia-portal/MainBodyCyberiaPortal.js +518 -0
  405. package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +72 -0
  406. package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +16 -0
  407. package/src/client/components/cyberia-portal/SignUpCyberiaPortal.js +13 -0
  408. package/src/client/components/cyberia-portal/SocketIoCyberiaPortal.js +6 -0
  409. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +48 -0
  410. package/src/client/components/default/AppShellDefault.js +765 -0
  411. package/src/client/components/default/AppStoreDefault.js +5 -0
  412. package/src/client/components/default/CommonDefault.js +29 -0
  413. package/src/client/components/default/CssDefault.js +27 -0
  414. package/src/client/components/default/LogInDefault.js +16 -0
  415. package/src/client/components/default/LogOutDefault.js +12 -0
  416. package/src/client/components/default/RouterDefault.js +47 -0
  417. package/src/client/components/default/SettingsDefault.js +16 -0
  418. package/src/client/components/default/SignUpDefault.js +11 -0
  419. package/src/client/components/default/SocketIoDefault.js +6 -0
  420. package/src/client/components/default/TranslateDefault.js +7 -0
  421. package/src/client/components/itemledger/AppShellItemledger.js +353 -0
  422. package/src/client/components/itemledger/AppStoreItemledger.js +5 -0
  423. package/src/client/components/itemledger/CssItemledger.js +212 -0
  424. package/src/client/components/itemledger/LogInItemledger.js +17 -0
  425. package/src/client/components/itemledger/LogOutItemledger.js +12 -0
  426. package/src/client/components/itemledger/RouterItemledger.js +38 -0
  427. package/src/client/components/itemledger/SettingsItemledger.js +16 -0
  428. package/src/client/components/itemledger/SignUpItemledger.js +11 -0
  429. package/src/client/components/itemledger/SocketIoItemledger.js +6 -0
  430. package/src/client/components/itemledger/TranslateItemledger.js +7 -0
  431. package/src/client/components/underpost/AppShellUnderpost.js +691 -0
  432. package/src/client/components/underpost/AppStoreUnderpost.js +5 -0
  433. package/src/client/components/underpost/CssUnderpost.js +281 -0
  434. package/src/client/components/underpost/CyberpunkBloggerUnderpost.js +879 -0
  435. package/src/client/components/underpost/DocumentSearchProvider.js +448 -0
  436. package/src/client/components/underpost/LabGalleryUnderpost.js +79 -0
  437. package/src/client/components/underpost/LogInUnderpost.js +25 -0
  438. package/src/client/components/underpost/LogOutUnderpost.js +17 -0
  439. package/src/client/components/underpost/RouterUnderpost.js +45 -0
  440. package/src/client/components/underpost/SettingsUnderpost.js +16 -0
  441. package/src/client/components/underpost/SignUpUnderpost.js +11 -0
  442. package/src/client/components/underpost/SocketIoUnderpost.js +6 -0
  443. package/src/client/components/underpost/TranslateUnderpost.js +10 -0
  444. package/src/client/public/cryptokoyn/assets/banner/koyn-social.png +0 -0
  445. package/src/client/public/cryptokoyn/assets/logo/base-icon.png +0 -0
  446. package/src/client/public/cryptokoyn/assets/logo/cryptokoyn.png +0 -0
  447. package/src/client/public/cryptokoyn/assets/splash/android-chrome-144x144.png +0 -0
  448. package/src/client/public/cryptokoyn/assets/splash/android-chrome-192x192.png +0 -0
  449. package/src/client/public/cryptokoyn/assets/splash/android-chrome-256x256.png +0 -0
  450. package/src/client/public/cryptokoyn/assets/splash/android-chrome-36x36.png +0 -0
  451. package/src/client/public/cryptokoyn/assets/splash/android-chrome-48x48.png +0 -0
  452. package/src/client/public/cryptokoyn/assets/splash/android-chrome-72x72.png +0 -0
  453. package/src/client/public/cryptokoyn/assets/splash/android-chrome-96x96.png +0 -0
  454. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-114x114-precomposed.png +0 -0
  455. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-114x114.png +0 -0
  456. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-120x120-precomposed.png +0 -0
  457. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-120x120.png +0 -0
  458. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-144x144-precomposed.png +0 -0
  459. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-144x144.png +0 -0
  460. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-152x152-precomposed.png +0 -0
  461. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-152x152.png +0 -0
  462. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-180x180-precomposed.png +0 -0
  463. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-180x180.png +0 -0
  464. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-57x57-precomposed.png +0 -0
  465. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-57x57.png +0 -0
  466. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-60x60-precomposed.png +0 -0
  467. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-60x60.png +0 -0
  468. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-72x72-precomposed.png +0 -0
  469. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-72x72.png +0 -0
  470. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-76x76-precomposed.png +0 -0
  471. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-76x76.png +0 -0
  472. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-precomposed.png +0 -0
  473. package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon.png +0 -0
  474. package/src/client/public/cryptokoyn/assets/splash/favicon-16x16.png +0 -0
  475. package/src/client/public/cryptokoyn/assets/splash/favicon-32x32.png +0 -0
  476. package/src/client/public/cryptokoyn/assets/splash/mstile-144x144.png +0 -0
  477. package/src/client/public/cryptokoyn/assets/splash/mstile-150x150.png +0 -0
  478. package/src/client/public/cryptokoyn/assets/splash/mstile-310x150.png +0 -0
  479. package/src/client/public/cryptokoyn/assets/splash/mstile-310x310.png +0 -0
  480. package/src/client/public/cryptokoyn/assets/splash/mstile-70x70.png +0 -0
  481. package/src/client/public/cryptokoyn/assets/splash/safari-pinned-tab.svg +42 -0
  482. package/src/client/public/cryptokoyn/browserconfig.xml +12 -0
  483. package/src/client/public/cryptokoyn/favicon.ico +0 -0
  484. package/src/client/public/cryptokoyn/microdata.json +85 -0
  485. package/src/client/public/cryptokoyn/site.webmanifest +57 -0
  486. package/src/client/public/cryptokoyn/sitemap +148 -0
  487. package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +307 -0
  488. package/src/client/public/cyberia-docs/ARCHITECTURE.md +309 -0
  489. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +204 -0
  490. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +341 -0
  491. package/src/client/public/cyberia-docs/CYBERIA-LORE.md +84 -0
  492. package/src/client/public/cyberia-docs/CYBERIA-SAGA.md +394 -0
  493. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +294 -0
  494. package/src/client/public/cyberia-docs/CYBERIA.md +259 -0
  495. package/src/client/public/cyberia-docs/ENTITY-PROFILE.md +242 -0
  496. package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +300 -0
  497. package/src/client/public/cyberia-docs/OFF-CHAIN-ECONOMY.md +309 -0
  498. package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +228 -0
  499. package/src/client/public/cyberia-docs/ROADMAP.md +240 -0
  500. package/src/client/public/cyberia-docs/UNDERPOST-PLATFORM.md +106 -0
  501. package/src/client/public/cyberia-docs/WHITE-PAPER.md +740 -0
  502. package/src/client/public/default/android-chrome-144x144.png +0 -0
  503. package/src/client/public/default/android-chrome-192x192.png +0 -0
  504. package/src/client/public/default/android-chrome-256x256.png +0 -0
  505. package/src/client/public/default/android-chrome-36x36.png +0 -0
  506. package/src/client/public/default/android-chrome-384x384.png +0 -0
  507. package/src/client/public/default/android-chrome-48x48.png +0 -0
  508. package/src/client/public/default/android-chrome-512x512.png +0 -0
  509. package/src/client/public/default/android-chrome-72x72.png +0 -0
  510. package/src/client/public/default/android-chrome-96x96.png +0 -0
  511. package/src/client/public/default/apple-touch-icon-1024x1024.png +0 -0
  512. package/src/client/public/default/apple-touch-icon-114x114-precomposed.png +0 -0
  513. package/src/client/public/default/apple-touch-icon-114x114.png +0 -0
  514. package/src/client/public/default/apple-touch-icon-120x120-precomposed.png +0 -0
  515. package/src/client/public/default/apple-touch-icon-120x120.png +0 -0
  516. package/src/client/public/default/apple-touch-icon-144x144-precomposed.png +0 -0
  517. package/src/client/public/default/apple-touch-icon-144x144.png +0 -0
  518. package/src/client/public/default/apple-touch-icon-152x152-precomposed.png +0 -0
  519. package/src/client/public/default/apple-touch-icon-152x152.png +0 -0
  520. package/src/client/public/default/apple-touch-icon-167x167.png +0 -0
  521. package/src/client/public/default/apple-touch-icon-180x180-precomposed.png +0 -0
  522. package/src/client/public/default/apple-touch-icon-180x180.png +0 -0
  523. package/src/client/public/default/apple-touch-icon-57x57-precomposed.png +0 -0
  524. package/src/client/public/default/apple-touch-icon-57x57.png +0 -0
  525. package/src/client/public/default/apple-touch-icon-60x60-precomposed.png +0 -0
  526. package/src/client/public/default/apple-touch-icon-60x60.png +0 -0
  527. package/src/client/public/default/apple-touch-icon-72x72-precomposed.png +0 -0
  528. package/src/client/public/default/apple-touch-icon-72x72.png +0 -0
  529. package/src/client/public/default/apple-touch-icon-76x76-precomposed.png +0 -0
  530. package/src/client/public/default/apple-touch-icon-76x76.png +0 -0
  531. package/src/client/public/default/apple-touch-icon-precomposed.png +0 -0
  532. package/src/client/public/default/apple-touch-icon.png +0 -0
  533. package/src/client/public/default/apple-touch-startup-image-1125x2436.png +0 -0
  534. package/src/client/public/default/apple-touch-startup-image-1136x640.png +0 -0
  535. package/src/client/public/default/apple-touch-startup-image-1170x2532.png +0 -0
  536. package/src/client/public/default/apple-touch-startup-image-1179x2556.png +0 -0
  537. package/src/client/public/default/apple-touch-startup-image-1242x2208.png +0 -0
  538. package/src/client/public/default/apple-touch-startup-image-1242x2688.png +0 -0
  539. package/src/client/public/default/apple-touch-startup-image-1284x2778.png +0 -0
  540. package/src/client/public/default/apple-touch-startup-image-1290x2796.png +0 -0
  541. package/src/client/public/default/apple-touch-startup-image-1334x750.png +0 -0
  542. package/src/client/public/default/apple-touch-startup-image-1488x2266.png +0 -0
  543. package/src/client/public/default/apple-touch-startup-image-1536x2048.png +0 -0
  544. package/src/client/public/default/apple-touch-startup-image-1620x2160.png +0 -0
  545. package/src/client/public/default/apple-touch-startup-image-1640x2160.png +0 -0
  546. package/src/client/public/default/apple-touch-startup-image-1668x2224.png +0 -0
  547. package/src/client/public/default/apple-touch-startup-image-1668x2388.png +0 -0
  548. package/src/client/public/default/apple-touch-startup-image-1792x828.png +0 -0
  549. package/src/client/public/default/apple-touch-startup-image-2048x1536.png +0 -0
  550. package/src/client/public/default/apple-touch-startup-image-2048x2732.png +0 -0
  551. package/src/client/public/default/apple-touch-startup-image-2160x1620.png +0 -0
  552. package/src/client/public/default/apple-touch-startup-image-2160x1640.png +0 -0
  553. package/src/client/public/default/apple-touch-startup-image-2208x1242.png +0 -0
  554. package/src/client/public/default/apple-touch-startup-image-2224x1668.png +0 -0
  555. package/src/client/public/default/apple-touch-startup-image-2266x1488.png +0 -0
  556. package/src/client/public/default/apple-touch-startup-image-2388x1668.png +0 -0
  557. package/src/client/public/default/apple-touch-startup-image-2436x1125.png +0 -0
  558. package/src/client/public/default/apple-touch-startup-image-2532x1170.png +0 -0
  559. package/src/client/public/default/apple-touch-startup-image-2556x1179.png +0 -0
  560. package/src/client/public/default/apple-touch-startup-image-2688x1242.png +0 -0
  561. package/src/client/public/default/apple-touch-startup-image-2732x2048.png +0 -0
  562. package/src/client/public/default/apple-touch-startup-image-2778x1284.png +0 -0
  563. package/src/client/public/default/apple-touch-startup-image-2796x1290.png +0 -0
  564. package/src/client/public/default/apple-touch-startup-image-640x1136.png +0 -0
  565. package/src/client/public/default/apple-touch-startup-image-750x1334.png +0 -0
  566. package/src/client/public/default/apple-touch-startup-image-828x1792.png +0 -0
  567. package/src/client/public/default/assets/background/dark.jpg +0 -0
  568. package/src/client/public/default/assets/background/dark.svg +557 -0
  569. package/src/client/public/default/assets/background/white.jpg +0 -0
  570. package/src/client/public/default/assets/background/white0-min.jpg +0 -0
  571. package/src/client/public/default/assets/background/white0.jpg +0 -0
  572. package/src/client/public/default/assets/logo/base-icon.png +0 -0
  573. package/src/client/public/default/assets/logo/underpost.gif +0 -0
  574. package/src/client/public/default/assets/mailer/api-user-check.png +0 -0
  575. package/src/client/public/default/assets/mailer/api-user-default-avatar.png +0 -0
  576. package/src/client/public/default/assets/mailer/api-user-invalid-token.png +0 -0
  577. package/src/client/public/default/assets/mailer/api-user-recover.png +0 -0
  578. package/src/client/public/default/browserconfig.xml +12 -0
  579. package/src/client/public/default/favicon-16x16.png +0 -0
  580. package/src/client/public/default/favicon-32x32.png +0 -0
  581. package/src/client/public/default/favicon-48x48.png +0 -0
  582. package/src/client/public/default/favicon.ico +0 -0
  583. package/src/client/public/default/manifest.webmanifest +69 -0
  584. package/src/client/public/default/mstile-144x144.png +0 -0
  585. package/src/client/public/default/mstile-150x150.png +0 -0
  586. package/src/client/public/default/mstile-310x150.png +0 -0
  587. package/src/client/public/default/mstile-310x310.png +0 -0
  588. package/src/client/public/default/mstile-70x70.png +0 -0
  589. package/src/client/public/default/safari-pinned-tab.svg +24 -0
  590. package/src/client/public/default/site.webmanifest +69 -0
  591. package/src/client/public/default/sitemap +148 -0
  592. package/src/client/public/default/yandex-browser-50x50.png +0 -0
  593. package/src/client/public/default/yandex-browser-manifest.json +9 -0
  594. package/src/client/public/doc/favicon.ico +0 -0
  595. package/src/client/public/doc/sitemap +148 -0
  596. package/src/client/public/itemledger/android-chrome-144x144.png +0 -0
  597. package/src/client/public/itemledger/android-chrome-192x192.png +0 -0
  598. package/src/client/public/itemledger/android-chrome-256x256.png +0 -0
  599. package/src/client/public/itemledger/android-chrome-36x36.png +0 -0
  600. package/src/client/public/itemledger/android-chrome-384x384.png +0 -0
  601. package/src/client/public/itemledger/android-chrome-48x48.png +0 -0
  602. package/src/client/public/itemledger/android-chrome-512x512.png +0 -0
  603. package/src/client/public/itemledger/android-chrome-72x72.png +0 -0
  604. package/src/client/public/itemledger/android-chrome-96x96.png +0 -0
  605. package/src/client/public/itemledger/apple-touch-icon-1024x1024.png +0 -0
  606. package/src/client/public/itemledger/apple-touch-icon-114x114.png +0 -0
  607. package/src/client/public/itemledger/apple-touch-icon-120x120.png +0 -0
  608. package/src/client/public/itemledger/apple-touch-icon-144x144.png +0 -0
  609. package/src/client/public/itemledger/apple-touch-icon-152x152.png +0 -0
  610. package/src/client/public/itemledger/apple-touch-icon-167x167.png +0 -0
  611. package/src/client/public/itemledger/apple-touch-icon-180x180.png +0 -0
  612. package/src/client/public/itemledger/apple-touch-icon-57x57.png +0 -0
  613. package/src/client/public/itemledger/apple-touch-icon-60x60.png +0 -0
  614. package/src/client/public/itemledger/apple-touch-icon-72x72.png +0 -0
  615. package/src/client/public/itemledger/apple-touch-icon-76x76.png +0 -0
  616. package/src/client/public/itemledger/apple-touch-icon-precomposed.png +0 -0
  617. package/src/client/public/itemledger/apple-touch-icon.png +0 -0
  618. package/src/client/public/itemledger/apple-touch-startup-image-1125x2436.png +0 -0
  619. package/src/client/public/itemledger/apple-touch-startup-image-1136x640.png +0 -0
  620. package/src/client/public/itemledger/apple-touch-startup-image-1170x2532.png +0 -0
  621. package/src/client/public/itemledger/apple-touch-startup-image-1179x2556.png +0 -0
  622. package/src/client/public/itemledger/apple-touch-startup-image-1242x2208.png +0 -0
  623. package/src/client/public/itemledger/apple-touch-startup-image-1242x2688.png +0 -0
  624. package/src/client/public/itemledger/apple-touch-startup-image-1284x2778.png +0 -0
  625. package/src/client/public/itemledger/apple-touch-startup-image-1290x2796.png +0 -0
  626. package/src/client/public/itemledger/apple-touch-startup-image-1334x750.png +0 -0
  627. package/src/client/public/itemledger/apple-touch-startup-image-1488x2266.png +0 -0
  628. package/src/client/public/itemledger/apple-touch-startup-image-1536x2048.png +0 -0
  629. package/src/client/public/itemledger/apple-touch-startup-image-1620x2160.png +0 -0
  630. package/src/client/public/itemledger/apple-touch-startup-image-1640x2160.png +0 -0
  631. package/src/client/public/itemledger/apple-touch-startup-image-1668x2224.png +0 -0
  632. package/src/client/public/itemledger/apple-touch-startup-image-1668x2388.png +0 -0
  633. package/src/client/public/itemledger/apple-touch-startup-image-1792x828.png +0 -0
  634. package/src/client/public/itemledger/apple-touch-startup-image-2048x1536.png +0 -0
  635. package/src/client/public/itemledger/apple-touch-startup-image-2048x2732.png +0 -0
  636. package/src/client/public/itemledger/apple-touch-startup-image-2160x1620.png +0 -0
  637. package/src/client/public/itemledger/apple-touch-startup-image-2160x1640.png +0 -0
  638. package/src/client/public/itemledger/apple-touch-startup-image-2208x1242.png +0 -0
  639. package/src/client/public/itemledger/apple-touch-startup-image-2224x1668.png +0 -0
  640. package/src/client/public/itemledger/apple-touch-startup-image-2266x1488.png +0 -0
  641. package/src/client/public/itemledger/apple-touch-startup-image-2388x1668.png +0 -0
  642. package/src/client/public/itemledger/apple-touch-startup-image-2436x1125.png +0 -0
  643. package/src/client/public/itemledger/apple-touch-startup-image-2532x1170.png +0 -0
  644. package/src/client/public/itemledger/apple-touch-startup-image-2556x1179.png +0 -0
  645. package/src/client/public/itemledger/apple-touch-startup-image-2688x1242.png +0 -0
  646. package/src/client/public/itemledger/apple-touch-startup-image-2732x2048.png +0 -0
  647. package/src/client/public/itemledger/apple-touch-startup-image-2778x1284.png +0 -0
  648. package/src/client/public/itemledger/apple-touch-startup-image-2796x1290.png +0 -0
  649. package/src/client/public/itemledger/apple-touch-startup-image-640x1136.png +0 -0
  650. package/src/client/public/itemledger/apple-touch-startup-image-750x1334.png +0 -0
  651. package/src/client/public/itemledger/apple-touch-startup-image-828x1792.png +0 -0
  652. package/src/client/public/itemledger/assets/logo/base-icon.png +0 -0
  653. package/src/client/public/itemledger/browserconfig.xml +12 -0
  654. package/src/client/public/itemledger/favicon-16x16.png +0 -0
  655. package/src/client/public/itemledger/favicon-32x32.png +0 -0
  656. package/src/client/public/itemledger/favicon-48x48.png +0 -0
  657. package/src/client/public/itemledger/favicon.ico +0 -0
  658. package/src/client/public/itemledger/manifest.webmanifest +69 -0
  659. package/src/client/public/itemledger/microdata.json +71 -0
  660. package/src/client/public/itemledger/mstile-144x144.png +0 -0
  661. package/src/client/public/itemledger/mstile-150x150.png +0 -0
  662. package/src/client/public/itemledger/mstile-310x150.png +0 -0
  663. package/src/client/public/itemledger/mstile-310x310.png +0 -0
  664. package/src/client/public/itemledger/mstile-70x70.png +0 -0
  665. package/src/client/public/itemledger/sitemap +148 -0
  666. package/src/client/public/itemledger/yandex-browser-50x50.png +0 -0
  667. package/src/client/public/itemledger/yandex-browser-manifest.json +9 -0
  668. package/src/client/public/test/favicon.ico +0 -0
  669. package/src/client/public/test/sitemap +148 -0
  670. package/src/client/services/atlas-sprite-sheet/atlas-sprite-sheet.service.js +137 -0
  671. package/src/client/services/core/core.service.js +309 -0
  672. package/src/client/services/crypto/crypto.service.js +68 -0
  673. package/src/client/services/cyberia-action/cyberia-action.service.js +99 -0
  674. package/src/client/services/cyberia-client-hints/cyberia-client-hints.service.js +99 -0
  675. package/src/client/services/cyberia-dialogue/cyberia-dialogue.service.js +99 -0
  676. package/src/client/services/cyberia-entity/cyberia-entity.management.js +57 -0
  677. package/src/client/services/cyberia-entity/cyberia-entity.service.js +99 -0
  678. package/src/client/services/cyberia-entity-type-default/cyberia-entity-type-default.service.js +99 -0
  679. package/src/client/services/cyberia-instance/cyberia-instance.management.js +194 -0
  680. package/src/client/services/cyberia-instance/cyberia-instance.service.js +137 -0
  681. package/src/client/services/cyberia-instance-conf/cyberia-instance-conf.service.js +99 -0
  682. package/src/client/services/cyberia-map/cyberia-map.management.js +193 -0
  683. package/src/client/services/cyberia-map/cyberia-map.service.js +120 -0
  684. package/src/client/services/cyberia-quest/cyberia-quest.service.js +99 -0
  685. package/src/client/services/cyberia-quest-progress/cyberia-quest-progress.service.js +99 -0
  686. package/src/client/services/cyberia-saga/cyberia-saga.service.js +99 -0
  687. package/src/client/services/cyberia-skill/cyberia-skill.service.js +99 -0
  688. package/src/client/services/default/default.management.js +1015 -0
  689. package/src/client/services/default/default.service.js +99 -0
  690. package/src/client/services/document/document.service.js +134 -0
  691. package/src/client/services/file/file.service.js +94 -0
  692. package/src/client/services/instance/instance.management.js +78 -0
  693. package/src/client/services/instance/instance.service.js +107 -0
  694. package/src/client/services/ipfs/ipfs.service.js +118 -0
  695. package/src/client/services/object-layer/object-layer.management.js +414 -0
  696. package/src/client/services/object-layer/object-layer.service.js +208 -0
  697. package/src/client/services/object-layer-render-frames/object-layer-render-frames.service.js +99 -0
  698. package/src/client/services/test/test.service.js +68 -0
  699. package/src/client/services/user/guest.service.js +86 -0
  700. package/src/client/services/user/user.management.js +51 -0
  701. package/src/client/services/user/user.service.js +106 -0
  702. package/src/client/ssr/RootDocument.js +237 -0
  703. package/src/client/ssr/body/404.js +77 -0
  704. package/src/client/ssr/body/500.js +76 -0
  705. package/src/client/ssr/body/CacheControl.js +117 -0
  706. package/src/client/ssr/body/CyberiaDefaultSplashScreen.js +97 -0
  707. package/src/client/ssr/body/DefaultSplashScreen.js +97 -0
  708. package/src/client/ssr/body/SwaggerDarkMode.js +285 -0
  709. package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +90 -0
  710. package/src/client/ssr/head/CryptokoynScripts.js +4 -0
  711. package/src/client/ssr/head/Css.js +241 -0
  712. package/src/client/ssr/head/CyberiaPortalScripts.js +6 -0
  713. package/src/client/ssr/head/DefaultScripts.js +6 -0
  714. package/src/client/ssr/head/ItemledgerScripts.js +4 -0
  715. package/src/client/ssr/head/Microdata.js +11 -0
  716. package/src/client/ssr/head/Production.js +1 -0
  717. package/src/client/ssr/head/Pwa.js +146 -0
  718. package/src/client/ssr/head/PwaItemledger.js +197 -0
  719. package/src/client/ssr/head/Seo.js +15 -0
  720. package/src/client/ssr/head/UnderpostScripts.js +6 -0
  721. package/src/client/ssr/mailer/DefaultRecoverEmail.js +20 -0
  722. package/src/client/ssr/mailer/DefaultVerifyEmail.js +16 -0
  723. package/src/client/ssr/views/Cyberia404.js +328 -0
  724. package/src/client/ssr/views/CyberiaServerMetrics.js +1070 -0
  725. package/src/client/ssr/views/Maintenance.js +64 -0
  726. package/src/client/ssr/views/NoNetworkConnection.js +68 -0
  727. package/src/client/ssr/views/Test.js +199 -0
  728. package/src/client/sw/core.sw.js +274 -0
  729. package/src/client-builder/client-build-docs.js +493 -0
  730. package/src/client-builder/client-build-live.js +100 -0
  731. package/src/client-builder/client-build.js +1092 -0
  732. package/src/client-builder/client-dev-server.js +88 -0
  733. package/src/client-builder/client-formatted.js +170 -0
  734. package/src/client-builder/client-icons.js +108 -0
  735. package/src/client-builder/ssr.js +124 -0
  736. package/src/client.build.js +17 -0
  737. package/src/client.dev.js +21 -0
  738. package/src/db/DataBaseProvider.js +213 -0
  739. package/src/db/mariadb/MariaDB.js +72 -0
  740. package/src/db/mongo/MongoBootstrap.js +657 -0
  741. package/src/db/mongo/MongooseDB.js +199 -0
  742. package/src/grpc/cyberia/grpc-server.js +162 -0
  743. package/src/index.js +357 -0
  744. package/src/mailer/EmailRender.js +116 -0
  745. package/src/mailer/MailerProvider.js +213 -0
  746. package/src/projects/cyberia/atlas-sprite-sheet-generator.js +413 -0
  747. package/src/projects/cyberia/besu-genesis-generator.js +1630 -0
  748. package/src/projects/cyberia/catalog-cyberia.js +90 -0
  749. package/src/projects/cyberia/gemini-client.js +175 -0
  750. package/src/projects/cyberia/generate-saga.js +2137 -0
  751. package/src/projects/cyberia/hot-reload-trigger.js +163 -0
  752. package/src/projects/cyberia/instance-data.js +719 -0
  753. package/src/projects/cyberia/ipfs-client.js +599 -0
  754. package/src/projects/cyberia/map-preview-generator.js +304 -0
  755. package/src/projects/cyberia/object-layer.js +978 -0
  756. package/src/projects/cyberia/semantic-layer-generator-floor.js +319 -0
  757. package/src/projects/cyberia/semantic-layer-generator-resource.js +259 -0
  758. package/src/projects/cyberia/semantic-layer-generator-skin.js +1164 -0
  759. package/src/projects/cyberia/semantic-layer-generator.js +753 -0
  760. package/src/projects/cyberia/shape-generator.js +1060 -0
  761. package/src/projects/underpost/catalog-underpost.js +60 -0
  762. package/src/proxy.js +19 -0
  763. package/src/runtime/cyberia-client/Dockerfile +49 -0
  764. package/src/runtime/cyberia-client/Dockerfile.dev +75 -0
  765. package/src/runtime/cyberia-server/Dockerfile +43 -0
  766. package/src/runtime/cyberia-server/Dockerfile.dev +56 -0
  767. package/src/runtime/engine-cyberia/Dockerfile +161 -0
  768. package/src/runtime/engine-cyberia/Dockerfile.dev +161 -0
  769. package/src/runtime/engine-cyberia/Dockerfile.test +165 -0
  770. package/src/runtime/engine-cyberia/compose.env +144 -0
  771. package/src/runtime/engine-cyberia/docker-compose.yml +434 -0
  772. package/src/runtime/engine-cyberia/ipfs/configure-ipfs.sh +13 -0
  773. package/src/runtime/engine-cyberia/mongodb/entrypoint.sh +76 -0
  774. package/src/runtime/engine-cyberia/nginx.conf +128 -0
  775. package/src/runtime/express/Dockerfile +45 -0
  776. package/src/runtime/express/Express.js +285 -0
  777. package/src/runtime/lampp/Dockerfile +62 -0
  778. package/src/runtime/lampp/Lampp.js +359 -0
  779. package/src/runtime/nginx/Nginx.js +250 -0
  780. package/src/runtime/wp/Dockerfile +62 -0
  781. package/src/runtime/wp/Wp.js +642 -0
  782. package/src/server/auth.js +713 -0
  783. package/src/server/backup.js +102 -0
  784. package/src/server/catalog.js +72 -0
  785. package/src/server/conf.js +2316 -0
  786. package/src/server/cron.js +476 -0
  787. package/src/server/crypto.js +210 -0
  788. package/src/server/data-query.js +461 -0
  789. package/src/server/dns.js +553 -0
  790. package/src/server/downloader.js +73 -0
  791. package/src/server/logger.js +229 -0
  792. package/src/server/middlewares.js +152 -0
  793. package/src/server/peer.js +75 -0
  794. package/src/server/process.js +299 -0
  795. package/src/server/proxy.js +139 -0
  796. package/src/server/runtime-status.js +252 -0
  797. package/src/server/runtime.js +183 -0
  798. package/src/server/start.js +272 -0
  799. package/src/server/tls.js +254 -0
  800. package/src/server/valkey.js +201 -0
  801. package/src/server.js +25 -0
  802. package/src/ws/IoInterface.js +129 -0
  803. package/src/ws/IoServer.js +68 -0
  804. package/src/ws/core/channels/core.ws.chat.js +68 -0
  805. package/src/ws/core/channels/core.ws.mailer.js +116 -0
  806. package/src/ws/core/channels/core.ws.stream.js +90 -0
  807. package/src/ws/core/core.ws.connection.js +41 -0
  808. package/src/ws/core/core.ws.emit.js +37 -0
  809. package/src/ws/core/core.ws.server.js +44 -0
  810. package/src/ws/default/channels/default.ws.main.js +57 -0
  811. package/src/ws/default/default.ws.connection.js +35 -0
  812. package/src/ws/default/default.ws.emit.js +14 -0
  813. package/src/ws/default/default.ws.server.js +39 -0
  814. package/test/api.test.js +53 -0
  815. package/test/crypto.test.js +117 -0
  816. package/test/cyberia-instance-conf-defaults.test.js +140 -0
  817. package/test/deploy-monitor.test.js +267 -0
  818. package/test/shape-generator.test.js +463 -0
  819. package/tsconfig.docs.json +15 -0
  820. package/typedoc.dd-cyberia.json +31 -0
  821. package/typedoc.json +31 -0
@@ -0,0 +1,117 @@
1
+ import { Schema, model } from 'mongoose';
2
+
3
+ /**
4
+ * Directed edge in a graph.
5
+ * Each portal represents an adjacency relation:
6
+ * source node -> target node
7
+ */
8
+ const PortalEdgeSchema = new Schema(
9
+ {
10
+ // Origin node (graph source vertex)
11
+ sourceMapCode: { type: String, required: true, trim: true },
12
+ sourceCellX: { type: Number },
13
+ sourceCellY: { type: Number },
14
+
15
+ // Destination node (graph target vertex)
16
+ targetMapCode: { type: String, required: true, trim: true },
17
+ targetCellX: { type: Number },
18
+ targetCellY: { type: Number },
19
+
20
+ // Transport behaviour of this edge:
21
+ // inter-portal — teleport to a portal entity on another map
22
+ // inter-random — teleport to a random walkable cell on another map
23
+ // intra-random — teleport to a random walkable cell on the same map
24
+ // intra-portal — teleport to a portal entity on the same map
25
+ portalMode: {
26
+ type: String,
27
+ enum: ['inter-portal', 'inter-random', 'intra-random', 'intra-portal'],
28
+ default: 'inter-portal',
29
+ },
30
+ },
31
+ { _id: false },
32
+ );
33
+
34
+ /**
35
+ * Authoritative initial spawn position for new players joining this instance.
36
+ * When `random` is false and `sourceMapCode` names a loaded map, players spawn at
37
+ * (sourceCellX, sourceCellY) on it; otherwise (random true, or no/unknown map)
38
+ * the server spawns them at a random walkable cell on a random map.
39
+ */
40
+ const PlayerSpawnSchema = new Schema(
41
+ {
42
+ sourceMapCode: { type: String, trim: true },
43
+ sourceCellX: { type: Number },
44
+ sourceCellY: { type: Number },
45
+ random: { type: Boolean, default: false },
46
+ },
47
+ { _id: false },
48
+ );
49
+
50
+ /**
51
+ * Graph container / instance.
52
+ * The instance stores:
53
+ * - nodes: cyberiaMapCodes[]
54
+ * - edges: portals[]
55
+ */
56
+ const CyberiaInstanceSchema = new Schema(
57
+ {
58
+ // Instance identifier
59
+ code: { type: String, default: '', trim: true, unique: true },
60
+
61
+ name: { type: String, default: '', trim: true },
62
+ description: { type: String, default: '' },
63
+ tags: { type: [String], default: [] },
64
+ creator: { type: Schema.Types.ObjectId, ref: 'User' },
65
+ status: { type: String, default: 'unlisted' },
66
+ thumbnail: { type: Schema.Types.ObjectId, ref: 'File' },
67
+
68
+ // Vertex set of the graph
69
+ cyberiaMapCodes: { type: [String], default: [] },
70
+
71
+ // Instance-level object layer item IDs. Each entry binds an item id to the
72
+ // instance and flags whether it seeds every player's starting inventory
73
+ // (defaultPlayerInventory → merged into the player entityDefault's
74
+ // defaultObjectLayers when the world is served to cyberia-server).
75
+ itemIds: {
76
+ type: [
77
+ {
78
+ id: { type: String, required: true },
79
+ defaultPlayerInventory: { type: Boolean, default: false },
80
+ },
81
+ ],
82
+ default: [],
83
+ },
84
+
85
+ // Directed edge set of the graph
86
+ portals: { type: [PortalEdgeSchema], default: [] },
87
+
88
+ // Authoritative initial spawn for new players (see PlayerSpawnSchema).
89
+ playerSpawn: { type: PlayerSpawnSchema, default: () => ({}) },
90
+
91
+ // Optional topology generation mode
92
+ seed: { type: String, default: '' },
93
+ topologyMode: {
94
+ type: String,
95
+ enum: ['manual', 'procedural', 'hybrid'],
96
+ default: 'hybrid',
97
+ },
98
+
99
+ // Game server configuration (all tuning parameters live in a separate document).
100
+ // Linked to CyberiaInstanceConf.instanceCode === this.code.
101
+ conf: { type: Schema.Types.ObjectId, ref: 'CyberiaInstanceConf' },
102
+ },
103
+ { timestamps: true },
104
+ );
105
+
106
+ /**
107
+ * Indexes for fast adjacency lookups.
108
+ * Useful for traversing the graph by source or target node.
109
+ */
110
+ CyberiaInstanceSchema.index({ 'portals.sourceMapCode': 1 });
111
+ CyberiaInstanceSchema.index({ 'portals.targetMapCode': 1 });
112
+
113
+ const CyberiaInstanceModel = model('CyberiaInstance', CyberiaInstanceSchema);
114
+
115
+ const ProviderSchema = CyberiaInstanceSchema;
116
+
117
+ export { CyberiaInstanceSchema, CyberiaInstanceModel, ProviderSchema };
@@ -0,0 +1,75 @@
1
+ import express from 'express';
2
+ import { registerCrudRoutes } from '../../server/middlewares.js';
3
+ import { userGuard, moderatorGuard } from '../../server/auth.js';
4
+ import { CyberiaInstanceController } from './cyberia-instance.controller.js';
5
+
6
+ class CyberiaInstanceRouter {
7
+ /**
8
+ * @param {import('../types.js').RouterOptions} options
9
+ * @returns {import('express').Router}
10
+ */
11
+ static router(options) {
12
+ const router = express.Router();
13
+ // ── Custom actions (must come before generic /:id routes) ──────────────
14
+ // Boot transport — REST fallback of the gRPC CyberiaDataService, consumed
15
+ // server-to-server by cyberia-server (ENGINE_API_BASE_URL) when the engine
16
+ // gRPC server (ENGINE_GRPC_ADDRESS) is not enabled. Unauthenticated for
17
+ // parity with the internal-network insecure gRPC channel.
18
+ router.get(`/boot/ping`, async (req, res) => await CyberiaInstanceController.bootPing(req, res, options));
19
+ router.get(
20
+ `/boot/object-layers`,
21
+ async (req, res) => await CyberiaInstanceController.bootObjectLayerBatch(req, res, options),
22
+ );
23
+ router.get(
24
+ `/boot/object-layer-manifest`,
25
+ async (req, res) => await CyberiaInstanceController.bootObjectLayerManifest(req, res, options),
26
+ );
27
+ router.get(
28
+ `/boot/object-layer/:itemId`,
29
+ async (req, res) => await CyberiaInstanceController.bootObjectLayer(req, res, options),
30
+ );
31
+ router.get(`/boot/map/:mapCode`, async (req, res) => await CyberiaInstanceController.bootMapData(req, res, options));
32
+ router.get(
33
+ `/boot/full-instance/:instanceCode`,
34
+ async (req, res) => await CyberiaInstanceController.bootFullInstance(req, res, options),
35
+ );
36
+ router.get(
37
+ `/boot/full-instance`,
38
+ async (req, res) => await CyberiaInstanceController.bootFullInstance(req, res, options),
39
+ );
40
+ router.get(`/fallback-world`, async (req, res) => await CyberiaInstanceController.fallbackWorld(req, res, options));
41
+ // Instance Map — static topology/presence plus dynamic player capability activity.
42
+ router.get(
43
+ `/instance-map/:instanceCode/static`,
44
+ async (req, res) => await CyberiaInstanceController.instanceMapStatic(req, res, options),
45
+ );
46
+ router.get(
47
+ `/instance-map/:instanceCode/dynamic`,
48
+ async (req, res) => await CyberiaInstanceController.instanceMapDynamic(req, res, options),
49
+ );
50
+ // Cached node-background capture of a fallback-world map (PNG).
51
+ router.get(
52
+ `/instance-map/:instanceCode/preview/:mapCode`,
53
+ async (req, res) => await CyberiaInstanceController.instanceMapPreview(req, res, options),
54
+ );
55
+ // Hot reload — engine-cyberia -> cyberia-server control trigger. Elevated
56
+ // privilege only; the internal API key stays server-side.
57
+ router.post(
58
+ `/:id/hot-reload`,
59
+ options.authMiddleware,
60
+ moderatorGuard,
61
+ async (req, res) => await CyberiaInstanceController.hotReload(req, res, options),
62
+ );
63
+ router.get(
64
+ `/:id/portal-connect`,
65
+ options.authMiddleware,
66
+ userGuard,
67
+ async (req, res) => await CyberiaInstanceController.portalConnect(req, res, options),
68
+ );
69
+ return registerCrudRoutes(router, CyberiaInstanceController, options);
70
+ }
71
+ }
72
+
73
+ const ApiRouter = (options) => CyberiaInstanceRouter.router(options);
74
+
75
+ export { ApiRouter, CyberiaInstanceRouter };
@@ -0,0 +1,190 @@
1
+ import { DataBaseProviderService } from '../../db/DataBaseProvider.js';
2
+ import { loggerFactory } from '../../server/logger.js';
3
+ import { DataQuery } from '../../server/data-query.js';
4
+ import { connectPortals } from './cyberia-portal-connector.js';
5
+ import {
6
+ generateFallbackWorld,
7
+ fallbackListInstance,
8
+ DEFAULT_FALLBACK_INSTANCE_CODE,
9
+ } from './cyberia-fallback-world.js';
10
+ import { triggerHotReload } from '../../projects/cyberia/hot-reload-trigger.js';
11
+
12
+ const logger = loggerFactory(import.meta);
13
+
14
+ class CyberiaInstanceService {
15
+ static post = async (req, res, options) => {
16
+ /** @type {import('./cyberia-instance.model.js').CyberiaInstanceModel} */
17
+ const CyberiaInstance = DataBaseProviderService.getModel('CyberiaInstance', options);
18
+ const CyberiaInstanceConf = DataBaseProviderService.getModel('CyberiaInstanceConf', options);
19
+ if (req.auth && req.auth.user) req.body.creator = req.auth.user._id;
20
+ const instance = await new CyberiaInstance(req.body).save();
21
+
22
+ // Auto-upsert a CyberiaInstanceConf for this instance using schema defaults.
23
+ // $setOnInsert ensures existing conf documents are never overwritten.
24
+ if (instance.code && CyberiaInstanceConf) {
25
+ try {
26
+ const conf = await CyberiaInstanceConf.findOneAndUpdate(
27
+ { instanceCode: instance.code },
28
+ { $setOnInsert: { instanceCode: instance.code } },
29
+ { upsert: true, returnDocument: 'after' },
30
+ );
31
+ if (conf && !instance.conf) {
32
+ await CyberiaInstance.findByIdAndUpdate(instance._id, { conf: conf._id });
33
+ instance.conf = conf._id;
34
+ }
35
+ } catch (e) {
36
+ logger.error('auto-upsert CyberiaInstanceConf failed:', e);
37
+ }
38
+ }
39
+
40
+ return instance;
41
+ };
42
+ static get = async (req, res, options) => {
43
+ /** @type {import('./cyberia-instance.model.js').CyberiaInstanceModel} */
44
+ const CyberiaInstance = DataBaseProviderService.getModel('CyberiaInstance', options);
45
+ const populateCreator = { path: 'creator', model: 'User', select: '_id username' };
46
+ if (req.params.id) return await CyberiaInstance.findById(req.params.id).populate(populateCreator);
47
+
48
+ // Parse query parameters using DataQuery helper
49
+ const { query, sort, skip, limit, page } = DataQuery.parse(req.query);
50
+
51
+ const [data, total] = await Promise.all([
52
+ CyberiaInstance.find(query).sort(sort).limit(limit).skip(skip).populate(populateCreator),
53
+ CyberiaInstance.countDocuments(query),
54
+ ]);
55
+
56
+ // Opt-in (?fallback=true): surface the always-on TEST world so the selection
57
+ // view is never empty. Skipped when a real TEST instance is already present.
58
+ const injectFallback =
59
+ /^(true|1)$/i.test(String(req.query.fallback || '')) &&
60
+ !data.some((d) => d.code === DEFAULT_FALLBACK_INSTANCE_CODE);
61
+ const items = injectFallback ? [...data, fallbackListInstance()] : data;
62
+ const count = injectFallback ? total + 1 : total;
63
+
64
+ const totalPages = Math.ceil(count / limit);
65
+ return { data: items, total: count, page, totalPages };
66
+ };
67
+ static put = async (req, res, options) => {
68
+ /** @type {import('./cyberia-instance.model.js').CyberiaInstanceModel} */
69
+ const CyberiaInstance = DataBaseProviderService.getModel('CyberiaInstance', options);
70
+ const instance = await CyberiaInstance.findById(req.params.id);
71
+ if (!instance) throw new Error('instance not found');
72
+ if (req.auth.user.role !== 'admin' && String(instance.creator) !== String(req.auth.user._id))
73
+ throw new Error('insufficient permission');
74
+ if (req.body.thumbnail && instance.thumbnail && String(req.body.thumbnail) !== String(instance.thumbnail)) {
75
+ const File = DataBaseProviderService.getModel('File', options);
76
+ await File.findByIdAndDelete(instance.thumbnail);
77
+ }
78
+ return await CyberiaInstance.findByIdAndUpdate(req.params.id, req.body, { returnDocument: 'after' });
79
+ };
80
+ /**
81
+ * Central portal connector endpoint.
82
+ *
83
+ * Delegates topology computation to the pure-function `connectPortals()`
84
+ * from cyberia-portal-connector.js so the same logic can be used by the
85
+ * GUI without a DB dependency.
86
+ *
87
+ * Builds a minimal ring connecting all maps and assigns random portal
88
+ * subtypes to remaining portals. Does NOT generate procedural entities —
89
+ * entity generation is handled exclusively by the fallback world logic
90
+ * (cyberia-world-generator.js).
91
+ *
92
+ * ?persist=true — save generated portals to DB
93
+ */
94
+ /**
95
+ * Ask a running cyberia-server to rebuild its world now (gRPC control
96
+ * service, REST fallback). Moderator/admin only — the route guards the
97
+ * caller; the internal CYBERIA_SERVER_API_KEY never leaves the engine.
98
+ */
99
+ static hotReload = async (req, res, options) => {
100
+ const CyberiaInstance = DataBaseProviderService.getModel('CyberiaInstance', options);
101
+ const { serverUrl, mode } = req.body || {};
102
+ if (!serverUrl) throw new Error('serverUrl is required');
103
+
104
+ // Resolve the instance the component is editing so the target server can
105
+ // reject a trigger aimed at a different world.
106
+ let instanceCode = req.body?.instanceCode || '';
107
+ if (!instanceCode && req.params.id) {
108
+ const instance = await CyberiaInstance.findById(req.params.id).select('code').lean();
109
+ instanceCode = instance?.code || '';
110
+ }
111
+
112
+ const { transport, result, grpcError } = await triggerHotReload({ serverUrl, instanceCode, mode });
113
+ return { transport, instanceCode, grpcError, ...result };
114
+ };
115
+
116
+ static portalConnect = async (req, res, options) => {
117
+ const CyberiaInstance = DataBaseProviderService.getModel('CyberiaInstance', options);
118
+ const CyberiaMap = DataBaseProviderService.getModel('CyberiaMap', options);
119
+
120
+ const instance = await CyberiaInstance.findById(req.params.id).lean();
121
+ if (!instance) throw new Error('instance not found');
122
+
123
+ const mapCodes = instance.cyberiaMapCodes || [];
124
+
125
+ // Load maps with the fields needed by the connector.
126
+ const mapDocs = await CyberiaMap.find(
127
+ { code: { $in: mapCodes } },
128
+ {
129
+ code: 1,
130
+ gridX: 1,
131
+ gridY: 1,
132
+ entities: 1,
133
+ },
134
+ ).lean();
135
+
136
+ // ── Portal topology (pure function) ──────────────────────────────────
137
+ const result = connectPortals(mapCodes, mapDocs);
138
+
139
+ // ── Persist to DB when requested ─────────────────────────────────────
140
+ const persist = req.query?.persist === 'true';
141
+ if (persist) {
142
+ await CyberiaInstance.findByIdAndUpdate(req.params.id, { portals: result.portals });
143
+ }
144
+
145
+ return {
146
+ ...result,
147
+ persisted: persist,
148
+ };
149
+ };
150
+
151
+ static delete = async (req, res, options) => {
152
+ /** @type {import('./cyberia-instance.model.js').CyberiaInstanceModel} */
153
+ const CyberiaInstance = DataBaseProviderService.getModel('CyberiaInstance', options);
154
+ if (req.params.id) {
155
+ const instance = await CyberiaInstance.findById(req.params.id);
156
+ if (!instance) throw new Error('instance not found');
157
+ if (req.auth.user.role !== 'admin' && String(instance.creator) !== String(req.auth.user._id))
158
+ throw new Error('insufficient permission');
159
+ if (instance.thumbnail) {
160
+ const File = DataBaseProviderService.getModel('File', options);
161
+ await File.findByIdAndDelete(instance.thumbnail);
162
+ }
163
+ return await CyberiaInstance.findByIdAndDelete(req.params.id);
164
+ } else return await CyberiaInstance.deleteMany();
165
+ };
166
+
167
+ /**
168
+ * Return an in-memory procedural fallback world.
169
+ *
170
+ * Nothing is persisted to MongoDB. The world is regenerated on every
171
+ * call but stays deterministic for a given seed.
172
+ *
173
+ * Query params:
174
+ * ?mapCount=<number> — maps to generate (default: 4)
175
+ * ?botCount=<number> — bots per map (random 8–16 if omitted)
176
+ * ?obstacleCount=<number> — obstacles per map (random 12–20 if omitted)
177
+ * ?foregroundCount=<number>— foreground per map (random 6–12 if omitted)
178
+ */
179
+ static fallbackWorld = async (req) => {
180
+ const q = req.query || {};
181
+ return generateFallbackWorld({
182
+ mapCount: q.mapCount ? parseInt(q.mapCount, 10) : undefined,
183
+ botCount: q.botCount ? parseInt(q.botCount, 10) : undefined,
184
+ obstacleCount: q.obstacleCount ? parseInt(q.obstacleCount, 10) : undefined,
185
+ foregroundCount: q.foregroundCount ? parseInt(q.foregroundCount, 10) : undefined,
186
+ });
187
+ };
188
+ }
189
+
190
+ export { CyberiaInstanceService };
@@ -0,0 +1,260 @@
1
+ /**
2
+ * Central Portal Connector — pure-function module.
3
+ *
4
+ * Sole responsibility: build, validate, and connect portal topology
5
+ * for a CyberiaInstance. Given map documents with portal entities,
6
+ * produces a minimal ring that guarantees full reachability, then
7
+ * assigns random portal behaviour to every remaining (unconnected)
8
+ * portal.
9
+ *
10
+ * Shared by the backend (CyberiaInstanceService.portalConnect) and the
11
+ * GUI (Instance Engine "Portal Connector" button) so the same logic
12
+ * runs everywhere without a DB dependency.
13
+ *
14
+ * This module does NOT generate procedural entities (obstacles,
15
+ * foreground, resources, bots, etc.). For that, see
16
+ * cyberia-world-generator.js.
17
+ *
18
+ * All exported functions are stateless and synchronous.
19
+ *
20
+ * @module src/api/cyberia-instance/cyberia-portal-connector
21
+ */
22
+
23
+ // ── Portal mode constants ────────────────────────────────────────────────────
24
+
25
+ /**
26
+ * Canonical portal mode strings.
27
+ * @enum {string}
28
+ */
29
+ const PORTAL_MODES = Object.freeze({
30
+ INTER_PORTAL: 'inter-portal', // teleport to a portal on another map
31
+ INTER_RANDOM: 'inter-random', // teleport to a random spot on another map
32
+ INTRA_RANDOM: 'intra-random', // teleport to a random spot on the same map
33
+ INTRA_PORTAL: 'intra-portal', // teleport to a portal on the same map
34
+ });
35
+
36
+ /**
37
+ * All portal mode values as an array (for random selection).
38
+ * @type {string[]}
39
+ */
40
+ const PORTAL_MODE_LIST = Object.values(PORTAL_MODES);
41
+
42
+ /**
43
+ * Map from portal mode to its palette colour key.
44
+ * @type {Record<string, string>}
45
+ */
46
+ const PORTAL_MODE_COLOR_KEY = Object.freeze({
47
+ [PORTAL_MODES.INTER_PORTAL]: 'PORTAL_INTER_PORTAL',
48
+ [PORTAL_MODES.INTER_RANDOM]: 'PORTAL_INTER_RANDOM',
49
+ [PORTAL_MODES.INTRA_RANDOM]: 'PORTAL_INTRA_RANDOM',
50
+ [PORTAL_MODES.INTRA_PORTAL]: 'PORTAL_INTRA_PORTAL',
51
+ });
52
+
53
+ /**
54
+ * Portal modes available for extra (non-ring) portals.
55
+ * The ring always uses INTER_PORTAL; extras are randomly chosen from these.
56
+ * @type {string[]}
57
+ */
58
+ const EXTRA_PORTAL_MODES = [PORTAL_MODES.INTRA_PORTAL, PORTAL_MODES.INTRA_RANDOM, PORTAL_MODES.INTER_RANDOM];
59
+
60
+ // ── Portal topology builders ─────────────────────────────────────────────────
61
+
62
+ /**
63
+ * Extract all portal-type entities from each map document and build
64
+ * a lookup: `{ [mapCode]: portalEntity[] }`.
65
+ *
66
+ * @param {Array<{ code: string, entities: Array<{ entityType: string, portalSubtype?: string, initCellX: number, initCellY: number }> }>} maps
67
+ * @returns {Record<string, object[]>}
68
+ */
69
+ function indexPortalEntities(maps) {
70
+ const idx = {};
71
+ for (const map of maps) {
72
+ idx[map.code] = (map.entities || []).filter((e) => e.entityType === 'portal');
73
+ }
74
+ return idx;
75
+ }
76
+
77
+ /**
78
+ * Build portal edges from a set of maps with portal entities.
79
+ *
80
+ * Phase 1 — **Ring guarantee**: creates an inter-portal ring that
81
+ * connects every map in a circle (0→1→2→…→n-1→0) so that every map
82
+ * is reachable from every other map. One portal entity per map is
83
+ * consumed for the ring.
84
+ *
85
+ * Phase 2 — **Extra edges**: remaining portal entities (those not used
86
+ * in the ring) produce edges according to their `portalSubtype`:
87
+ * inter-portal → portal on a DIFFERENT map
88
+ * inter-random → random pos on a DIFFERENT map
89
+ * intra-random → random pos on the SAME map
90
+ * intra-portal → portal on the SAME map
91
+ *
92
+ * @param {string[]} orderedCodes Map codes in instance order.
93
+ * @param {Record<string, object[]>} portalIndex From `indexPortalEntities`.
94
+ * @returns {{ portals: object[], topology: string }}
95
+ */
96
+ function buildTopologyFromSubtypes(orderedCodes, portalIndex) {
97
+ const n = orderedCodes.length;
98
+ if (n < 1) return { portals: [], topology: 'none' };
99
+
100
+ const portals = [];
101
+ const usedInRing = new Set();
102
+
103
+ // ── Phase 1: Guaranteed inter-portal ring ───────────────────────────
104
+ // Each map links to the next in a circle: 0→1→2→…→(n-1)→0.
105
+ if (n >= 2) {
106
+ for (let i = 0; i < n; i++) {
107
+ const srcCode = orderedCodes[i];
108
+ const tgtCode = orderedCodes[(i + 1) % n];
109
+
110
+ // Prefer an unused inter-portal entity as source; fall back to any unused, then any
111
+ const srcAll = portalIndex[srcCode] || [];
112
+ const srcInterUnused = srcAll.filter(
113
+ (e) => (e.portalSubtype || PORTAL_MODES.INTER_PORTAL) === PORTAL_MODES.INTER_PORTAL && !usedInRing.has(e),
114
+ );
115
+ const srcAnyUnused = srcAll.filter((e) => !usedInRing.has(e));
116
+ const srcEnt = srcInterUnused[0] || srcAnyUnused[0] || srcAll[0];
117
+
118
+ // Target: pick any portal on the target map for landing coordinates
119
+ const tgtAll = portalIndex[tgtCode] || [];
120
+ const tgtEnt = tgtAll.length > 0 ? tgtAll[Math.floor(Math.random() * tgtAll.length)] : null;
121
+
122
+ if (srcEnt) {
123
+ usedInRing.add(srcEnt);
124
+ portals.push({
125
+ sourceMapCode: srcCode,
126
+ sourceCellX: srcEnt.initCellX ?? 0,
127
+ sourceCellY: srcEnt.initCellY ?? 0,
128
+ targetMapCode: tgtCode,
129
+ targetCellX: tgtEnt?.initCellX ?? 0,
130
+ targetCellY: tgtEnt?.initCellY ?? 0,
131
+ portalMode: PORTAL_MODES.INTER_PORTAL,
132
+ });
133
+ }
134
+ }
135
+ }
136
+
137
+ // ── Phase 2: Extra edges from remaining portals ─────────────────────
138
+ const otherMap = (srcCode) => {
139
+ if (n < 2) return srcCode;
140
+ let code;
141
+ do {
142
+ code = orderedCodes[Math.floor(Math.random() * n)];
143
+ } while (code === srcCode && n > 1);
144
+ return code;
145
+ };
146
+
147
+ for (const srcCode of orderedCodes) {
148
+ const allOnMap = portalIndex[srcCode] || [];
149
+ const remaining = allOnMap.filter((e) => !usedInRing.has(e));
150
+
151
+ for (const srcEnt of remaining) {
152
+ // If the entity already has an explicit subtype, honour it;
153
+ // otherwise assign a random mode (matching fallback-world behaviour).
154
+ const sub = srcEnt.portalSubtype || PORTAL_MODE_LIST[Math.floor(Math.random() * PORTAL_MODE_LIST.length)];
155
+
156
+ switch (sub) {
157
+ case PORTAL_MODES.INTER_PORTAL: {
158
+ const tgtCode = otherMap(srcCode);
159
+ const candidates = portalIndex[tgtCode] || [];
160
+ const tgtEnt = candidates.length > 0 ? candidates[Math.floor(Math.random() * candidates.length)] : null;
161
+ portals.push({
162
+ sourceMapCode: srcCode,
163
+ sourceCellX: srcEnt.initCellX ?? 0,
164
+ sourceCellY: srcEnt.initCellY ?? 0,
165
+ targetMapCode: tgtCode,
166
+ targetCellX: tgtEnt?.initCellX ?? 0,
167
+ targetCellY: tgtEnt?.initCellY ?? 0,
168
+ portalMode: PORTAL_MODES.INTER_PORTAL,
169
+ });
170
+ break;
171
+ }
172
+ case PORTAL_MODES.INTER_RANDOM: {
173
+ const tgtCode = otherMap(srcCode);
174
+ portals.push({
175
+ sourceMapCode: srcCode,
176
+ sourceCellX: srcEnt.initCellX ?? 0,
177
+ sourceCellY: srcEnt.initCellY ?? 0,
178
+ targetMapCode: tgtCode,
179
+ targetCellX: -1,
180
+ targetCellY: -1,
181
+ portalMode: PORTAL_MODES.INTER_RANDOM,
182
+ });
183
+ break;
184
+ }
185
+ case PORTAL_MODES.INTRA_RANDOM: {
186
+ portals.push({
187
+ sourceMapCode: srcCode,
188
+ sourceCellX: srcEnt.initCellX ?? 0,
189
+ sourceCellY: srcEnt.initCellY ?? 0,
190
+ targetMapCode: srcCode,
191
+ targetCellX: -1,
192
+ targetCellY: -1,
193
+ portalMode: PORTAL_MODES.INTRA_RANDOM,
194
+ });
195
+ break;
196
+ }
197
+ case PORTAL_MODES.INTRA_PORTAL: {
198
+ const candidates = allOnMap.filter(
199
+ (e) => e !== srcEnt && (e.initCellX !== srcEnt.initCellX || e.initCellY !== srcEnt.initCellY),
200
+ );
201
+ const tgtEnt = candidates.length > 0 ? candidates[Math.floor(Math.random() * candidates.length)] : null;
202
+ portals.push({
203
+ sourceMapCode: srcCode,
204
+ sourceCellX: srcEnt.initCellX ?? 0,
205
+ sourceCellY: srcEnt.initCellY ?? 0,
206
+ targetMapCode: srcCode,
207
+ targetCellX: tgtEnt?.initCellX ?? 0,
208
+ targetCellY: tgtEnt?.initCellY ?? 0,
209
+ portalMode: PORTAL_MODES.INTRA_PORTAL,
210
+ });
211
+ break;
212
+ }
213
+ }
214
+ }
215
+ }
216
+
217
+ return { portals, topology: n === 1 ? 'intra-only' : 'ring+mixed' };
218
+ }
219
+
220
+ /**
221
+ * Central portal-connect pipeline.
222
+ *
223
+ * Given an instance's ordered map codes and the full map documents (with
224
+ * entities), returns the auto-generated portal edge list.
225
+ *
226
+ * @param {string[]} mapCodes Instance's `cyberiaMapCodes` array.
227
+ * @param {Array<{ code: string, entities: object[] }>} maps Map documents (lean or JSON).
228
+ * @returns {{ portals: object[], topology: string, mapCount: number }}
229
+ */
230
+ function connectPortals(mapCodes, maps) {
231
+ if (!mapCodes || mapCodes.length < 1) {
232
+ return { portals: [], topology: 'none', mapCount: mapCodes?.length ?? 0, message: 'Need at least 1 map.' };
233
+ }
234
+
235
+ const portalIndex = indexPortalEntities(maps);
236
+
237
+ // Filter to codes that actually exist in the fetched maps.
238
+ const knownCodes = new Set(maps.map((m) => m.code));
239
+ const ordered = mapCodes.filter((c) => knownCodes.has(c));
240
+ if (ordered.length < 1) {
241
+ return { portals: [], topology: 'none', mapCount: ordered.length, message: 'Need at least 1 map.' };
242
+ }
243
+
244
+ const { portals, topology } = buildTopologyFromSubtypes(ordered, portalIndex);
245
+ return { portals, topology, mapCount: ordered.length };
246
+ }
247
+
248
+ // ── Public API ───────────────────────────────────────────────────────────────
249
+
250
+ export {
251
+ // Portal topology
252
+ connectPortals,
253
+ buildTopologyFromSubtypes,
254
+ indexPortalEntities,
255
+ // Portal modes
256
+ PORTAL_MODES,
257
+ PORTAL_MODE_LIST,
258
+ PORTAL_MODE_COLOR_KEY,
259
+ EXTRA_PORTAL_MODES,
260
+ };