@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,642 @@
1
+ /**
2
+ * WordPress runtime for the Underpost engine.
3
+ * Manages WordPress installations backed by LAMPP (Apache + PHP 8+) and MariaDB.
4
+ *
5
+ * Two provisioning modes:
6
+ * - **clone** — `conf.repository` is set: clones that GitHub repo as the wp root.
7
+ * - **fresh** — no `conf.repository`: downloads wordpress.org/latest.zip, creates
8
+ * the database if it does not exist, and writes wp-config.php.
9
+ *
10
+ * @module src/runtime/wp/Wp.js
11
+ * @namespace WpService
12
+ */
13
+
14
+ import fs from 'fs-extra';
15
+ import path from 'path';
16
+ import { shellExec } from '../../server/process.js';
17
+ import { loggerFactory } from '../../server/logger.js';
18
+ import { Lampp } from '../lampp/Lampp.js';
19
+ import Underpost from '../../index.js';
20
+
21
+ const logger = loggerFactory(import.meta);
22
+
23
+ const WP_DOWNLOAD_URL = 'https://wordpress.org/latest.zip';
24
+ const WP_ZIP_PATH = '/tmp/wordpress-latest.zip';
25
+ const WP_BASE_DIR = '/opt/lampp/htdocs/wp';
26
+ // XAMPP ships its own PHP binary under /opt/lampp/bin which is not on the default
27
+ // PATH for non-login shells spawned by shellExec. Prepend it to every wp-cli call.
28
+ const LAMPP_BIN = '/opt/lampp/bin';
29
+
30
+ /**
31
+ * @class WpService
32
+ * @description Manages WordPress provisioning and Apache virtual-host wiring
33
+ * on top of the LAMPP service. Each server conf entry with `runtime: 'wp'`
34
+ * is handled here.
35
+ * @memberof WpService
36
+ */
37
+ class WpService {
38
+ /**
39
+ * Ensures the base WordPress hosting directory exists.
40
+ */
41
+ static ensureBaseDir() {
42
+ if (!fs.existsSync(WP_BASE_DIR)) fs.mkdirSync(WP_BASE_DIR, { recursive: true });
43
+ }
44
+
45
+ /**
46
+ * Returns the on-disk root path for a WordPress site.
47
+ * @param {string} host - Virtual-host name (used as folder name).
48
+ * @returns {string}
49
+ */
50
+ static siteDir(host) {
51
+ return path.join(WP_BASE_DIR, host);
52
+ }
53
+
54
+ /**
55
+ * Ensures WP-CLI (`wp`) is available on PATH, downloading and installing it
56
+ * to `/usr/local/bin/wp` if it is not already present.
57
+ */
58
+ static ensureWpCli() {
59
+ const existing = shellExec(`PATH="${LAMPP_BIN}:$PATH" which wp`, {
60
+ stdout: true,
61
+ silent: true,
62
+ disableLog: true,
63
+ silentOnError: true,
64
+ });
65
+ if (existing && existing.trim()) return;
66
+ logger.info('WP-CLI not found — installing to /usr/local/bin/wp');
67
+ shellExec(`curl -sL -o /tmp/wp-cli.phar https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar`);
68
+ shellExec(`chmod +x /tmp/wp-cli.phar`);
69
+ shellExec(`sudo mv /tmp/wp-cli.phar /usr/local/bin/wp`);
70
+ }
71
+
72
+ /**
73
+ * Ensures a no-op sendmail stub exists at /usr/sbin/sendmail so WP plugins
74
+ * that invoke sendmail directly do not crash when a real MTA is absent.
75
+ * Mirrors the Dockerfile `RUN printf '#!/bin/sh\ncat > /dev/null\n' > /usr/sbin/sendmail`
76
+ * line but guards against older container images that pre-date that layer.
77
+ */
78
+ static ensureSendmail() {
79
+ const sendmailPath = '/usr/sbin/sendmail';
80
+ const existing = shellExec(`test -x "${sendmailPath}" && echo ok`, {
81
+ stdout: true,
82
+ silent: true,
83
+ disableLog: true,
84
+ silentOnError: true,
85
+ });
86
+ if (existing && existing.trim() === 'ok') return;
87
+ logger.info('sendmail stub missing — creating no-op at /usr/sbin/sendmail');
88
+ shellExec(
89
+ `printf '#!/bin/sh\\ncat > /dev/null\\n' | sudo tee ${sendmailPath} > /dev/null && sudo chmod +x ${sendmailPath}`,
90
+ );
91
+ }
92
+
93
+ /**
94
+ * Provisions a WordPress site and registers it with the LAMPP virtual-host router.
95
+ *
96
+ * Directory layout (e.g. host='test.nexodev.org', pathRoute='/wp'):
97
+ * - DocumentRoot (vhostDir): /opt/lampp/htdocs/wp/test.nexodev.org
98
+ * - WordPress files (wpDir): /opt/lampp/htdocs/wp/test.nexodev.org/wp
99
+ * - Root .htaccess rewrites / → /wp/ so Apache serves WordPress transparently.
100
+ *
101
+ * When pathRoute='/' the DocumentRoot and wpDir are the same directory.
102
+ *
103
+ * @param {object} opts
104
+ * @param {number} opts.port - Apache VirtualHost listen port.
105
+ * @param {string} opts.host - Server name / virtual host.
106
+ * @param {string} opts.pathRoute - URL path (e.g. '/wp' or '/').
107
+ * @param {string|null} [opts.repository] - GitHub HTTPS clone URL. When set the
108
+ * site root is cloned instead of downloading WordPress.
109
+ * @param {object|null} [opts.db] - MariaDB connection config:
110
+ * `{ host, name, user, password }`.
111
+ * Required for fresh installs; ignored when
112
+ * `repository` is set (wp-config.php is assumed
113
+ * to be part of the repo).
114
+ * @param {object|null} [opts.wp] - WordPress install config:
115
+ * `{ title, adminUser, adminPassword, adminEmail }`.
116
+ * @param {boolean} [opts.redirect] - If true, enables Apache RewriteEngine redirection.
117
+ * @param {string} [opts.redirectTarget] - Target URL for the redirect rule.
118
+ * @param {boolean} [opts.resetRouter] - Clear LAMPP router before appending.
119
+ * @returns {{ disabled: boolean }}
120
+ */
121
+ static createApp({ port, host, pathRoute, repository, db, wp, redirect, redirectTarget, resetRouter }) {
122
+ if (!Lampp.enabled()) {
123
+ logger.warn(`LAMPP not installed — skipping ${host}`);
124
+ return { disabled: true };
125
+ }
126
+
127
+ WpService.ensureBaseDir();
128
+
129
+ // DocumentRoot for the Apache VirtualHost — always under WP_BASE_DIR/<host>
130
+ const vhostDir = WpService.siteDir(host);
131
+
132
+ // When pathRoute is a subdirectory (e.g. '/wp'), WordPress files live one level deeper.
133
+ // When pathRoute is '/' they share the same directory as the DocumentRoot.
134
+ const subDir = pathRoute && pathRoute !== '/' ? pathRoute.replace(/^\/+/, '').replace(/\/+$/, '') : '';
135
+ const wpDir = subDir ? path.join(vhostDir, subDir) : vhostDir;
136
+
137
+ let freshInstall = false;
138
+ if (repository) {
139
+ ({ freshInstall } = WpService.provisionClone({ host, siteRoot: wpDir, repository, db, wp, subDir }));
140
+ } else {
141
+ ({ freshInstall } = WpService.provisionFresh({ host, siteRoot: wpDir, db, wp, subDir }));
142
+ }
143
+
144
+ // Ensure git is initialized and linked to the backup repository.
145
+ // Mark the directory as safe before git operations — the site root is owned
146
+ // by daemon:daemon (Apache) and git 2.35+ refuses to run in directories owned
147
+ // by a different user unless explicitly declared safe.
148
+ if (repository) {
149
+ shellExec(`git config --global --add safe.directory "${wpDir}"`);
150
+ Underpost.repo.initLocalRepo({ path: wpDir, origin: repository });
151
+ }
152
+
153
+ // Write a root .htaccess that rewrites / → /subDir/ when running in subdirectory mode
154
+ if (subDir) {
155
+ WpService.ensureSubdirHtaccess({ vhostDir, subDir });
156
+ }
157
+
158
+ // Write security rules into the WordPress root .htaccess
159
+ WpService.ensureSecurityHtaccess({ dir: wpDir });
160
+
161
+ // Make the site writable by the XAMPP Apache process (runs as daemon:daemon).
162
+ // This is required for plugins like Wordfence WAF and Sucuri that write config/upload files.
163
+ shellExec(`sudo chown -R daemon:daemon "${vhostDir}"`);
164
+ shellExec(`sudo find "${vhostDir}" -type d -exec chmod 755 {} \\;`);
165
+ shellExec(`sudo find "${vhostDir}" -type f -exec chmod 644 {} \\;`);
166
+
167
+ // Wire up Apache VirtualHost via Lampp — DocumentRoot is always vhostDir;
168
+ // Lampp.createApp uses `directory` directly as the DocumentRoot.
169
+ const { disabled } = Lampp.createApp({
170
+ port,
171
+ host,
172
+ path: pathRoute,
173
+ directory: vhostDir,
174
+ redirect,
175
+ redirectTarget,
176
+ resetRouter,
177
+ });
178
+
179
+ // Immediately commit and push all generated files (wp-config.php, .htaccess,
180
+ // security rules, plugins, etc.) so that on rollout/restart the clone will
181
+ // have a complete working state and won't fall back to fresh install again.
182
+ if (repository && freshInstall) {
183
+ WpService.persistToRepo({ siteRoot: wpDir, repository, host });
184
+ }
185
+
186
+ return { disabled };
187
+ }
188
+
189
+ /**
190
+ * Clone mode — clones `repository` into `siteRoot` if not present, then
191
+ * verifies `wp-config.php` exists. If it is missing the site root is wiped
192
+ * and a fresh WordPress install is performed (requires `db` config).
193
+ * @param {object} opts
194
+ * @param {string} opts.host - Virtual-host name (for logging).
195
+ * @param {string} opts.siteRoot - Absolute path where the site should live.
196
+ * @param {string} opts.repository - HTTPS clone URL.
197
+ * @param {object|null} [opts.db] - MariaDB config used as fallback for fresh install.
198
+ */
199
+ static provisionClone({ host, siteRoot, repository, db, wp, subDir = '' }) {
200
+ if (!process.env.GITHUB_TOKEN && repository && repository.startsWith('https://github.com/')) {
201
+ logger.warn(`${host}: GITHUB_TOKEN not set — git operations will fail for private repositories`);
202
+ }
203
+
204
+ // Step 0 — verify the remote repository is reachable; fall back to fresh install if not.
205
+ // repository.js isRemoteRepo handles token injection internally.
206
+ const repoAccessible = Underpost.repo.isRemoteRepo(repository);
207
+ logger.info(`${host}: remote accessible = ${repoAccessible} (${repository})`);
208
+ if (!repoAccessible) {
209
+ logger.warn(`${host}: remote repository not accessible (${repository}) — running fresh install`);
210
+ return WpService.provisionFresh({ host, siteRoot, db, wp, subDir });
211
+ }
212
+
213
+ // Step 1 — clone if the directory does not exist yet
214
+ if (!fs.existsSync(siteRoot)) {
215
+ logger.info(`${host}: cloning ${repository} → ${siteRoot}`);
216
+ const cloneUrl = Underpost.repo.resolveAuthUrl(repository);
217
+ const tmp = `${siteRoot}.tmp`;
218
+ if (fs.existsSync(tmp)) shellExec(`sudo rm -rf "${tmp}"`);
219
+ shellExec(`git clone "${cloneUrl}" "${tmp}"`);
220
+ shellExec(`sudo mv "${tmp}" "${siteRoot}"`);
221
+ shellExec(`sudo chmod -R 755 "${siteRoot}"`);
222
+ shellExec(`sudo chown -R daemon:daemon "${siteRoot}"`);
223
+ } else {
224
+ logger.info(`${host}: repo already present at ${siteRoot}`);
225
+ }
226
+
227
+ // Step 2 — verify wp-config.php; if missing, wipe and do a fresh install.
228
+ // initLocalRepo is NOT called here — createApp always calls it after provisionClone
229
+ // returns (whether clone or fallback path) so we avoid a double-init and ensure
230
+ // safe.directory is declared before git runs.
231
+ if (!fs.existsSync(path.join(siteRoot, 'wp-config.php'))) {
232
+ logger.warn(`${host}: wp-config.php not found — wiping site root and running fresh install`);
233
+ shellExec(`sudo rm -rf "${siteRoot}"`);
234
+ return WpService.provisionFresh({ host, siteRoot, db, wp, subDir });
235
+ }
236
+
237
+ return { freshInstall: false };
238
+ }
239
+
240
+ /**
241
+ * Fresh-install mode — downloads wordpress.org/latest.zip, extracts it,
242
+ * creates the MariaDB database, and writes wp-config.php.
243
+ * @param {object} opts
244
+ * @param {string} opts.host - Virtual-host name (for logging).
245
+ * @param {string} opts.siteRoot - Absolute path where WordPress should live.
246
+ * @param {object|null} opts.db - `{ host, name, user, password }`.
247
+ */
248
+ static provisionFresh({ host, siteRoot, db, wp, subDir = '' }) {
249
+ // Validator: wp-config.php presence means installation is complete/valid
250
+ if (fs.existsSync(path.join(siteRoot, 'wp-config.php'))) {
251
+ logger.info(`${host}: wp-config.php found at ${siteRoot}, skipping fresh install`);
252
+ return { freshInstall: false };
253
+ }
254
+
255
+ logger.info(`${host}: fresh install → ${siteRoot}`);
256
+
257
+ // Download WordPress zip if not already cached
258
+ if (!fs.existsSync(WP_ZIP_PATH)) {
259
+ shellExec(`curl -Lo "${WP_ZIP_PATH}" "${WP_DOWNLOAD_URL}"`);
260
+ }
261
+
262
+ // Extract to /tmp/wordpress then move to siteRoot
263
+ const extractDir = '/tmp/wp-extract';
264
+ if (fs.existsSync(extractDir)) shellExec(`sudo rm -rf "${extractDir}"`);
265
+ fs.mkdirSync(extractDir, { recursive: true });
266
+ shellExec(`unzip -q "${WP_ZIP_PATH}" -d "${extractDir}"`);
267
+ // The zip always extracts to /tmp/wp-extract/wordpress/
268
+ const extracted = path.join(extractDir, 'wordpress');
269
+ if (fs.existsSync(siteRoot)) shellExec(`sudo rm -rf "${siteRoot}"`);
270
+ // Ensure parent directory exists (e.g. /opt/lampp/htdocs/wp/<host>/)
271
+ const parentDir = path.dirname(siteRoot);
272
+ if (!fs.existsSync(parentDir)) fs.mkdirSync(parentDir, { recursive: true });
273
+ shellExec(`sudo mv "${extracted}" "${siteRoot}"`);
274
+ shellExec(`sudo chmod -R 755 "${siteRoot}"`);
275
+ shellExec(`sudo chown -R daemon:daemon "${siteRoot}"`);
276
+
277
+ if (db) {
278
+ WpService.createDatabase(db);
279
+ WpService.writeWpConfig({ siteRoot, db, host, subDir, wp });
280
+ WpService.wpCliInstall({ siteRoot, db, host, wp, subDir });
281
+ } else {
282
+ logger.warn(`${host}: no db config provided — wp-config.php not written`);
283
+ }
284
+
285
+ return { freshInstall: true };
286
+ }
287
+
288
+ /**
289
+ * Runs WP-CLI to complete the WordPress installation non-interactively,
290
+ * then installs and activates the Wordfence security plugin.
291
+ * Safe to call on an already-installed site — wp-cli will detect it and skip.
292
+ * @param {object} opts
293
+ * @param {string} opts.siteRoot - Absolute path to the WordPress installation.
294
+ * @param {object} opts.db - MariaDB config (unused here but kept for signature consistency).
295
+ * @param {string} opts.host - Virtual-host name.
296
+ * @param {object|null} [opts.wp] - WordPress install config from server conf:
297
+ * `{ title, adminUser, adminPassword, adminEmail }`.
298
+ * @param {string} [opts.subDir] - Subdirectory name (e.g. 'wp').
299
+ */
300
+ static wpCliInstall({ siteRoot, db, host, wp, subDir = '' }) {
301
+ WpService.ensureWpCli();
302
+ WpService.ensureSendmail();
303
+ const siteUrl = subDir ? `https://${host}/${subDir}` : `https://${host}`;
304
+ const adminUser = (wp && wp.adminUser) || process.env.WP_ADMIN_USER || 'admin';
305
+ const adminPassword =
306
+ (wp && wp.adminPassword) ||
307
+ process.env.WP_ADMIN_PASSWORD ||
308
+ 'ChangeMe_' + Math.random().toString(36).slice(2, 10);
309
+ const adminEmail = (wp && wp.adminEmail) || process.env.WP_ADMIN_EMAIL || `admin@${host}`;
310
+ const siteTitle = (wp && wp.title) || process.env.WP_SITE_TITLE || host;
311
+ // Prepend XAMPP's bin dir so WP-CLI can find the bundled PHP binary.
312
+ const wpCli = (cmd) =>
313
+ shellExec(`PATH="${LAMPP_BIN}:$PATH" wp --allow-root --path="${siteRoot}" ${cmd}`, {
314
+ stdout: true,
315
+ silent: false,
316
+ });
317
+
318
+ // Step 1 — install WordPress core (skipped automatically by WP-CLI if already installed)
319
+ logger.info(`${host}: running wp core install`);
320
+ wpCli(
321
+ `core install` +
322
+ ` --url="${siteUrl}"` +
323
+ ` --title="${siteTitle}"` +
324
+ ` --admin_user="${adminUser}"` +
325
+ ` --admin_password="${adminPassword}"` +
326
+ ` --admin_email="${adminEmail}"` +
327
+ ` --skip-email`,
328
+ );
329
+
330
+ // Step 2 — install and activate Wordfence Security
331
+ logger.info(`${host}: installing Wordfence security plugin`);
332
+ wpCli(`plugin install wordfence --activate`);
333
+ wpCli(`plugin install all-in-one-wp-security-and-firewall --activate`);
334
+ wpCli(`plugin install sucuri-scanner --activate`);
335
+ wpCli(`plugin install cleantalk-spam-protect --activate`);
336
+
337
+ // Step 3 — enable auto-updates for the plugin
338
+ wpCli(`plugin auto-updates enable wordfence`);
339
+ wpCli(`plugin auto-updates enable all-in-one-wp-security-and-firewall`);
340
+ wpCli(`plugin auto-updates enable sucuri-scanner`);
341
+ wpCli(`plugin auto-updates enable cleantalk-spam-protect`);
342
+
343
+ // Step 4 — install and activate WP Mail SMTP when configured
344
+ if (wp && wp.wpMailSmtp) {
345
+ logger.info(`${host}: installing WP Mail SMTP plugin`);
346
+ wpCli(`plugin install wp-mail-smtp --activate`);
347
+ wpCli(`plugin auto-updates enable wp-mail-smtp`);
348
+ }
349
+
350
+ logger.info(`${host}: WP-CLI provisioning complete`, { siteUrl, adminUser, adminEmail });
351
+ }
352
+
353
+ /**
354
+ * Appends rewrite rules for a WordPress subdirectory to the root .htaccess.
355
+ * Each subdirectory gets its own scoped RewriteRule block so multiple
356
+ * WordPress installs under the same host do not overwrite each other.
357
+ * @param {{ vhostDir: string, subDir: string }} opts
358
+ */
359
+ static ensureSubdirHtaccess({ vhostDir, subDir }) {
360
+ if (!fs.existsSync(vhostDir)) fs.mkdirSync(vhostDir, { recursive: true });
361
+ const htaccessPath = path.join(vhostDir, '.htaccess');
362
+
363
+ // Marker comments to identify each subDir block
364
+ const marker = `# -- wp-subdir: ${subDir} --`;
365
+ const block = `${marker}
366
+ RewriteCond %{REQUEST_URI} ^\\/${subDir}(\\/|$) [NC]
367
+ RewriteCond %{REQUEST_FILENAME} !-f
368
+ RewriteCond %{REQUEST_FILENAME} !-d
369
+ RewriteRule ^${subDir}\\/?(.*)?$ \\/${subDir}\\/index.php [L]
370
+ ${marker} end`;
371
+
372
+ let existing = '';
373
+ if (fs.existsSync(htaccessPath)) {
374
+ existing = fs.readFileSync(htaccessPath, 'utf8');
375
+ }
376
+
377
+ // If this subDir block already exists, replace it; otherwise append
378
+ const markerRegex = new RegExp(
379
+ `${marker.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}[\\s\\S]*?${marker.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')} end`,
380
+ );
381
+
382
+ if (markerRegex.test(existing)) {
383
+ existing = existing.replace(markerRegex, block);
384
+ } else {
385
+ // Ensure the RewriteEngine directive and IfModule wrapper exist
386
+ if (!existing.includes('RewriteEngine on')) {
387
+ existing = `<IfModule mod_rewrite.c>\nRewriteEngine on\n\n</IfModule>\n`;
388
+ }
389
+ // Insert the new block before the closing </IfModule>
390
+ existing = existing.replace('</IfModule>', `${block}\n</IfModule>`);
391
+ }
392
+
393
+ fs.writeFileSync(htaccessPath, existing, 'utf8');
394
+ logger.info(`subdirectory .htaccess updated`, { vhostDir, subDir });
395
+ }
396
+
397
+ /**
398
+ * Writes security rules into the WordPress site root `.htaccess`.
399
+ * Protects `.git` directories, sensitive config files, and SQL dumps
400
+ * from being served by Apache. Idempotent — uses marker comments to
401
+ * detect and replace existing blocks on re-runs.
402
+ * @param {{ dir: string }} opts
403
+ * @param {string} opts.dir - Absolute path to the WordPress root (where .htaccess lives).
404
+ */
405
+ static ensureSecurityHtaccess({ dir }) {
406
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
407
+ const htaccessPath = path.join(dir, '.htaccess');
408
+
409
+ const marker = '# -- wp-security --';
410
+ const block = `${marker}
411
+ # Block access to .git directories and files
412
+ RedirectMatch 404 /\\.git
413
+
414
+ # Block access to sensitive dotfiles
415
+ <FilesMatch "^\\.(env|htpasswd|htaccess\\.bak|DS_Store)">
416
+ Require all denied
417
+ </FilesMatch>
418
+
419
+ # Block access to WordPress config backups and SQL dumps
420
+ <FilesMatch "(wp-config\\.php\\.bak|wp-config-sample\\.php|\\.sql|\\.sql\\.gz)$">
421
+ Require all denied
422
+ </FilesMatch>
423
+
424
+ # Block direct access to PHP files in uploads
425
+ <IfModule mod_rewrite.c>
426
+ RewriteEngine On
427
+ RewriteRule ^wp-content/uploads/.*\\.php$ - [F,L]
428
+ </IfModule>
429
+
430
+ # Block access to xmlrpc.php (common attack vector)
431
+ <Files "xmlrpc.php">
432
+ Require all denied
433
+ </Files>
434
+
435
+ # Block access to readme.html and license.txt (version disclosure)
436
+ <FilesMatch "^(readme\\.html|license\\.txt)$">
437
+ Require all denied
438
+ </FilesMatch>
439
+ ${marker} end`;
440
+
441
+ let existing = '';
442
+ if (fs.existsSync(htaccessPath)) {
443
+ existing = fs.readFileSync(htaccessPath, 'utf8');
444
+ }
445
+
446
+ const markerRegex = new RegExp(
447
+ `${marker.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}[\\s\\S]*?${marker.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')} end`,
448
+ );
449
+
450
+ if (markerRegex.test(existing)) {
451
+ existing = existing.replace(markerRegex, block);
452
+ } else {
453
+ existing = existing ? `${existing}\n${block}\n` : `${block}\n`;
454
+ }
455
+
456
+ fs.writeFileSync(htaccessPath, existing, 'utf8');
457
+ logger.info(`security .htaccess updated`, { dir });
458
+ }
459
+
460
+ /**
461
+ * Ensures a WordPress-specific `.gitignore` exists in the site root so that
462
+ * large/transient files are excluded from the backup repository while
463
+ * wp-config.php and security .htaccess ARE tracked.
464
+ * Idempotent — only writes when the file is missing.
465
+ * @param {{ dir: string }} opts
466
+ */
467
+ static ensureGitignore({ dir }) {
468
+ const gitignorePath = path.join(dir, '.gitignore');
469
+ if (fs.existsSync(gitignorePath)) return;
470
+ const content = `# WordPress .gitignore
471
+ # Cache and temp
472
+ wp-content/cache/
473
+ wp-content/upgrade/
474
+ wp-content/backup-db/
475
+ wp-content/backups/
476
+ wp-content/blogs.dir/
477
+ wp-content/advanced-cache.php
478
+ wp-content/wp-cache-config.php
479
+ wp-content/debug.log
480
+
481
+ # OS / editor
482
+ .DS_Store
483
+ Thumbs.db
484
+ *.swp
485
+ *.swo
486
+ *~
487
+ `;
488
+ fs.writeFileSync(gitignorePath, content, 'utf8');
489
+ logger.info(`.gitignore written`, { dir });
490
+ }
491
+
492
+ /**
493
+ * Commits all files in the WordPress site root and pushes to the remote
494
+ * repository. This persists wp-config.php, .htaccess security rules,
495
+ * installed plugins, and theme files so that on pod rollout/restart a
496
+ * `git clone` yields a fully working site without needing a fresh install.
497
+ *
498
+ * Safe to call repeatedly — `git commit` is a no-op when the working tree
499
+ * is clean (`silentOnError: true` swallows the non-zero exit gracefully).
500
+ *
501
+ * @param {object} opts
502
+ * @param {string} opts.siteRoot - Absolute path to the WordPress root.
503
+ * @param {string} opts.repository - Git remote URL.
504
+ * @param {string} opts.host - Virtual-host name (for logging/commit msg).
505
+ */
506
+ static persistToRepo({ siteRoot, repository, host }) {
507
+ if (!fs.existsSync(path.join(siteRoot, '.git'))) {
508
+ logger.warn(`persistToRepo: .git missing at ${siteRoot} — skipping`);
509
+ return;
510
+ }
511
+
512
+ WpService.ensureGitignore({ dir: siteRoot });
513
+
514
+ const githubOrg = process.env.GITHUB_USERNAME || 'underpostnet';
515
+ const repoName = repository.split('/').pop().split('.')[0];
516
+
517
+ logger.info(`${host}: persisting site to repository`);
518
+ shellExec(
519
+ `cd "${siteRoot}" && git add -A && git commit -m "wp provision ${host} $(date -u +%Y-%m-%dT%H:%M:%SZ)"`,
520
+ { silentOnError: true },
521
+ );
522
+ shellExec(`cd "${siteRoot}" && underpost push . ${githubOrg}/${repoName} -f`);
523
+ logger.info(`${host}: initial commit pushed to ${githubOrg}/${repoName}`);
524
+ }
525
+
526
+ /**
527
+ * Drops and recreates a MariaDB database to ensure a clean state for fresh installs.
528
+ * @param {{ host: string, name: string, user: string, password: string }} db
529
+ */
530
+ static createDatabase({ host, name, user, password }) {
531
+ logger.info(`Dropping and recreating database "${name}" on ${host}`);
532
+ const mysql = `/opt/lampp/bin/mysql`;
533
+ const q = (s) => s.replace(/'/g, "\\'");
534
+ const exec = (sql) => shellExec(`${mysql} -h '${host}' -u '${q(user)}' -p'${q(password)}' -e "${sql}"`);
535
+ exec(`DROP DATABASE IF EXISTS \\\`${q(name)}\\\``);
536
+ exec(`CREATE DATABASE \\\`${q(name)}\\\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci`);
537
+ }
538
+
539
+ /**
540
+ * Writes a minimal `wp-config.php` from `wp-config-sample.php`.
541
+ * When `wp.wpMailSmtp` is provided, injects WP Mail SMTP plugin constants
542
+ * (WPMS_ON, WPMS_SMTP_HOST, etc.) so the plugin is pre-configured on first boot.
543
+ * @param {{ siteRoot: string, db: { host: string, name: string, user: string, password: string }, host?: string, subDir?: string, wp?: object }} opts
544
+ */
545
+ static writeWpConfig({ siteRoot, db, host = '', subDir = '', wp }) {
546
+ const sample = path.join(siteRoot, 'wp-config-sample.php');
547
+ const target = path.join(siteRoot, 'wp-config.php');
548
+ if (!fs.existsSync(sample)) {
549
+ logger.warn(`wp-config-sample.php not found at ${siteRoot}`);
550
+ return;
551
+ }
552
+ let cfg = fs.readFileSync(sample, 'utf8');
553
+ cfg = cfg
554
+ .replace("define( 'DB_NAME', 'database_name_here' );", `define( 'DB_NAME', '${db.name}' );`)
555
+ .replace("define( 'DB_USER', 'username_here' );", `define( 'DB_USER', '${db.user}' );`)
556
+ .replace("define( 'DB_PASSWORD', 'password_here' );", `define( 'DB_PASSWORD', '${db.password}' );`)
557
+ .replace("define( 'DB_HOST', 'localhost' );", `define( 'DB_HOST', '${db.host}' );`)
558
+ .replace("define( 'DB_CHARSET', 'utf8' );", `define( 'DB_CHARSET', 'utf8mb4' );`);
559
+ // When WordPress is installed in a subdirectory, WP_HOME and WP_SITEURL must be set
560
+ if (host && subDir) {
561
+ const wpSiteUrl = `https://${host}/${subDir}`;
562
+ cfg = cfg.replace(
563
+ '/** Absolute path to the WordPress directory. */',
564
+ `define( 'WP_HOME', '${wpSiteUrl}' );\ndefine( 'WP_SITEURL', '${wpSiteUrl}' );\n\n/** Absolute path to the WordPress directory. */`,
565
+ );
566
+ }
567
+ // Inject reverse-proxy HTTPS detection (needed behind Contour/envoy)
568
+ const httpsSnippet = `
569
+ if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
570
+ $_SERVER['HTTPS'] = 'on';
571
+ }
572
+ `;
573
+ cfg = cfg.replace('<?php', `<?php\n${httpsSnippet}`);
574
+
575
+ // Inject WP Mail SMTP constants when wpMailSmtp config is provided
576
+ const wpMailSmtp = wp && wp.wpMailSmtp;
577
+ if (wpMailSmtp) {
578
+ const smtp = wpMailSmtp.smtp || {};
579
+ const wpmsLines = [
580
+ `define( 'WPMS_ON', true );`,
581
+ wpMailSmtp.fromEmail ? `define( 'WPMS_MAIL_FROM', '${wpMailSmtp.fromEmail}' );` : null,
582
+ wpMailSmtp.fromName ? `define( 'WPMS_MAIL_FROM_NAME', '${wpMailSmtp.fromName}' );` : null,
583
+ `define( 'WPMS_MAIL_FROM_FORCE', true );`,
584
+ `define( 'WPMS_MAIL_FROM_NAME_FORCE', false );`,
585
+ wpMailSmtp.mailer ? `define( 'WPMS_MAILER', '${wpMailSmtp.mailer}' );` : null,
586
+ wpMailSmtp.returnPath !== undefined ? `define( 'WPMS_SET_RETURN_PATH', ${wpMailSmtp.returnPath} );` : null,
587
+ smtp.host ? `define( 'WPMS_SMTP_HOST', '${smtp.host}' );` : null,
588
+ smtp.port ? `define( 'WPMS_SMTP_PORT', ${smtp.port} );` : null,
589
+ smtp.encryption ? `define( 'WPMS_SSL', '${smtp.encryption}' );` : null,
590
+ smtp.auth !== undefined ? `define( 'WPMS_SMTP_AUTH', ${smtp.auth} );` : null,
591
+ `define( 'WPMS_SMTP_AUTOTLS', true );`,
592
+ smtp.user ? `define( 'WPMS_SMTP_USER', '${smtp.user}' );` : null,
593
+ smtp.pass ? `define( 'WPMS_SMTP_PASS', '${smtp.pass}' );` : null,
594
+ ]
595
+ .filter(Boolean)
596
+ .join('\n');
597
+ cfg = cfg.replace(
598
+ '/** Absolute path to the WordPress directory. */',
599
+ `// WP Mail SMTP plugin constants\n${wpmsLines}\n\n/** Absolute path to the WordPress directory. */`,
600
+ );
601
+ logger.info(`${host}: WP Mail SMTP constants injected into wp-config.php`);
602
+ }
603
+
604
+ fs.writeFileSync(target, cfg, 'utf8');
605
+ logger.info(`wp-config.php written for ${db.name}`);
606
+ }
607
+
608
+ /**
609
+ * Backs up a WordPress site: commits all changes and pushes the
610
+ * site directory to its git remote.
611
+ * If no `.git` directory exists but `repository` is provided, git is
612
+ * initialized first so subsequent cron-triggered backups can push.
613
+ * @param {object} opts
614
+ * @param {string} opts.host - Virtual-host name.
615
+ * @param {string|null} [opts.repository] - Git remote URL; used to initialize git if missing.
616
+ */
617
+ static backup({ host, repository }) {
618
+ const siteRoot = WpService.siteDir(host);
619
+ const githubOrg = process.env.GITHUB_USERNAME || 'underpostnet';
620
+ if (!fs.existsSync(siteRoot)) {
621
+ logger.warn(`backup: site root does not exist — ${siteRoot}`);
622
+ return;
623
+ }
624
+ logger.info(`backup: ${host}`);
625
+
626
+ // Ensure git is initialized when a repository is configured
627
+ if (repository && !fs.existsSync(path.join(siteRoot, '.git'))) {
628
+ Underpost.repo.initLocalRepo({ path: siteRoot, origin: repository });
629
+ }
630
+
631
+ // MariaDB export is handled by the shared db.js backup flow — no duplicate dump here.
632
+ if (fs.existsSync(path.join(siteRoot, '.git'))) {
633
+ shellExec(`cd "${siteRoot}" && git add -A && git commit -m "wp backup $(date -u +%Y-%m-%dT%H:%M:%SZ)"`, { silentOnError: true });
634
+ shellExec(`cd "${siteRoot}" && underpost push . ${githubOrg}/${repository.split('/').pop().split('.')[0]}`);
635
+ logger.info(`backup: git push done for ${siteRoot}`);
636
+ } else {
637
+ logger.warn(`backup: no .git and no repository configured for ${host} — skipping git push`);
638
+ }
639
+ }
640
+ }
641
+
642
+ export { WpService };