@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,1076 @@
1
+ /**
2
+ * Canonical server-owned defaults for the Cyberia runtime.
3
+ *
4
+ * Single source of truth for everything the **authoritative simulation
5
+ * server** (cyberia-server, Go) needs to build and run a world:
6
+ *
7
+ * - per-entity-type live / dead / drop item configuration
8
+ * - simulation, AOI, combat, economy, and skill rules
9
+ * - equipment rules
10
+ * - status-icon **numeric IDs** (visuals live in client defaults)
11
+ * - seed content (dialogues, actions, quests) consumed by the
12
+ * persistence/CLI tooling that bootstraps the world
13
+ * - native-dependency pin list for chain-bridge tooling
14
+ *
15
+ * STRICT BOUNDARY
16
+ * ---------------
17
+ * NEVER imported from any file under `src/client/`. The browser bundler
18
+ * resolves imports recursively, so a single browser-side import would drag
19
+ * the entire simulation defaults into the public JS payload.
20
+ *
21
+ * Shared content **vocabulary** (item/entity type enums, the
22
+ * `DefaultCyberiaItems` registry, `ENTITY_TYPE_TO_ITEM_TYPES`, the quest
23
+ * step objective enum) lives in `SharedDefaultsCyberia.js`. This file
24
+ * re-imports those so the browser editor never needs to reach into
25
+ * server-defaults to learn the schema.
26
+ *
27
+ * Consumers:
28
+ * - cyberia-instance-conf model + grpc-server (gameplay config)
29
+ * - cyberia-world-generator / cyberia-fallback-world (world build)
30
+ * - cyberia-quest / cyberia-action / Mongo seed scripts (content)
31
+ * - bin/cyberia + bin/build + bin/deploy (CLI + chain bridge)
32
+ *
33
+ * @module src/api/cyberia-server-defaults/cyberia-server-defaults.js
34
+ */
35
+
36
+ // The canonical client-defaults module lives under src/client/ so the
37
+ // browser bundler can resolve the URL inside the client tree. Engine-side
38
+ // Node imports work from any path, so we reach into it from here.
39
+ import {
40
+ ITEM_TYPES,
41
+ ENTITY_TYPES,
42
+ SKILL_LOGIC_ID_VALUES,
43
+ isCanonicalSkillLogicId,
44
+ } from '../../client/components/cyberia/SharedDefaultsCyberia.js';
45
+
46
+ export const DOCKER_COMPOSE_ID = 'cyberia';
47
+
48
+ export const DEPLOY_ID = 'dd-cyberia';
49
+
50
+ /**
51
+ * Native-dependency pin list. Consumed by `bin/build.js` and `bin/deploy.js`
52
+ * when materialising the Cyberia subtree so versions stay reproducible
53
+ * across CI / production deploys.
54
+ */
55
+ export class CyberiaDependencies {
56
+ static 'maxrects-packer' = '^2.7.3';
57
+ static pngjs = '^7.0.0';
58
+ static jimp = '^1.6.0';
59
+ static sharp = '^0.34.5';
60
+ static ethers = '~6.16.0';
61
+ }
62
+
63
+ export const DOCKER_SCRIPTS = {
64
+ 'docker:generate': `node bin docker-compose --generate --deploy-id ${DEPLOY_ID} --docker-compose-id ${DOCKER_COMPOSE_ID}`,
65
+ 'docker:up': `node bin docker-compose --up --deploy-id ${DEPLOY_ID} --docker-compose-id ${DOCKER_COMPOSE_ID}`,
66
+ 'docker:up:build': `node bin docker-compose --up --build --deploy-id ${DEPLOY_ID} --docker-compose-id ${DOCKER_COMPOSE_ID}`,
67
+ 'docker:down': `node bin docker-compose --down --deploy-id ${DEPLOY_ID} --docker-compose-id ${DOCKER_COMPOSE_ID}`,
68
+ 'docker:down:volumes': `node bin docker-compose --down --volumes --deploy-id ${DEPLOY_ID} --docker-compose-id ${DOCKER_COMPOSE_ID}`,
69
+ 'docker:restart': `node bin docker-compose --restart --deploy-id ${DEPLOY_ID} --docker-compose-id ${DOCKER_COMPOSE_ID}`,
70
+ 'docker:pull': `node bin docker-compose --pull --deploy-id ${DEPLOY_ID} --docker-compose-id ${DOCKER_COMPOSE_ID}`,
71
+ 'docker:logs': `node bin docker-compose --logs --deploy-id ${DEPLOY_ID} --docker-compose-id ${DOCKER_COMPOSE_ID}`,
72
+ 'docker:status': `node bin docker-compose --status --deploy-id ${DEPLOY_ID} --docker-compose-id ${DOCKER_COMPOSE_ID}`,
73
+ 'docker:reset': `node bin docker-compose --reset --deploy-id ${DEPLOY_ID} --docker-compose-id ${DOCKER_COMPOSE_ID}`,
74
+ };
75
+
76
+ // ─────────────────────────────────────────────────────────────────────────────
77
+ // Skill / action / quest seed content
78
+ // ─────────────────────────────────────────────────────────────────────────────
79
+
80
+ /**
81
+ * Canonical skill configuration — single source of truth for every trigger
82
+ * item → skill mapping consumed by the runtime simulation.
83
+ *
84
+ * Each entry carries both:
85
+ * - `logicEventIds` (compact array of handler keys, used by the Mongo schema)
86
+ * - `skills` (expanded metadata with name, description, summoned entity)
87
+ *
88
+ * Consumers:
89
+ * - `CYBERIA_INSTANCE_CONF_DEFAULTS.skillConfig` (gRPC fallback defaults)
90
+ * - `bin/cyberia.js seed-skills` (upsert into the cyberia-skill collection —
91
+ * the authoritative CyberiaSkill model keeps the full record, including the
92
+ * `skills` metadata the instance-conf skillConfig schema drops)
93
+ */
94
+ export const DefaultSkillConfig = [
95
+ {
96
+ triggerItemId: 'atlas_pistol_mk2',
97
+ logicEventIds: ['projectile'],
98
+ skills: [
99
+ {
100
+ logicEventId: 'projectile',
101
+ name: 'Projectile',
102
+ description:
103
+ 'Fires a projectile in the direction of the tap. Spawn chance and lifetime scale with Intelligence and Range.',
104
+ summonedEntityItemId: 'atlas_pistol_mk2_bullet',
105
+ },
106
+ ],
107
+ },
108
+ {
109
+ triggerItemId: 'coin',
110
+ logicEventIds: ['coin_drop_or_transaction'],
111
+ skills: [
112
+ {
113
+ logicEventId: 'coin_drop_or_transaction',
114
+ name: 'Coin Drop',
115
+ description:
116
+ 'Coins are dropped automatically when an entity is killed. Transfer amount scales with kill percent rules.',
117
+ summonedEntityItemId: 'coin',
118
+ },
119
+ ],
120
+ },
121
+ // {
122
+ // triggerItemId: 'anon',
123
+ // logicEventIds: ['doppelganger'],
124
+ // skills: [
125
+ // {
126
+ // logicEventId: 'doppelganger',
127
+ // name: 'Doppelganger',
128
+ // description: 'Summons a passive clone of yourself that wanders nearby. Spawn chance scales with Intelligence.',
129
+ // summonedEntityItemId: '$active_skin',
130
+ // },
131
+ // ],
132
+ // },
133
+ {
134
+ triggerItemId: 'hatchet',
135
+ logicEventIds: ['projectile'],
136
+ skills: [
137
+ {
138
+ logicEventId: 'projectile',
139
+ name: 'Projectile',
140
+ description:
141
+ 'Fires a projectile in the direction of the tap. Spawn chance and lifetime scale with Intelligence and Range.',
142
+ summonedEntityItemId: 'hatchet-skill',
143
+ },
144
+ ],
145
+ },
146
+ ];
147
+
148
+ // Fail fast on a non-canonical logicEventId: the canonical LogicId registry in
149
+ // SharedDefaultsCyberia.js is the single source of truth, so a typo or a handler
150
+ // the dispatcher does not know must surface at boot, not as a silent no-op skill.
151
+ for (const cfg of DefaultSkillConfig) {
152
+ for (const logicEventId of [...(cfg.logicEventIds || []), ...(cfg.skills || []).map((sk) => sk.logicEventId)]) {
153
+ if (!isCanonicalSkillLogicId(logicEventId)) {
154
+ throw new Error(
155
+ `DefaultSkillConfig: unknown skill logicEventId "${logicEventId}" for trigger "${cfg.triggerItemId}". ` +
156
+ `Allowed (SharedDefaultsCyberia.SKILL_LOGIC_IDS): ${SKILL_LOGIC_ID_VALUES.join(', ')}`,
157
+ );
158
+ }
159
+ }
160
+ }
161
+
162
+ // ─────────────────────────────────────────────────────────────────────────────
163
+ // Lain demo quests (testing only) — single source of truth
164
+ // ─────────────────────────────────────────────────────────────────────────────
165
+ //
166
+ // Offered by Lain (15,22): a batch of simple no-prerequisite quests so the
167
+ // Quest Journal can exercise pagination with 4+ concurrently active quests.
168
+ //
169
+ // These specs drive THREE derived structures so they can never drift apart:
170
+ // - DefaultCyberiaQuests — the quest definitions
171
+ // - DefaultCyberiaDialogues — one quest-talk dialogue per talk objective
172
+ // - DefaultCyberiaActions — Lain's questDialogueCodes mapping
173
+ //
174
+ // Every `talk` objective MUST have its own quest-talk dialogue mapped on the
175
+ // provider's action: the server validates a talk objective only when the
176
+ // completed dialogue matches that mapping, so a quest without one could be
177
+ // satisfied by reading the NPC's default greeting.
178
+
179
+ const LAIN_DEMO_QUEST_SPECS = [
180
+ {
181
+ suffix: 'coin-cache',
182
+ title: 'Coin Cache',
183
+ description: 'Lain is short on change. Round up some loose coins.',
184
+ steps: [
185
+ {
186
+ id: 'step-collect-coins',
187
+ description: 'Collect 3 coins from field drops.',
188
+ objectives: [{ type: 'collect', itemId: 'coin', quantity: 3 }],
189
+ },
190
+ ],
191
+ rewards: [{ itemId: 'coin', quantity: 10 }],
192
+ },
193
+ {
194
+ suffix: 'timber-run',
195
+ title: 'Timber Run',
196
+ description: 'The camp stockpile is low. Bring back fresh wood.',
197
+ talkLines: ['The reserve thanks you. That timber will hold the frame another cycle.'],
198
+ steps: [
199
+ {
200
+ id: 'step-collect-wood',
201
+ description: 'Gather 2 pieces of wood.',
202
+ objectives: [{ type: 'collect', itemId: 'wood-drop-1', quantity: 2 }],
203
+ },
204
+ {
205
+ id: 'step-return-lain',
206
+ description: 'Deliver the wood to Lain.',
207
+ objectives: [{ type: 'talk', itemId: 'lain', quantity: 1 }],
208
+ },
209
+ ],
210
+ rewards: [{ itemId: 'coin', quantity: 15 }],
211
+ },
212
+ {
213
+ suffix: 'pest-control',
214
+ title: 'Pest Control',
215
+ description: 'Kishins keep raiding the perimeter. Thin them out.',
216
+ steps: [
217
+ {
218
+ id: 'step-kill-kishins',
219
+ description: 'Defeat 3 Kishins.',
220
+ objectives: [{ type: 'kill', itemId: 'kishins', quantity: 3 }],
221
+ },
222
+ ],
223
+ rewards: [{ itemId: 'coin', quantity: 20 }],
224
+ },
225
+ {
226
+ suffix: 'field-sweep',
227
+ title: 'Field Sweep',
228
+ description: 'A mixed patrol order: clear hostiles, then salvage the field.',
229
+ talkLines: ['Patrol logged. The perimeter reads quiet — for now.'],
230
+ steps: [
231
+ {
232
+ id: 'step-kill-one',
233
+ description: 'Defeat 1 Kishin scout.',
234
+ objectives: [{ type: 'kill', itemId: 'kishins', quantity: 1 }],
235
+ },
236
+ {
237
+ id: 'step-salvage',
238
+ description: 'Salvage 5 coins from the aftermath.',
239
+ objectives: [{ type: 'collect', itemId: 'coin', quantity: 5 }],
240
+ },
241
+ {
242
+ id: 'step-debrief-lain',
243
+ description: 'Debrief with Lain.',
244
+ objectives: [{ type: 'talk', itemId: 'lain', quantity: 1 }],
245
+ },
246
+ ],
247
+ rewards: [{ itemId: 'coin', quantity: 25 }],
248
+ },
249
+ {
250
+ suffix: 'lumber-reserve',
251
+ title: 'Lumber Reserve',
252
+ description: 'Stock the winter reserve before the next cycle.',
253
+ steps: [
254
+ {
255
+ id: 'step-collect-wood',
256
+ description: 'Gather 4 pieces of wood.',
257
+ objectives: [{ type: 'collect', itemId: 'wood-drop-1', quantity: 4 }],
258
+ },
259
+ ],
260
+ rewards: [{ itemId: 'coin', quantity: 30 }],
261
+ },
262
+ {
263
+ suffix: 'proof-of-valor',
264
+ title: 'Proof of Valor',
265
+ description: 'Show Lain you can hold the line on your own.',
266
+ talkLines: ['You held the line alone. The wired remembers that much.'],
267
+ steps: [
268
+ {
269
+ id: 'step-kill-kishins',
270
+ description: 'Defeat 5 Kishins.',
271
+ objectives: [{ type: 'kill', itemId: 'kishins', quantity: 5 }],
272
+ },
273
+ {
274
+ id: 'step-report-lain',
275
+ description: 'Report your feat to Lain.',
276
+ objectives: [{ type: 'talk', itemId: 'lain', quantity: 1 }],
277
+ },
278
+ ],
279
+ rewards: [{ itemId: 'hatchet', quantity: 1 }],
280
+ },
281
+ ];
282
+
283
+ const lainDemoQuestCode = (suffix) => `lain-demo-${suffix}`;
284
+ const lainDemoTalkDialogCode = (suffix) => `quest-talk-lain-${suffix}`;
285
+
286
+ /** Demo specs carrying a `talk` objective targeting Lain — these need a mapping. */
287
+ const LAIN_DEMO_TALK_SPECS = LAIN_DEMO_QUEST_SPECS.filter((q) =>
288
+ (q.steps || []).some((s) => (s.objectives || []).some((o) => o.type === 'talk' && o.itemId === 'lain')),
289
+ );
290
+
291
+ /**
292
+ * Default dialogue seeds. Mirrors `CyberiaDialogue` model schema:
293
+ * { code, order, speaker, text, mood }
294
+ *
295
+ * Used by the seed/migration script to populate Mongo on first boot.
296
+ */
297
+ export const DefaultCyberiaDialogues = [
298
+ {
299
+ code: 'default-coin',
300
+ order: 0,
301
+ speaker: 'Coin',
302
+ text: 'A standard unit of exchange in the cyberia network.',
303
+ mood: 'neutral',
304
+ },
305
+ {
306
+ code: 'default-atlas_pistol_mk2',
307
+ order: 0,
308
+ speaker: 'Atlas Pistol MK2',
309
+ text: 'Military-grade sidearm. Fires energy projectiles.',
310
+ mood: 'neutral',
311
+ },
312
+ {
313
+ code: 'default-atlas_pistol_mk2_bullet',
314
+ order: 0,
315
+ speaker: 'MK2 Bullet',
316
+ text: 'High-velocity energy round. Dissipates on impact.',
317
+ mood: 'neutral',
318
+ },
319
+ {
320
+ code: 'default-hatchet',
321
+ order: 0,
322
+ speaker: 'Hatchet',
323
+ text: 'A crude but reliable melee tool. Good for close quarters.',
324
+ mood: 'neutral',
325
+ },
326
+ {
327
+ code: 'default-wason',
328
+ order: 0,
329
+ speaker: 'Wason',
330
+ text: 'They say I am just a wandering merchant... but I have seen things.',
331
+ mood: 'neutral',
332
+ },
333
+ {
334
+ code: 'default-wason',
335
+ order: 1,
336
+ speaker: 'Wason',
337
+ text: 'The network was not always like this. There was a time before the portals.',
338
+ mood: 'sad',
339
+ },
340
+ {
341
+ code: 'default-scp-2040',
342
+ order: 0,
343
+ speaker: 'SCP-2040',
344
+ text: 'CONTAINMENT PROTOCOL ACTIVE. Do not make direct eye contact.',
345
+ mood: 'angry',
346
+ },
347
+ {
348
+ code: 'default-scp-2040',
349
+ order: 1,
350
+ speaker: 'SCP-2040',
351
+ text: 'I remember everything. Every iteration. Every reset.',
352
+ mood: 'sad',
353
+ },
354
+ {
355
+ code: 'default-purple',
356
+ order: 0,
357
+ speaker: 'Purple',
358
+ text: 'The void between nodes is not empty — it is alive.',
359
+ mood: 'neutral',
360
+ },
361
+ {
362
+ code: 'default-punk',
363
+ order: 0,
364
+ speaker: 'Punk',
365
+ text: 'Rules are just code someone else wrote. I write my own.',
366
+ mood: 'happy',
367
+ },
368
+ {
369
+ code: 'default-lain',
370
+ order: 0,
371
+ speaker: 'Lain',
372
+ text: 'No matter where you go, everyone is connected.',
373
+ mood: 'neutral',
374
+ },
375
+ {
376
+ code: 'default-lain',
377
+ order: 1,
378
+ speaker: 'Lain',
379
+ text: 'If you are not remembered, then you never existed.',
380
+ mood: 'sad',
381
+ },
382
+ {
383
+ code: 'default-lain',
384
+ order: 2,
385
+ speaker: 'Lain',
386
+ text: 'The wired is not a separate world. It is layered over this one.',
387
+ mood: 'neutral',
388
+ },
389
+ {
390
+ code: 'default-kaneki',
391
+ order: 0,
392
+ speaker: 'Kaneki',
393
+ text: 'I am not the protagonist of a novel. I am just... me.',
394
+ mood: 'sad',
395
+ },
396
+ { code: 'default-kaneki', order: 1, speaker: 'Kaneki', text: 'What is 1000 minus 7?', mood: 'angry' },
397
+ {
398
+ code: 'default-junko',
399
+ order: 0,
400
+ speaker: 'Junko',
401
+ text: 'Despair is the seed from which hope blooms!',
402
+ mood: 'happy',
403
+ },
404
+ {
405
+ code: 'default-junko',
406
+ order: 1,
407
+ speaker: 'Junko',
408
+ text: 'How boring... nothing ever surprises me anymore.',
409
+ mood: 'sad',
410
+ },
411
+ { code: 'default-ghost', order: 0, speaker: 'fragmentation', text: '...', mood: 'neutral' },
412
+ {
413
+ code: 'default-eiri',
414
+ order: 0,
415
+ speaker: 'Eiri',
416
+ text: 'I am the god of the wired. I designed the protocol.',
417
+ mood: 'neutral',
418
+ },
419
+ {
420
+ code: 'default-eiri',
421
+ order: 1,
422
+ speaker: 'Eiri',
423
+ text: 'Flesh is just hardware. Consciousness is the only software that matters.',
424
+ mood: 'neutral',
425
+ },
426
+ { code: 'default-anon', order: 0, speaker: '???', text: 'You should not be here. Turn back.', mood: 'angry' },
427
+ {
428
+ code: 'default-anon',
429
+ order: 1,
430
+ speaker: '???',
431
+ text: 'Or stay. It does not matter. Nothing leaves this place.',
432
+ mood: 'neutral',
433
+ },
434
+ {
435
+ code: 'default-alex',
436
+ order: 0,
437
+ speaker: 'Alex',
438
+ text: 'I have been mapping the portal network. Something does not add up.',
439
+ mood: 'neutral',
440
+ },
441
+ {
442
+ code: 'default-alex',
443
+ order: 1,
444
+ speaker: 'Alex',
445
+ text: 'There are nodes that exist in the registry but have no physical anchor.',
446
+ mood: 'neutral',
447
+ },
448
+ {
449
+ code: 'default-agent',
450
+ order: 0,
451
+ speaker: 'Agent',
452
+ text: 'Civilian, this area is restricted. State your business.',
453
+ mood: 'neutral',
454
+ },
455
+ {
456
+ code: 'default-agent',
457
+ order: 1,
458
+ speaker: 'Agent',
459
+ text: 'Hmm. Proceed, but know that you are being watched.',
460
+ mood: 'neutral',
461
+ },
462
+ {
463
+ code: 'default-grass',
464
+ order: 0,
465
+ speaker: 'Grass',
466
+ text: 'A patch of synthetic grass. It sways gently despite no wind.',
467
+ mood: 'neutral',
468
+ },
469
+ {
470
+ code: 'quest-talk-wason',
471
+ order: 0,
472
+ speaker: 'Wason',
473
+ text: 'Wanderer! Glad you stopped by. I need a favor — nothing dangerous... mostly.',
474
+ mood: 'happy',
475
+ },
476
+ {
477
+ code: 'quest-talk-wason',
478
+ order: 1,
479
+ speaker: 'Wason',
480
+ text: "First, find Alex — she's been surveying the nodes east of here. Then gather a hatchet for me.",
481
+ mood: 'neutral',
482
+ },
483
+ {
484
+ code: 'quest-talk-wason',
485
+ order: 2,
486
+ speaker: 'Wason',
487
+ text: 'And one more thing: the SCP-2040 anomalies are overrunning my trade routes. Deal with two of them.',
488
+ mood: 'sad',
489
+ },
490
+ {
491
+ code: 'quest-talk-alex',
492
+ order: 0,
493
+ speaker: 'Alex',
494
+ text: "Wason sent you? Good. The portal anomalies are getting worse. I've logged what I can.",
495
+ mood: 'neutral',
496
+ },
497
+ {
498
+ code: 'quest-talk-alex',
499
+ order: 1,
500
+ speaker: 'Alex',
501
+ text: 'Tell Wason: the source is somewhere in the deeper nodes. The registry does not lie.',
502
+ mood: 'neutral',
503
+ },
504
+ {
505
+ code: 'talk-lain',
506
+ order: 0,
507
+ speaker: 'Lain',
508
+ text: 'Present day... present time. You are here, so you are real.',
509
+ mood: 'neutral',
510
+ },
511
+ {
512
+ code: 'talk-lain',
513
+ order: 1,
514
+ speaker: 'Lain',
515
+ text: 'There is nothing I can grant you. Only the wired remembers.',
516
+ mood: 'neutral',
517
+ },
518
+ {
519
+ code: 'quest-talk-wason-errand',
520
+ order: 0,
521
+ speaker: 'Wason',
522
+ text: 'A small thing, friend — the field is littered with loose coin. Gather a few and bring them here.',
523
+ mood: 'happy',
524
+ },
525
+ {
526
+ code: 'quest-talk-wason-errand',
527
+ order: 1,
528
+ speaker: 'Wason',
529
+ text: 'You have my thanks. A good hatchet for an honest errand.',
530
+ mood: 'neutral',
531
+ },
532
+ {
533
+ code: 'quest-talk-agent',
534
+ order: 0,
535
+ speaker: 'Agent',
536
+ text: 'Civilian. There is a bounty if you have the stomach for it. Eliminate the threat, collect the drop, report back.',
537
+ mood: 'neutral',
538
+ },
539
+ // One quest-talk dialogue per Lain demo quest that has a `talk` objective.
540
+ ...LAIN_DEMO_TALK_SPECS.flatMap((q) =>
541
+ (q.talkLines || [`Report received: ${q.title}.`]).map((text, order) => ({
542
+ code: lainDemoTalkDialogCode(q.suffix),
543
+ order,
544
+ speaker: 'Lain',
545
+ text,
546
+ mood: 'neutral',
547
+ })),
548
+ ),
549
+ ];
550
+
551
+ /**
552
+ * Default action catalog — drives NPC interaction overlays and quest grants.
553
+ * Each entry follows the `CyberiaAction` model schema.
554
+ */
555
+ export const DefaultCyberiaActions = [
556
+ // An action has no `type`: it declares the capabilities available at a cell.
557
+ // `code` is a generic location slug; `label` is the bot's overhead name (the
558
+ // client fetches it by code via REST). The NPC skin is derived from
559
+ // `dialogCode` (default-<skin>). `questDialogueCodes` maps each quest the NPC
560
+ // handles to the dialogue shown for it (offer + talk-objective validation).
561
+ // The quests an NPC OFFERS are those whose source cell matches the action's.
562
+ {
563
+ code: 'loc-fallback-map-0-12-10',
564
+ label: 'Wason',
565
+ sourceMapCode: 'fallback-map-0',
566
+ sourceCellX: 12,
567
+ sourceCellY: 10,
568
+ dialogCode: 'default-wason',
569
+ questDialogueCodes: [
570
+ { questCode: 'fallback-intro-quest', dialogCode: 'quest-talk-wason' },
571
+ { questCode: 'wason-errand', dialogCode: 'quest-talk-wason-errand' },
572
+ // bounty's report-back talk happens here too (bounty is offered at the agent cell).
573
+ { questCode: 'bounty-quest-alpha', dialogCode: 'quest-talk-wason' },
574
+ ],
575
+ },
576
+ {
577
+ code: 'loc-fallback-map-0-18-10',
578
+ label: 'Alex',
579
+ sourceMapCode: 'fallback-map-0',
580
+ sourceCellX: 18,
581
+ sourceCellY: 10,
582
+ dialogCode: 'default-alex',
583
+ questDialogueCodes: [{ questCode: 'fallback-intro-quest', dialogCode: 'quest-talk-alex' }],
584
+ },
585
+ {
586
+ code: 'loc-fallback-map-0-12-16',
587
+ label: 'Agent',
588
+ sourceMapCode: 'fallback-map-0',
589
+ sourceCellX: 12,
590
+ sourceCellY: 16,
591
+ dialogCode: 'default-agent',
592
+ questDialogueCodes: [{ questCode: 'bounty-quest-alpha', dialogCode: 'quest-talk-agent' }],
593
+ },
594
+ {
595
+ code: 'loc-fallback-map-0-15-22',
596
+ label: 'Lain',
597
+ sourceMapCode: 'fallback-map-0',
598
+ sourceCellX: 15,
599
+ sourceCellY: 22,
600
+ dialogCode: 'default-lain',
601
+ // Every demo quest with a `talk` objective gets its own quest-talk
602
+ // dialogue here — without the mapping the server would accept the
603
+ // default greeting as the talk, and no quest-talk button would show.
604
+ questDialogueCodes: LAIN_DEMO_TALK_SPECS.map((q) => ({
605
+ questCode: lainDemoQuestCode(q.suffix),
606
+ dialogCode: lainDemoTalkDialogCode(q.suffix),
607
+ })),
608
+ },
609
+ ];
610
+
611
+ /**
612
+ * Default quest definitions for the fallback world. Mirrors `CyberiaQuest`
613
+ * schema. Objective types: 'talk' | 'collect' | 'kill'.
614
+ */
615
+ export const DefaultCyberiaQuests = [
616
+ {
617
+ code: 'fallback-intro-quest',
618
+ title: "The Wanderer's Task",
619
+ description: 'Help Wason restore order to the fractured nodes.',
620
+ // Spatial binding — must match the granting action `wason-quest-intro`.
621
+ sourceMapCode: 'fallback-map-0',
622
+ sourceCellX: 12,
623
+ sourceCellY: 10,
624
+ prerequisiteCodes: [],
625
+ unlocksQuestCodes: ['bounty-quest-alpha'],
626
+ steps: [
627
+ {
628
+ id: 'step-talk-alex',
629
+ description: 'Find Alex and hear her report on the portal anomalies.',
630
+ objectives: [{ type: 'talk', itemId: 'alex', quantity: 1 }],
631
+ },
632
+ {
633
+ id: 'step-collect-wood',
634
+ description: 'Obtain a wood for Wason.',
635
+ objectives: [{ type: 'collect', itemId: 'wood-drop-1', quantity: 1 }],
636
+ },
637
+ {
638
+ id: 'step-kill-kishins',
639
+ description: 'Eliminate Kishins anomalies threatening the trade routes.',
640
+ objectives: [{ type: 'kill', itemId: 'kishins', quantity: 2 }],
641
+ },
642
+ ],
643
+ rewards: [{ itemId: 'coin', quantity: 50 }],
644
+ },
645
+ {
646
+ // Parallel initial mission — same source cell as Wason (12,10), no
647
+ // prerequisites, so the player can accept it alongside the intro quest.
648
+ code: 'wason-errand',
649
+ title: "Wason's Errand",
650
+ description: 'Gather coins from the field and bring them back to Wason.',
651
+ sourceMapCode: 'fallback-map-0',
652
+ sourceCellX: 12,
653
+ sourceCellY: 10,
654
+ prerequisiteCodes: [],
655
+ unlocksQuestCodes: [],
656
+ steps: [
657
+ {
658
+ id: 'step-collect-coins',
659
+ description: 'Collect 5 coins.',
660
+ objectives: [{ type: 'collect', itemId: 'coin', quantity: 5 }],
661
+ },
662
+ {
663
+ id: 'step-return-wason',
664
+ description: 'Return to Wason.',
665
+ objectives: [{ type: 'talk', itemId: 'wason', quantity: 1 }],
666
+ },
667
+ ],
668
+ rewards: [{ itemId: 'hatchet', quantity: 1 }],
669
+ },
670
+ {
671
+ code: 'bounty-quest-alpha',
672
+ title: 'Alpha Bounty',
673
+ description: 'A field test: eliminate a threat, claim your reward, then report back.',
674
+ // Spatial binding — must match the granting action `agent-mission-brief`.
675
+ sourceMapCode: 'fallback-map-0',
676
+ sourceCellX: 12,
677
+ sourceCellY: 16,
678
+ prerequisiteCodes: ['fallback-intro-quest'],
679
+ unlocksQuestCodes: [],
680
+ steps: [
681
+ {
682
+ id: 'step-kill-first',
683
+ description: 'Eliminate the Kishins threat.',
684
+ objectives: [{ type: 'kill', itemId: 'kishins', quantity: 1 }],
685
+ },
686
+ {
687
+ id: 'step-collect-reward',
688
+ description: 'Collect the bounty coin drop.',
689
+ objectives: [{ type: 'collect', itemId: 'coin', quantity: 10 }],
690
+ },
691
+ {
692
+ id: 'step-report-wason',
693
+ description: 'Report back to Wason.',
694
+ objectives: [{ type: 'talk', itemId: 'wason', quantity: 1 }],
695
+ },
696
+ ],
697
+ rewards: [{ itemId: 'hatchet', quantity: 1 }],
698
+ },
699
+ // ── Demo quests (testing only) ─────────────────────────────────────────────
700
+ // Built from LAIN_DEMO_QUEST_SPECS so the quest definitions, their
701
+ // quest-talk dialogues, and Lain's questDialogueCodes mapping stay in sync.
702
+ ...LAIN_DEMO_QUEST_SPECS.map((q) => ({
703
+ code: lainDemoQuestCode(q.suffix),
704
+ title: q.title,
705
+ description: q.description,
706
+ sourceMapCode: 'fallback-map-0',
707
+ sourceCellX: 15,
708
+ sourceCellY: 22,
709
+ prerequisiteCodes: [],
710
+ unlocksQuestCodes: [],
711
+ steps: q.steps,
712
+ rewards: q.rewards,
713
+ })),
714
+ ];
715
+
716
+ // ─────────────────────────────────────────────────────────────────────────────
717
+ // Equipment rules
718
+ // ─────────────────────────────────────────────────────────────────────────────
719
+
720
+ /**
721
+ * Governs which ObjectLayer item types may be simultaneously active on an
722
+ * entity and enforces the one-per-type constraint. The server validates
723
+ * every item_activation request against these rules, scoped to the item set
724
+ * of the entity's current state: liveItemIds while alive, deadItemIds while
725
+ * in the Fragmented State (see DEFAULT_DEAD_ITEM_ID).
726
+ */
727
+ export const EQUIPMENT_RULES_DEFAULTS = Object.freeze({
728
+ activeItemTypes: [ITEM_TYPES.skin, ITEM_TYPES.breastplate, ITEM_TYPES.weapon],
729
+ onePerType: true,
730
+ requireSkin: true,
731
+ });
732
+
733
+ // ─────────────────────────────────────────────────────────────────────────────
734
+ // Entity Status Indicators (server-side numeric table)
735
+ // ─────────────────────────────────────────────────────────────────────────────
736
+
737
+ /**
738
+ * Numeric Entity Status Indicator (ESI) IDs. The Go server stamps one of
739
+ * these u8 IDs on every entity in the AOI binary wire format; the client
740
+ * resolves the icon stem + border colour from its own presentation
741
+ * defaults table (see `SharedDefaultsCyberia.js#STATUS_ICONS_PRESENTATION`).
742
+ *
743
+ * IDs MUST stay in sync with:
744
+ * cyberia-server/src/entity_status.go (StatusNone … StatusResourceExtracted)
745
+ */
746
+ export const STATUS_ICONS = Object.freeze([
747
+ { id: 0, name: 'none', description: 'No icon (skill/coin bots, world objects)' },
748
+ { id: 1, name: 'passive', description: 'Passive bot — no weapon, non-aggressive' },
749
+ { id: 2, name: 'hostile', description: 'Hostile bot — has weapon, will aggro' },
750
+ { id: 3, name: 'frozen', description: 'Player in FrozenInteractionState (modal open)' },
751
+ { id: 4, name: 'player', description: 'Normal player — alive, not frozen' },
752
+ { id: 5, name: 'dead', description: 'Entity is dead / respawning' },
753
+ { id: 6, name: 'resource', description: 'Resource entity — static, exploitable (wood, minerals, etc.)' },
754
+ { id: 7, name: 'resource-extracted', description: 'Resource entity extracted/depleted (dead state)' },
755
+ {
756
+ id: 8,
757
+ name: 'action-provider',
758
+ description:
759
+ 'Capability: bot has a usable cyberia-action (shop/storage/craft/talk) for players who can interact with it. Sent as a capability bit, not a presence state.',
760
+ },
761
+ {
762
+ id: 9,
763
+ name: 'quest-provider',
764
+ description:
765
+ 'Capability: bot offers or advances a cyberia-quest for the viewing player (acceptable offer or active talk-target). Sent as a capability bit, not a presence state.',
766
+ },
767
+ {
768
+ id: 10,
769
+ name: 'portal',
770
+ description:
771
+ 'Presence: fixed-target portal / transport entity. The client renders the transport icon plus a "<targetMapCode> <x>,<y>" nameplate.',
772
+ },
773
+ {
774
+ id: 11,
775
+ name: 'portal-random',
776
+ description:
777
+ 'Presence: random-target portal (inter-random / intra-random, targetCell -1,-1). The client renders the transport-random icon plus a "<targetMapCode>" nameplate (no cell, the destination is random).',
778
+ },
779
+ ]);
780
+
781
+ // ─────────────────────────────────────────────────────────────────────────────
782
+ // Per-entity-type defaults (simulation-side only — no presentation here)
783
+ // ─────────────────────────────────────────────────────────────────────────────
784
+
785
+ /**
786
+ * Resource entity variants. Each declares the live / extracted / drop item
787
+ * triplet the simulation rotates through when a resource is depleted.
788
+ */
789
+ export const RESOURCE_ENTITY_TYPE_DEFAULTS = Object.freeze([
790
+ Object.freeze({
791
+ entityType: ENTITY_TYPES.resource,
792
+ liveItemIds: ['wood-1'],
793
+ deadItemIds: ['wood-extracted-1'],
794
+ dropItemIds: ['wood-drop-1'],
795
+ defaultObjectLayers: [],
796
+ }),
797
+ Object.freeze({
798
+ entityType: ENTITY_TYPES.resource,
799
+ liveItemIds: ['wood-2'],
800
+ deadItemIds: ['wood-extracted-2'],
801
+ dropItemIds: ['wood-drop-2'],
802
+ defaultObjectLayers: [],
803
+ }),
804
+ ]);
805
+
806
+ /** Convenience alias — first variant, used by single-resource fallbacks. */
807
+ export const RESOURCE_ENTITY_TYPE_DEFAULT = RESOURCE_ENTITY_TYPE_DEFAULTS[0];
808
+
809
+ /**
810
+ * Canonical dead-state visual (Fragmentation): applied by cyberia-server when
811
+ * an entity-type default declares no deadItemIds. Dead-state items — this
812
+ * default and any deadItemIds configured via MongoDB — form the Fragmented
813
+ * State's aesthetic loadout: equippable only while the entity is dead, under
814
+ * EQUIPMENT_RULES_DEFAULTS scoped to the dead-item set, and remembered across
815
+ * deaths. Only this default id is excluded from the player inventory wire;
816
+ * the rest appear (lock-badged while alive). No defaultObjectLayers row is
817
+ * needed — the death handler appends missing dead items on demand.
818
+ * Mirrored by `defaultDeadItemID` in cyberia-server/game/dead_items.go.
819
+ */
820
+ export const DEFAULT_DEAD_ITEM_ID = 'fragmentation';
821
+
822
+ /**
823
+ * Per-entity-type defaults consumed by the Go server (live / dead / drop
824
+ * item IDs and the seed inventory for newly spawned entities).
825
+ *
826
+ * Field reference:
827
+ * entityType — server-side category string.
828
+ * liveItemIds — ObjectLayer item IDs while the entity is alive.
829
+ * deadItemIds — IDs swapped in on death / ghost state.
830
+ * dropItemIds — IDs granted to the killer on resource depletion.
831
+ * defaultObjectLayers — initial inventory rows ({itemId, active, qty}).
832
+ */
833
+ export const ENTITY_TYPE_DEFAULTS = Object.freeze([
834
+ {
835
+ entityType: ENTITY_TYPES.player,
836
+ liveItemIds: ['anon', 'atlas_pistol_mk2'],
837
+ deadItemIds: [DEFAULT_DEAD_ITEM_ID],
838
+ defaultObjectLayers: [
839
+ { itemId: 'anon', active: true, quantity: 1 },
840
+ { itemId: 'atlas_pistol_mk2', active: true, quantity: 1 },
841
+ { itemId: 'coin', active: false, quantity: 0 },
842
+ { itemId: 'eiri', active: false, quantity: 1 },
843
+ ],
844
+ },
845
+ {
846
+ entityType: ENTITY_TYPES.other_player,
847
+ liveItemIds: ['anon', 'atlas_pistol_mk2'],
848
+ deadItemIds: [DEFAULT_DEAD_ITEM_ID],
849
+ defaultObjectLayers: [
850
+ { itemId: 'anon', active: true, quantity: 1 },
851
+ { itemId: 'atlas_pistol_mk2', active: true, quantity: 1 },
852
+ { itemId: 'coin', active: false, quantity: 0 },
853
+ ],
854
+ },
855
+ {
856
+ entityType: ENTITY_TYPES.bot,
857
+ liveItemIds: ['purple'],
858
+ deadItemIds: [DEFAULT_DEAD_ITEM_ID],
859
+ defaultObjectLayers: [
860
+ { itemId: 'purple', active: true, quantity: 1 },
861
+ { itemId: 'coin', active: false, quantity: 0 },
862
+ ],
863
+ },
864
+ // Fallback-world mission/action givers. Resolved by their active skin (the
865
+ // liveItemIds key), these bots take the canonical `provider` behavior: they
866
+ // barely move from their spawn and are immortal. Lain only talks in place, so
867
+ // she is fully static. Authors can retarget any of these via EntityEngineCyberia.
868
+ { entityType: ENTITY_TYPES.bot, liveItemIds: ['wason'], deadItemIds: [DEFAULT_DEAD_ITEM_ID], behavior: 'provider' },
869
+ { entityType: ENTITY_TYPES.bot, liveItemIds: ['alex'], deadItemIds: [DEFAULT_DEAD_ITEM_ID], behavior: 'provider' },
870
+ { entityType: ENTITY_TYPES.bot, liveItemIds: ['agent'], deadItemIds: [DEFAULT_DEAD_ITEM_ID], behavior: 'provider' },
871
+ {
872
+ entityType: ENTITY_TYPES.bot,
873
+ liveItemIds: ['lain'],
874
+ deadItemIds: [DEFAULT_DEAD_ITEM_ID],
875
+ behavior: 'provider-static',
876
+ },
877
+ {
878
+ entityType: ENTITY_TYPES.skill,
879
+ liveItemIds: ['atlas_pistol_mk2_bullet'],
880
+ deadItemIds: [],
881
+ defaultObjectLayers: [{ itemId: 'atlas_pistol_mk2_bullet', active: true, quantity: 1 }],
882
+ },
883
+ {
884
+ entityType: ENTITY_TYPES.coin,
885
+ liveItemIds: ['coin'],
886
+ deadItemIds: [],
887
+ defaultObjectLayers: [{ itemId: 'coin', active: true, quantity: 1 }],
888
+ },
889
+ { entityType: ENTITY_TYPES.floor, liveItemIds: ['grass'], deadItemIds: [], dropItemIds: [], defaultObjectLayers: [] },
890
+ { entityType: ENTITY_TYPES.obstacle, liveItemIds: [], deadItemIds: [], dropItemIds: [], defaultObjectLayers: [] },
891
+ { entityType: ENTITY_TYPES.portal, liveItemIds: [], deadItemIds: [], dropItemIds: [], defaultObjectLayers: [] },
892
+ { entityType: ENTITY_TYPES.foreground, liveItemIds: [], deadItemIds: [], dropItemIds: [], defaultObjectLayers: [] },
893
+ // Static decorator — non-moving, passable, depth-sorted. Visuals come from the
894
+ // map definition / world generator; no live/dead/drop rotation.
895
+ { entityType: ENTITY_TYPES.static, liveItemIds: [], deadItemIds: [], dropItemIds: [], defaultObjectLayers: [] },
896
+ ...RESOURCE_ENTITY_TYPE_DEFAULTS,
897
+ ]);
898
+
899
+ // ─────────────────────────────────────────────────────────────────────────────
900
+ // Player spawn
901
+ // ─────────────────────────────────────────────────────────────────────────────
902
+
903
+ /**
904
+ * Canonical default player spawn policy. Mirrors PlayerSpawnSchema in
905
+ * cyberia-instance.model.js and the Go PlayerSpawnConfig: when `random` is false
906
+ * and `sourceMapCode` names a loaded map, new players spawn at
907
+ * (sourceCellX, sourceCellY) on it; otherwise (random, or no/unknown map) they
908
+ * spawn at a random walkable cell on a random map.
909
+ *
910
+ * The canonical default is a random spawn so a fresh or procedural world never
911
+ * piles every new player onto a single cell.
912
+ */
913
+ export const DEFAULT_PLAYER_SPAWN = Object.freeze({
914
+ sourceMapCode: 'fallback-map-0',
915
+ sourceCellX: 3,
916
+ sourceCellY: 3,
917
+ random: false,
918
+ });
919
+
920
+ // ─────────────────────────────────────────────────────────────────────────────
921
+ // Instance-level simulation configuration
922
+ // ─────────────────────────────────────────────────────────────────────────────
923
+
924
+ /**
925
+ * Canonical default Cyberia instance configuration consumed by the gRPC
926
+ * `InstanceConfig` payload. ONLY gameplay-affecting values live here.
927
+ *
928
+ * Anything that does not influence the authoritative simulation (cell-pixel
929
+ * size, camera tunings, palette, interpolation window, render flags) is
930
+ * forbidden — see `SharedDefaultsCyberia.js` and the
931
+ * `/api/cyberia-client-hints` REST endpoint for presentation overrides.
932
+ */
933
+ export const CYBERIA_INSTANCE_CONF_DEFAULTS = {
934
+ // ── Tick model ─────────────────────────────────────────────────────
935
+ tickRate: 60,
936
+ snapshotRate: 20,
937
+
938
+ // ── World / AOI ────────────────────────────────────────────────────
939
+ aoiRadius: 10,
940
+ portalHoldTimeMs: 3000,
941
+ portalSpawnRadius: 3,
942
+
943
+ // ── Entity base stats ──────────────────────────────────────────────
944
+ entityBaseSpeed: 5,
945
+ entityBaseMaxLife: 100,
946
+ entityBaseActionCooldownMs: 500,
947
+ entityBaseMinActionCooldownMs: 100,
948
+
949
+ // ── Bot defaults ───────────────────────────────────────────────────
950
+ botAggroRange: 10,
951
+
952
+ // ── Player defaults ────────────────────────────────────────────────
953
+ defaultPlayerWidth: 2,
954
+ defaultPlayerHeight: 2,
955
+ playerBaseLifeRegenMin: 0.5,
956
+ playerBaseLifeRegenMax: 1.5,
957
+ sumStatsLimit: 500,
958
+ maxActiveLayers: 4,
959
+ initialLifeFraction: 1.0,
960
+
961
+ // ── Combat / death ─────────────────────────────────────────────────
962
+ respawnDurationMs: 3000,
963
+ collisionLifeLoss: 10,
964
+
965
+ // ── Economy — Fountain & Sink model ────────────────────────────────
966
+ economyRules: {
967
+ botSpawnCoins: 50,
968
+ playerSpawnCoins: 50,
969
+ coinKillPercentVsBot: 0.4,
970
+ coinKillPercentVsPlayer: 0.15,
971
+ coinKillMinAmount: 10,
972
+ respawnCostPercent: 0.0,
973
+ portalFee: 0,
974
+ craftingFeePercent: 0.0,
975
+ },
976
+
977
+ // ── Regen ──────────────────────────────────────────────────────────
978
+ lifeRegenChance: 300,
979
+ maxChance: 10000,
980
+
981
+ // ── Per-entity-type defaults ───────────────────────────────────────
982
+ entityDefaults: ENTITY_TYPE_DEFAULTS.map((e) => ({ ...e })),
983
+
984
+ // ── Status icons (numeric IDs only — visuals live in client defaults) ──
985
+ statusIcons: STATUS_ICONS.map((s) => ({ ...s })),
986
+
987
+ // ── Skill system ───────────────────────────────────────────────────
988
+ // Canonical skill definitions live in DefaultSkillConfig above.
989
+ // This reference is the single point of consumption for the gRPC
990
+ // fallback defaults — any change goes through DefaultSkillConfig.
991
+ skillConfig: DefaultSkillConfig,
992
+
993
+ skillRules: {
994
+ projectileSpawnChance: 0.5,
995
+ projectileLifetimeMs: 2000,
996
+ projectileWidth: 1,
997
+ projectileHeight: 1,
998
+ projectileSpeedMultiplier: 3,
999
+ doppelgangerSpawnChance: 0.5,
1000
+ doppelgangerLifetimeMs: 5000,
1001
+ doppelgangerSpawnRadius: 3,
1002
+ doppelgangerInitialLifeFraction: 1.0,
1003
+ },
1004
+
1005
+ // ── Equipment Rules ────────────────────────────────────────────────
1006
+ equipmentRules: { ...EQUIPMENT_RULES_DEFAULTS },
1007
+ };
1008
+
1009
+ // ─────────────────────────────────────────────────────────────────────────────
1010
+ // Instance-conf default backfill
1011
+ // ─────────────────────────────────────────────────────────────────────────────
1012
+
1013
+ const _isPlainObject = (v) => v !== null && typeof v === 'object' && !Array.isArray(v);
1014
+
1015
+ const _cloneDefault = (v) => JSON.parse(JSON.stringify(v));
1016
+
1017
+ /**
1018
+ * Recursively backfill one value against its canonical default:
1019
+ * - null / undefined → deep clone of the default
1020
+ * - empty array → deep clone of the default (config lists must never
1021
+ * export empty — e.g. skillConfig, entityDefaults)
1022
+ * - non-empty array → kept verbatim (author content)
1023
+ * - plain object → keep author-set keys, recurse to fill missing default keys
1024
+ * - scalar → kept verbatim when present (0, '', false count as present)
1025
+ */
1026
+ function _deepFillDefaults(value, defaultValue) {
1027
+ if (value === null || value === undefined) return _cloneDefault(defaultValue);
1028
+ if (Array.isArray(defaultValue)) {
1029
+ return Array.isArray(value) && value.length > 0 ? value : _cloneDefault(defaultValue);
1030
+ }
1031
+ if (_isPlainObject(defaultValue) && _isPlainObject(value)) {
1032
+ const out = { ...value };
1033
+ for (const key of Object.keys(defaultValue)) {
1034
+ out[key] = _deepFillDefaults(value[key], defaultValue[key]);
1035
+ }
1036
+ return out;
1037
+ }
1038
+ return value;
1039
+ }
1040
+
1041
+ /**
1042
+ * Normalise a skillConfig array to the shape CyberiaInstanceConfSchema stores
1043
+ * (`SkillConfigEntrySchema` = { triggerItemId, logicEventIds }). The canonical
1044
+ * DefaultSkillConfig carries extra `skills` metadata the schema drops on write;
1045
+ * stripping it here keeps export ⇄ DB round-trips churn-free.
1046
+ */
1047
+ function _normaliseSkillConfig(skillConfig) {
1048
+ if (!Array.isArray(skillConfig)) return [];
1049
+ return skillConfig.map((entry) => ({
1050
+ triggerItemId: entry.triggerItemId,
1051
+ logicEventIds: [...(entry.logicEventIds || [])],
1052
+ }));
1053
+ }
1054
+
1055
+ /**
1056
+ * Return a copy of a CyberiaInstanceConf document with every field defined by
1057
+ * CyberiaInstanceConfSchema present. Missing, null/undefined, or empty-array
1058
+ * fields — common when a doc is read with `.lean()` (which skips Mongoose schema
1059
+ * defaults), was created before a schema field existed, or was seeded with the
1060
+ * schema's empty-array default (e.g. `skillConfig`) — are filled from
1061
+ * CYBERIA_INSTANCE_CONF_DEFAULTS, the same canonical values the fallback world
1062
+ * uses. Author-set scalars (including 0, '', false), non-empty arrays, and DB
1063
+ * metadata (_id, instanceCode, timestamps) are preserved untouched.
1064
+ *
1065
+ * @param {object} [conf]
1066
+ * @returns {object}
1067
+ */
1068
+ export function fillInstanceConfDefaults(conf = {}) {
1069
+ const source = _isPlainObject(conf) ? conf : {};
1070
+ const out = { ...source };
1071
+ for (const key of Object.keys(CYBERIA_INSTANCE_CONF_DEFAULTS)) {
1072
+ out[key] = _deepFillDefaults(source[key], CYBERIA_INSTANCE_CONF_DEFAULTS[key]);
1073
+ }
1074
+ out.skillConfig = _normaliseSkillConfig(out.skillConfig);
1075
+ return out;
1076
+ }