@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,476 @@
1
+ /**
2
+ * UnderpostCron server module
3
+ * @module src/server/cron.js
4
+ * @namespace UnderpostCron
5
+ */
6
+
7
+ import { loggerFactory } from './logger.js';
8
+ import { shellExec } from './process.js';
9
+ import fs from 'fs-extra';
10
+ import Underpost from '../index.js';
11
+ import { getUnderpostRootPath, loadCronDeployEnv } from './conf.js';
12
+
13
+ const logger = loggerFactory(import.meta);
14
+
15
+ const volumeHostPath = '/home/dd';
16
+ const enginePath = '/home/dd/engine';
17
+ const cronVolumeName = 'underpost-cron-container-volume';
18
+ const shareEnvVolumeName = 'underpost-share-env';
19
+ const underpostContainerEnvDir = '/usr/lib/node_modules/underpost';
20
+
21
+ /**
22
+ * Generates a Kubernetes CronJob YAML manifest string.
23
+ *
24
+ * @param {Object} params - CronJob parameters
25
+ * @param {string} params.name - CronJob name (max 52 chars, sanitized to DNS subdomain)
26
+ * @param {string} params.expression - Cron schedule expression (e.g., '0 0 * * *')
27
+ * @param {string} params.deployList - Comma-separated deploy IDs for the cron CLI
28
+ * @param {string} params.jobList - Comma-separated job IDs (e.g., 'dns', 'backup')
29
+ * @param {string} [params.image] - Container image (defaults to underpost/underpost-engine:<version>)
30
+ * @param {string} [params.namespace='default'] - Kubernetes namespace
31
+ * @param {boolean} [params.git=false] - Pass --git flag to cron CLI
32
+ * @param {boolean} [params.dev=false] - Use local ./ base path instead of global underpost installation
33
+ * @param {string} [params.cmd] - Optional pre-script commands to run before cron execution
34
+ * @param {boolean} [params.suspend=false] - Whether the CronJob is suspended
35
+ * @param {boolean} [params.dryRun=false] - Pass --dry-run flag to the cron command inside the container
36
+ * @param {boolean} [params.k3s=false] - Pass --k3s flag to the cron command inside the container
37
+ * @param {boolean} [params.kind=false] - Pass --kind flag to the cron command inside the container
38
+ * @param {boolean} [params.kubeadm=false] - Pass --kubeadm flag to the cron command inside the container
39
+ * @returns {string} Kubernetes CronJob YAML manifest
40
+ * @memberof UnderpostCron
41
+ */
42
+ const cronJobYamlFactory = ({
43
+ name,
44
+ expression,
45
+ deployList,
46
+ jobList,
47
+ image,
48
+ namespace = 'default',
49
+ git = false,
50
+ dev = false,
51
+ cmd,
52
+ suspend = false,
53
+ dryRun = false,
54
+ k3s = false,
55
+ kind = false,
56
+ kubeadm = false,
57
+ }) => {
58
+ const containerImage = image || `underpost/underpost-engine:${Underpost.version}`;
59
+
60
+ const sanitizedName = name
61
+ .toLowerCase()
62
+ .replace(/[^a-z0-9-]/g, '-')
63
+ .replace(/--+/g, '-')
64
+ .replace(/^-|-$/g, '')
65
+ .substring(0, 52);
66
+
67
+ const cronBin = 'node bin'; // dev ? 'node bin' : 'underpost';
68
+ const flags = `${git ? '--git ' : ''}${dev ? '--dev ' : ''}${dryRun ? '--dry-run ' : ''}${k3s ? '--k3s ' : ''}${kind ? '--kind ' : ''}${kubeadm ? '--kubeadm ' : ''}`;
69
+ const commands = [`cd ${enginePath}`]; // `node bin run secret`
70
+ if (cmd) commands.push(cmd);
71
+ commands.push(`${cronBin} cron ${deployList} ${jobList} ${flags}`);
72
+ const fullCommand = commands.join(' &&\n ');
73
+
74
+ return `apiVersion: batch/v1
75
+ kind: CronJob
76
+ metadata:
77
+ name: ${sanitizedName}
78
+ namespace: ${namespace}
79
+ labels:
80
+ app: ${sanitizedName}
81
+ managed-by: underpost
82
+ spec:
83
+ schedule: "${expression}"
84
+ concurrencyPolicy: Forbid
85
+ startingDeadlineSeconds: 200
86
+ successfulJobsHistoryLimit: 3
87
+ failedJobsHistoryLimit: 1
88
+ suspend: ${suspend}
89
+ jobTemplate:
90
+ spec:
91
+ template:
92
+ metadata:
93
+ labels:
94
+ app: ${sanitizedName}
95
+ managed-by: underpost
96
+ spec:
97
+ containers:
98
+ - name: ${sanitizedName}
99
+ image: ${containerImage}
100
+ command:
101
+ - /bin/sh
102
+ - -c
103
+ - >
104
+ ${fullCommand}
105
+ volumeMounts:
106
+ - mountPath: ${enginePath}
107
+ name: ${cronVolumeName}
108
+ - mountPath: ${underpostContainerEnvDir}
109
+ name: ${shareEnvVolumeName}
110
+ volumes:
111
+ - hostPath:
112
+ path: ${enginePath}
113
+ type: Directory
114
+ name: ${cronVolumeName}
115
+ - hostPath:
116
+ path: ${getUnderpostRootPath()}
117
+ type: DirectoryOrCreate
118
+ name: ${shareEnvVolumeName}
119
+ restartPolicy: OnFailure
120
+ `;
121
+ };
122
+
123
+ /**
124
+ * Syncs the engine directory into the kind-worker container node.
125
+ * Required for kind clusters where worker nodes don't share the host filesystem.
126
+ *
127
+ * @memberof UnderpostCron
128
+ */
129
+ const syncEngineToKindWorker = () => {
130
+ logger.info('Syncing engine volume to kind-worker node');
131
+ shellExec(`docker exec -i kind-worker bash -c "rm -rf ${volumeHostPath}"`);
132
+ shellExec(`docker exec -i kind-worker bash -c "mkdir -p ${volumeHostPath}"`);
133
+ shellExec(`docker cp ${volumeHostPath}/engine kind-worker:${volumeHostPath}/engine`);
134
+ shellExec(
135
+ `docker exec -i kind-worker bash -c "chown -R 1000:1000 ${volumeHostPath}; chmod -R 755 ${volumeHostPath}"`,
136
+ );
137
+ };
138
+
139
+ /**
140
+ * Resolves the deploy-id to use for cron job generation.
141
+ * When deployId is provided directly, uses it. Otherwise reads from dd.cron file.
142
+ *
143
+ * @param {string} [deployId] - Explicit deploy-id override
144
+ * @memberof UnderpostCron
145
+ * @returns {string|null} Resolved deploy-id or null if not found
146
+ */
147
+ const resolveDeployId = (deployId) => {
148
+ if (deployId) return deployId;
149
+
150
+ const cronDeployFilePath = './engine-private/deploy/dd.cron';
151
+ if (!fs.existsSync(cronDeployFilePath)) {
152
+ return null;
153
+ }
154
+ return fs.readFileSync(cronDeployFilePath, 'utf8').trim();
155
+ };
156
+
157
+ /**
158
+ * UnderpostCron main module methods
159
+ * @class UnderpostCron
160
+ * @memberof UnderpostCron
161
+ */
162
+ class UnderpostCron {
163
+ /** @returns {Object} Available cron job handlers */
164
+ static get JOB() {
165
+ return {
166
+ dns: Underpost.dns,
167
+ backup: Underpost.backup,
168
+ };
169
+ }
170
+
171
+ static API = {
172
+ /**
173
+ * CLI entry point for the `underpost cron` command.
174
+ *
175
+ * @param {string} deployList - Comma-separated deploy IDs
176
+ * @param {string} jobList - Comma-separated job IDs
177
+ * @param {Object} options - CLI flags
178
+ * @param {boolean} [options.generateK8sCronjobs] - Generate K8s CronJob YAML manifests
179
+ * @param {boolean} [options.apply] - Apply manifests to the cluster
180
+ * @param {boolean} [options.git] - Pass --git to job execution
181
+ * @param {boolean} [options.dev] - Use local ./ base path instead of global underpost installation
182
+ * @param {string} [options.cmd] - Optional pre-script commands to run before cron execution
183
+ * @param {string} [options.namespace] - Kubernetes namespace
184
+ * @param {string} [options.image] - Custom container image
185
+ * @param {string} [options.setupStart] - Deploy-id to setup: updates its package.json start and generates+applies cron jobs
186
+ * @param {boolean} [options.k3s] - Use k3s cluster context (apply directly on host)
187
+ * @param {boolean} [options.kind] - Use kind cluster context (apply via kind-worker container)
188
+ * @param {boolean} [options.kubeadm] - Use kubeadm cluster context (apply directly on host)
189
+ * @param {boolean} [options.dryRun] - Preview cron jobs without executing them
190
+ * @param {boolean} [options.createJobNow] - After applying, immediately create a Job from each CronJob (requires --apply)
191
+ * @memberof UnderpostCron
192
+ */
193
+ callback: async function (
194
+ deployList = 'default',
195
+ jobList = Object.keys(Underpost.cron.JOB).join(','),
196
+ options = {},
197
+ ) {
198
+ loadCronDeployEnv();
199
+ if (options.setupStart) return await Underpost.cron.setupDeployStart(options.setupStart, options);
200
+
201
+ if (options.generateK8sCronjobs) return await Underpost.cron.generateK8sCronJobs(options);
202
+
203
+ for (const _jobId of jobList.split(',')) {
204
+ const jobId = _jobId.trim();
205
+ if (Underpost.cron.JOB[jobId]) {
206
+ if (options.dryRun) {
207
+ logger.info(`[dry-run] Would execute cron job`, { jobId, deployList, options });
208
+ } else {
209
+ logger.info(`Executing cron job`, { jobId, deployList, options });
210
+ await Underpost.cron.JOB[jobId].callback(deployList, options);
211
+ }
212
+ } else {
213
+ logger.warn(`Unknown cron job: ${jobId}`);
214
+ }
215
+ }
216
+ },
217
+
218
+ /**
219
+ * Update the package.json start script for the given deploy-id and generate+apply its K8s CronJob manifests.
220
+ *
221
+ * @param {string} deployId - The deploy-id whose package.json will be updated
222
+ * @param {Object} [options] - Additional options forwarded to generateK8sCronJobs
223
+ * @param {boolean} [options.createJobNow] - After applying, immediately create a Job from each CronJob
224
+ * @param {boolean} [options.dryRun] - Pass --dry-run=client to kubectl commands
225
+ * @param {boolean} [options.apply] - Whether to apply generated manifests to the cluster
226
+ * @param {boolean} [options.git] - Pass --git flag to cron CLI commands
227
+ * @param {boolean} [options.dev] - Use local ./ base path instead of global underpost installation
228
+ * @param {string} [options.cmd] - Optional pre-script commands to run before cron execution
229
+ * @param {string} [options.namespace] - Kubernetes namespace for the CronJobs
230
+ * @param {string} [options.image] - Custom container image override for the CronJobs
231
+ * @param {boolean} [options.k3s] - k3s cluster context (apply directly on host)
232
+ * @param {boolean} [options.kind] - kind cluster context (apply via kind-worker container)
233
+ * @param {boolean} [options.kubeadm] - kubeadm cluster context (apply directly on host)
234
+ * @memberof UnderpostCron
235
+ */
236
+ setupDeployStart: async function (deployId, options = {}) {
237
+ if (!deployId || deployId === true) deployId = resolveDeployId();
238
+ const confDir = `./engine-private/conf/${deployId}`;
239
+ const packageJsonPath = `${confDir}/package.json`;
240
+ const confCronPath = `${confDir}/conf.cron.json`;
241
+
242
+ if (!fs.existsSync(confCronPath)) {
243
+ logger.warn(`conf.cron.json not found for deploy-id: ${deployId}`, { path: confCronPath });
244
+ return;
245
+ }
246
+
247
+ const confCron = JSON.parse(fs.readFileSync(confCronPath, 'utf8'));
248
+
249
+ if (!confCron.jobs || Object.keys(confCron.jobs).length === 0) {
250
+ logger.warn(`No cron jobs configured for deploy-id: ${deployId}`);
251
+ return;
252
+ }
253
+
254
+ const hasEnabledJobs = Object.values(confCron.jobs).some((job) => job.enabled !== false);
255
+ if (!hasEnabledJobs) {
256
+ logger.warn(`No enabled cron jobs for deploy-id: ${deployId}`);
257
+ return;
258
+ }
259
+
260
+ // Update package.json start script
261
+ if (fs.existsSync(packageJsonPath)) {
262
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
263
+ let startCommand = 'echo "Starting cron jobs..."';
264
+ for (const job of Object.keys(confCron.jobs))
265
+ startCommand += ` && kubectl apply -f ./manifests/cronjobs/${deployId}/${deployId}-${job}.yaml`;
266
+ if (!packageJson.scripts) packageJson.scripts = {};
267
+ packageJson.scripts.start = startCommand;
268
+
269
+ fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 4) + '\n', 'utf8');
270
+ logger.info(`Updated package.json start script for ${deployId}`, { path: packageJsonPath });
271
+ } else {
272
+ logger.warn(`package.json not found for deploy-id: ${deployId}`, { path: packageJsonPath });
273
+ }
274
+
275
+ await Underpost.cron.generateK8sCronJobs({
276
+ deployId,
277
+ namespace: options.namespace,
278
+ image: options.image,
279
+ apply: options.apply,
280
+ createJobNow: options.createJobNow,
281
+ git: !!options.git,
282
+ dev: !!options.dev,
283
+ kubeadm: !!options.kubeadm,
284
+ cmd: options.cmd || `node bin env ${deployId} production`,
285
+ k3s: !!options.k3s,
286
+ kind: !!options.kind,
287
+ dryRun: !!options.dryRun,
288
+ });
289
+ },
290
+
291
+ /**
292
+ * Generate Kubernetes CronJob YAML manifests from conf.cron.json configuration.
293
+ * Each enabled job produces one CronJob YAML file under manifests/cronjobs/<deployId>/.
294
+ * With --apply the manifests are also applied to the cluster via kubectl.
295
+ *
296
+ * @param {Object} options
297
+ * @param {string} [options.deployId] - Explicit deploy-id (overrides dd.cron file lookup)
298
+ * @param {boolean} [options.git=false] - Pass --git flag to cron CLI commands
299
+ * @param {boolean} [options.dev=false] - Use local ./ base path instead of global underpost
300
+ * @param {string} [options.cmd] - Optional pre-script commands
301
+ * @param {boolean} [options.apply=false] - kubectl apply generated manifests
302
+ * @param {string} [options.namespace='default'] - Target Kubernetes namespace
303
+ * @param {string} [options.image] - Custom container image override
304
+ * @param {boolean} [options.k3s=false] - k3s cluster context (apply directly on host)
305
+ * @param {boolean} [options.kind=false] - kind cluster context (apply via kind-worker container)
306
+ * @param {boolean} [options.kubeadm=false] - kubeadm cluster context (apply directly on host)
307
+ * @param {boolean} [options.createJobNow=false] - After applying, create a Job from each CronJob immediately
308
+ * @param {boolean} [options.dryRun=false] - Pass --dry-run=client to kubectl commands
309
+ * @memberof UnderpostCron
310
+ */
311
+ generateK8sCronJobs: async function (options = {}) {
312
+ const namespace = options.namespace || 'default';
313
+ const jobDeployId = resolveDeployId(options.deployId);
314
+
315
+ if (!jobDeployId) {
316
+ logger.warn(
317
+ 'Could not resolve deploy-id. Provide --setup-start <deploy-id> or create engine-private/deploy/dd.cron',
318
+ );
319
+ return;
320
+ }
321
+
322
+ const confCronPath = `./engine-private/conf/${jobDeployId}/conf.cron.json`;
323
+
324
+ if (!fs.existsSync(confCronPath)) {
325
+ logger.warn(`Cron configuration not found: ${confCronPath}`);
326
+ return;
327
+ }
328
+
329
+ const confCronConfig = JSON.parse(fs.readFileSync(confCronPath, 'utf8'));
330
+
331
+ if (!confCronConfig.jobs || Object.keys(confCronConfig.jobs).length === 0) {
332
+ logger.info('No cron jobs configured');
333
+ return;
334
+ }
335
+
336
+ const outputDir = `./manifests/cronjobs/${jobDeployId}`;
337
+ fs.mkdirSync(outputDir, { recursive: true });
338
+
339
+ const generatedFiles = [];
340
+
341
+ for (const job of Object.keys(confCronConfig.jobs)) {
342
+ const jobConfig = confCronConfig.jobs[job];
343
+
344
+ if (jobConfig.enabled === false) {
345
+ logger.info(`Skipping disabled job: ${job}`);
346
+ continue;
347
+ }
348
+
349
+ const deployIdList = Underpost.cron.getRelatedDeployIdList(job);
350
+ const expression = jobConfig.expression || '0 0 * * *';
351
+ const cronJobName = `${jobDeployId}-${job}`;
352
+
353
+ const yamlContent = cronJobYamlFactory({
354
+ name: cronJobName,
355
+ expression,
356
+ deployList: deployIdList,
357
+ jobList: job,
358
+ image: options.image,
359
+ namespace,
360
+ git: !!options.git,
361
+ dev: !!options.dev,
362
+ cmd: options.cmd,
363
+ suspend: false,
364
+ dryRun: !!options.dryRun,
365
+ k3s: !!options.k3s,
366
+ kind: !!options.kind,
367
+ kubeadm: !!options.kubeadm,
368
+ });
369
+
370
+ const yamlFilePath = `${outputDir}/${cronJobName}.yaml`;
371
+ fs.writeFileSync(yamlFilePath, yamlContent, 'utf8');
372
+ generatedFiles.push(yamlFilePath);
373
+
374
+ logger.info(`Generated CronJob manifest: ${yamlFilePath}`, { job, expression, namespace });
375
+ }
376
+
377
+ if (options.apply) {
378
+ // Delete existing CronJobs before applying new ones
379
+ for (const job of Object.keys(confCronConfig.jobs)) {
380
+ const cronJobName = `${jobDeployId}-${job}`;
381
+ shellExec(`kubectl delete cronjob ${cronJobName} --namespace=${namespace} --ignore-not-found`);
382
+ }
383
+
384
+ // Ensure default dockerhub image is loaded on the cluster when no custom image is provided
385
+ if (!options.image) {
386
+ logger.info('Ensuring default image is loaded on cluster');
387
+ Underpost.image.pullDockerHubImage({
388
+ dockerhubImage: 'underpost',
389
+ kind: !!options.kind,
390
+ k3s: !!options.k3s,
391
+ kubeadm: !!options.kubeadm,
392
+ dev: !!options.dev,
393
+ });
394
+ }
395
+
396
+ // Sync engine volume to kind-worker node if using kind cluster
397
+ if (options.kind) {
398
+ syncEngineToKindWorker();
399
+ }
400
+
401
+ for (const yamlFile of generatedFiles) {
402
+ logger.info(`Applying: ${yamlFile}`);
403
+ shellExec(`kubectl apply -f ${yamlFile}`);
404
+ }
405
+ logger.info('All CronJob manifests applied');
406
+ } else {
407
+ logger.info(`Manifests generated in ${outputDir}. Use --apply to deploy to the cluster.`);
408
+ }
409
+ // Create an immediate Job from each CronJob if requested
410
+ if (options.createJobNow) {
411
+ for (const job of Object.keys(confCronConfig.jobs)) {
412
+ const jobConfig = confCronConfig.jobs[job];
413
+ if (jobConfig.enabled === false) continue;
414
+
415
+ const cronJobName = `${jobDeployId}-${job}`
416
+ .toLowerCase()
417
+ .replace(/[^a-z0-9-]/g, '-')
418
+ .replace(/--+/g, '-')
419
+ .replace(/^-|-$/g, '')
420
+ .substring(0, 52);
421
+
422
+ const immediateJobName = `${cronJobName}-now-${Date.now()}`.substring(0, 63);
423
+ logger.info(`Creating immediate Job from CronJob: ${cronJobName}`, { jobName: immediateJobName });
424
+ shellExec(`kubectl create job ${immediateJobName} --from=cronjob/${cronJobName} -n ${namespace}`);
425
+ }
426
+ logger.info('All immediate Jobs created');
427
+ }
428
+ },
429
+
430
+ /**
431
+ * Resolve the deploy-id list associated with a given job.
432
+ * Backup jobs read from dd.router (multiple deploy-ids); others from dd.cron.
433
+ *
434
+ * @param {string} jobId - Job identifier (e.g., 'dns', 'backup')
435
+ * @returns {string} Comma-separated deploy IDs
436
+ * @memberof UnderpostCron
437
+ */
438
+ getRelatedDeployIdList(jobId) {
439
+ const deployFilePath =
440
+ jobId === 'backup' ? './engine-private/deploy/dd.router' : './engine-private/deploy/dd.cron';
441
+
442
+ if (!fs.existsSync(deployFilePath)) {
443
+ logger.warn(`Deploy file not found: ${deployFilePath}, using default`);
444
+ return fs.existsSync('./engine-private/deploy/dd.cron')
445
+ ? fs.readFileSync('./engine-private/deploy/dd.cron', 'utf8').trim()
446
+ : 'dd-cron';
447
+ }
448
+
449
+ return fs.readFileSync(deployFilePath, 'utf8').trim();
450
+ },
451
+
452
+ /**
453
+ * Get the available cron job handlers.
454
+ * Each handler should have a callback function that executes the job logic.
455
+ * @memberof UnderpostCron
456
+ * @returns {Object} Available cron job handlers
457
+ */
458
+ get JOB() {
459
+ return UnderpostCron.JOB;
460
+ },
461
+
462
+ /**
463
+ * Get the list of available job IDs.
464
+ * This is derived from the keys of the JOB object.
465
+ * @memberof UnderpostCron
466
+ * @returns {string[]} List of available job IDs
467
+ */
468
+ getJobsIDs() {
469
+ return Object.keys(UnderpostCron.JOB);
470
+ },
471
+ };
472
+ }
473
+
474
+ export default UnderpostCron;
475
+
476
+ export { cronJobYamlFactory, resolveDeployId };
@@ -0,0 +1,210 @@
1
+ /**
2
+ * Module for managing crypto operations
3
+ * @module src/server/crypto.js
4
+ * @namespace Crypto
5
+ */
6
+
7
+ import crypto from 'crypto';
8
+
9
+ /* ----------------------------- SymmetricCrypto ----------------------------- */
10
+
11
+ class SymmetricCrypto {
12
+ #encryptionKey;
13
+
14
+ /**
15
+ * @param {object} [options]
16
+ * @param {Buffer | string} [options.encryptionKey] - 32-byte key as Buffer or hex string. If not provided, a new random key is generated.
17
+ */
18
+ /** @memberof Crypto */
19
+ constructor(options = {}) {
20
+ const { encryptionKey } = options;
21
+
22
+ if (encryptionKey) {
23
+ this.#encryptionKey = typeof encryptionKey === 'string' ? Buffer.from(encryptionKey, 'hex') : encryptionKey;
24
+ } else {
25
+ this.#encryptionKey = crypto.randomBytes(32);
26
+ }
27
+
28
+ if (!Buffer.isBuffer(this.#encryptionKey) || this.#encryptionKey.length !== 32) {
29
+ throw new Error('Encryption key must be a 32-byte Buffer or 64-length hex string.');
30
+ }
31
+
32
+ // Provide a compatibility IV property expected by some test suites / legacy code.
33
+ // This IV is not reused for each encryption operation (encryptData will generate its own IV).
34
+ // It exists so tests that expect an ivHex on the instance (16 bytes) continue to work.
35
+ this.ivHex = crypto.randomBytes(16).toString('hex'); // 16 bytes -> 32 hex chars
36
+ }
37
+
38
+ /** Returns encryption key as hex. */
39
+ /** @memberof Crypto */
40
+ get encryptionKeyHex() {
41
+ return this.#encryptionKey.toString('hex');
42
+ }
43
+
44
+ /**
45
+ * Encrypts plaintext using AES-256-GCM and returns `iv_hex:ciphertext_hex:authTag_hex`.
46
+ *
47
+ * @param {string} [plaintext='']
48
+ * @returns {string}
49
+ * @memberof Crypto
50
+ */
51
+ encryptData(plaintext = '') {
52
+ // GCM recommended IV size is 12 bytes
53
+ const iv = crypto.randomBytes(12);
54
+ const cipher = crypto.createCipheriv('aes-256-gcm', this.#encryptionKey, iv);
55
+
56
+ const encryptedPart = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()]);
57
+ const authTag = cipher.getAuthTag();
58
+
59
+ return `${iv.toString('hex')}:${encryptedPart.toString('hex')}:${authTag.toString('hex')}`;
60
+ }
61
+
62
+ /**
63
+ * Decrypts data. Supports two formats:
64
+ * - AES-256-GCM: `iv_hex:ciphertext_hex:authTag_hex` (preferred)
65
+ * - Legacy AES-256-CBC: `iv_hex:ciphertext_hex` (fallback for backward compatibility)
66
+ *
67
+ * @param {string} [ciphertext='']
68
+ * @returns {string} plaintext
69
+ * @throws {Error} Generic error on failure (to avoid leaking details).
70
+ * @memberof Crypto
71
+ */
72
+ decryptData(ciphertext = '') {
73
+ try {
74
+ const parts = ciphertext.split(':');
75
+
76
+ if (parts.length === 3) {
77
+ // AES-256-GCM
78
+ const [ivHex, encryptedHex, tagHex] = parts;
79
+ const iv = Buffer.from(ivHex, 'hex');
80
+ const encrypted = Buffer.from(encryptedHex, 'hex');
81
+ const authTag = Buffer.from(tagHex, 'hex');
82
+
83
+ const decipher = crypto.createDecipheriv('aes-256-gcm', this.#encryptionKey, iv);
84
+ decipher.setAuthTag(authTag);
85
+
86
+ const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]);
87
+ return decrypted.toString('utf8');
88
+ }
89
+
90
+ if (parts.length === 2) {
91
+ // Legacy: AES-256-CBC (no authentication). Provided for compatibility only.
92
+ const [ivHex, encryptedHex] = parts;
93
+ const iv = Buffer.from(ivHex, 'hex');
94
+ const encrypted = encryptedHex;
95
+
96
+ const decipher = crypto.createDecipheriv('aes-256-cbc', this.#encryptionKey, iv);
97
+ let decrypted = decipher.update(encrypted, 'hex', 'utf8');
98
+ decrypted += decipher.final('utf8');
99
+ return decrypted;
100
+ }
101
+
102
+ throw new Error('Invalid ciphertext format.');
103
+ } catch (err) {
104
+ // Do not leak internal error details (stack, key material, etc.).
105
+ // Optional: instrument monitoring/logging but avoid logging sensitive inputs.
106
+ throw new Error('Decryption failed. Check key, IV, or ciphertext integrity.');
107
+ }
108
+ }
109
+ }
110
+
111
+ /* ---------------------------- AsymmetricCrypto ---------------------------- */
112
+
113
+ class AsymmetricCrypto {
114
+ #publicKey;
115
+ #privateKey;
116
+ #modulusLength;
117
+
118
+ /**
119
+ * @param {object} [options]
120
+ * @param {string|Buffer} [options.publicKey] - PEM-formatted public key
121
+ * @param {string|Buffer} [options.privateKey] - PEM-formatted private key
122
+ * @param {number} [options.modulusLength=2048] - If keys are not provided, generates a new key pair of this size (bits). Consider 3072 for long-lived keys.
123
+ */
124
+ /** @memberof Crypto */
125
+ constructor(options = {}) {
126
+ const { publicKey, privateKey } = options;
127
+ this.#modulusLength = options.modulusLength || 2048;
128
+
129
+ if (!publicKey || !privateKey) {
130
+ // Generate an in-memory key pair. No file I/O; keys remain in process memory only.
131
+ const { publicKey: pub, privateKey: priv } = crypto.generateKeyPairSync('rsa', {
132
+ modulusLength: this.#modulusLength,
133
+ publicKeyEncoding: { type: 'spki', format: 'pem' },
134
+ privateKeyEncoding: { type: 'pkcs8', format: 'pem' },
135
+ });
136
+ this.#publicKey = pub;
137
+ this.#privateKey = priv;
138
+ } else {
139
+ // Accept provided keys (string or Buffer)
140
+ this.#publicKey = typeof publicKey === 'string' || Buffer.isBuffer(publicKey) ? publicKey : String(publicKey);
141
+ this.#privateKey =
142
+ typeof privateKey === 'string' || Buffer.isBuffer(privateKey) ? privateKey : String(privateKey);
143
+
144
+ // Basic validation: ensure PEM headers exist. This is intentionally lightweight.
145
+ const pubStr = String(this.#publicKey);
146
+ const privStr = String(this.#privateKey);
147
+ if (!pubStr.includes('BEGIN PUBLIC KEY') || !privStr.includes('BEGIN')) {
148
+ throw new Error('Provided keys do not appear to be valid PEM-formatted keys.');
149
+ }
150
+ }
151
+ }
152
+
153
+ /** @memberof Crypto */
154
+ get publicKey() {
155
+ return this.#publicKey;
156
+ }
157
+
158
+ /** @memberof Crypto */
159
+ get privateKey() {
160
+ return this.#privateKey;
161
+ }
162
+
163
+ /**
164
+ * Encrypts plaintext using RSA-OAEP with SHA-256. Returns hex-encoded ciphertext.
165
+ * Note: RSA encryption is intended for small payloads. For larger data use hybrid encryption (encrypt a symmetric key and then use AES-GCM).
166
+ * @param {string} plaintext
167
+ * @returns {string} hex ciphertext
168
+ * @memberof Crypto
169
+ */
170
+ encryptData(plaintext) {
171
+ const buffer = Buffer.from(plaintext, 'utf8');
172
+ const encrypted = crypto.publicEncrypt(
173
+ {
174
+ key: this.#publicKey,
175
+ padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
176
+ oaepHash: 'sha256',
177
+ },
178
+ buffer,
179
+ );
180
+
181
+ return encrypted.toString('hex');
182
+ }
183
+
184
+ /**
185
+ * Decrypts RSA-OAEP hex ciphertext and returns utf8 plaintext.
186
+ * @param {string} ciphertextHex
187
+ * @returns {string}
188
+ * @memberof Crypto
189
+ */
190
+ decryptData(ciphertextHex) {
191
+ try {
192
+ const buffer = Buffer.from(ciphertextHex, 'hex');
193
+ const decrypted = crypto.privateDecrypt(
194
+ {
195
+ key: this.#privateKey,
196
+ padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
197
+ oaepHash: 'sha256',
198
+ },
199
+ buffer,
200
+ );
201
+
202
+ return decrypted.toString('utf8');
203
+ } catch (err) {
204
+ // Avoid leaking details about keys or ciphertext
205
+ throw new Error('Decryption failed. Check private key or ciphertext integrity.');
206
+ }
207
+ }
208
+ }
209
+
210
+ export { SymmetricCrypto, AsymmetricCrypto };