cyberia 3.2.5 → 3.2.9

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 (301) hide show
  1. package/.github/workflows/engine-cyberia.cd.yml +2 -2
  2. package/.github/workflows/release.cd.yml +1 -2
  3. package/CHANGELOG.md +351 -1
  4. package/CLI-HELP.md +40 -13
  5. package/Dockerfile +0 -4
  6. package/README.md +242 -497
  7. package/bin/build.js +19 -5
  8. package/bin/cyberia.js +1149 -240
  9. package/bin/deploy.js +570 -1
  10. package/bin/file.js +6 -0
  11. package/bin/index.js +1149 -240
  12. package/bin/vs.js +1 -1
  13. package/conf.js +67 -89
  14. package/deployment.yaml +4 -222
  15. package/hardhat/package-lock.json +32 -32
  16. package/hardhat/package.json +3 -3
  17. package/jsconfig.json +1 -1
  18. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +2 -2
  19. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +2 -2
  20. package/manifests/deployment/dd-cyberia-development/deployment.yaml +4 -222
  21. package/manifests/deployment/dd-cyberia-development/proxy.yaml +10 -118
  22. package/manifests/deployment/dd-default-development/deployment.yaml +2 -6
  23. package/manifests/deployment/dd-test-development/deployment.yaml +136 -66
  24. package/manifests/deployment/dd-test-development/proxy.yaml +41 -5
  25. package/package.json +23 -14
  26. package/proxy.yaml +10 -118
  27. package/scripts/k3s-node-setup.sh +2 -2
  28. package/scripts/nat-iptables.sh +103 -18
  29. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +18 -18
  30. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +7 -14
  31. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +76 -21
  32. package/src/api/core/core.controller.js +10 -10
  33. package/src/api/core/core.service.js +10 -10
  34. package/src/api/crypto/crypto.controller.js +8 -8
  35. package/src/api/crypto/crypto.service.js +8 -8
  36. package/src/api/cyberia-action/cyberia-action.controller.js +74 -0
  37. package/src/api/cyberia-action/cyberia-action.model.js +87 -0
  38. package/src/api/cyberia-action/cyberia-action.router.js +27 -0
  39. package/src/api/cyberia-action/cyberia-action.service.js +42 -0
  40. package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +13 -13
  41. package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +11 -11
  42. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +2 -2
  43. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +16 -16
  44. package/src/api/cyberia-entity/cyberia-entity.controller.js +10 -10
  45. package/src/api/cyberia-entity/cyberia-entity.service.js +10 -10
  46. package/src/api/cyberia-instance/cyberia-fallback-world.js +19 -209
  47. package/src/api/cyberia-instance/cyberia-instance.controller.js +14 -14
  48. package/src/api/cyberia-instance/cyberia-instance.model.js +3 -0
  49. package/src/api/cyberia-instance/cyberia-instance.service.js +22 -57
  50. package/src/api/cyberia-instance/cyberia-portal-connector.js +20 -246
  51. package/src/api/cyberia-instance/cyberia-world-generator.js +505 -0
  52. package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +10 -10
  53. package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +216 -55
  54. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +4 -1
  55. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +18 -14
  56. package/src/api/cyberia-map/cyberia-map.controller.js +10 -10
  57. package/src/api/cyberia-map/cyberia-map.service.js +10 -10
  58. package/src/api/cyberia-quest/cyberia-quest.controller.js +74 -0
  59. package/src/api/cyberia-quest/cyberia-quest.model.js +67 -0
  60. package/src/api/cyberia-quest/cyberia-quest.router.js +27 -0
  61. package/src/api/cyberia-quest/cyberia-quest.service.js +42 -0
  62. package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +74 -0
  63. package/src/api/cyberia-quest-progress/cyberia-quest-progress.model.js +49 -0
  64. package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +27 -0
  65. package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +42 -0
  66. package/src/api/default/default.controller.js +10 -10
  67. package/src/api/default/default.service.js +10 -10
  68. package/src/api/document/document.controller.js +12 -12
  69. package/src/api/document/document.model.js +10 -16
  70. package/src/api/file/file.controller.js +8 -8
  71. package/src/api/file/file.model.js +10 -10
  72. package/src/api/file/file.service.js +36 -36
  73. package/src/api/instance/instance.controller.js +10 -10
  74. package/src/api/instance/instance.model.js +4 -10
  75. package/src/api/instance/instance.service.js +10 -10
  76. package/src/api/ipfs/ipfs.controller.js +12 -12
  77. package/src/api/ipfs/ipfs.model.js +4 -13
  78. package/src/api/ipfs/ipfs.service.js +14 -28
  79. package/src/api/object-layer/object-layer.controller.js +12 -12
  80. package/src/api/object-layer/object-layer.model.js +4 -17
  81. package/src/api/object-layer/object-layer.service.js +12 -12
  82. package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +10 -10
  83. package/src/api/object-layer-render-frames/object-layer-render-frames.model.js +6 -16
  84. package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +18 -14
  85. package/src/api/test/test.controller.js +8 -8
  86. package/src/api/test/test.service.js +8 -8
  87. package/src/api/user/guest.service.js +99 -0
  88. package/src/api/user/user.controller.js +6 -6
  89. package/src/api/user/user.model.js +8 -13
  90. package/src/api/user/user.service.js +3 -20
  91. package/src/cli/cluster.js +61 -14
  92. package/src/cli/db.js +47 -2
  93. package/src/cli/deploy.js +67 -35
  94. package/src/cli/fs.js +79 -8
  95. package/src/cli/image.js +43 -1
  96. package/src/cli/index.js +26 -1
  97. package/src/cli/release.js +57 -1
  98. package/src/cli/repository.js +69 -31
  99. package/src/cli/run.js +415 -36
  100. package/src/cli/ssh.js +1 -1
  101. package/src/cli/static.js +43 -115
  102. package/src/client/Cryptokoyn.index.js +18 -21
  103. package/src/client/CyberiaPortal.index.js +19 -23
  104. package/src/client/Default.index.js +21 -33
  105. package/src/client/Itemledger.index.js +20 -26
  106. package/src/client/Underpost.index.js +19 -23
  107. package/src/client/components/core/404.js +4 -4
  108. package/src/client/components/core/500.js +4 -4
  109. package/src/client/components/core/Account.js +73 -60
  110. package/src/client/components/core/AgGrid.js +23 -33
  111. package/src/client/components/core/Alert.js +12 -13
  112. package/src/client/components/core/AppStore.js +1 -1
  113. package/src/client/components/core/Auth.js +35 -37
  114. package/src/client/components/core/Badge.js +7 -13
  115. package/src/client/components/core/BtnIcon.js +15 -17
  116. package/src/client/components/core/CalendarCore.js +42 -63
  117. package/src/client/components/core/Chat.js +13 -15
  118. package/src/client/components/core/ClientEvents.js +87 -0
  119. package/src/client/components/core/ColorPaletteElement.js +309 -0
  120. package/src/client/components/core/Content.js +17 -14
  121. package/src/client/components/core/Css.js +15 -71
  122. package/src/client/components/core/CssCore.js +12 -16
  123. package/src/client/components/core/D3Chart.js +4 -4
  124. package/src/client/components/core/Docs.js +64 -91
  125. package/src/client/components/core/DropDown.js +69 -91
  126. package/src/client/components/core/EventBus.js +92 -0
  127. package/src/client/components/core/EventsUI.js +14 -17
  128. package/src/client/components/core/FileExplorer.js +96 -228
  129. package/src/client/components/core/FullScreen.js +47 -75
  130. package/src/client/components/core/Input.js +24 -69
  131. package/src/client/components/core/Keyboard.js +25 -18
  132. package/src/client/components/core/KeyboardAvoidance.js +145 -0
  133. package/src/client/components/core/LoadingAnimation.js +25 -31
  134. package/src/client/components/core/LogIn.js +41 -41
  135. package/src/client/components/core/LogOut.js +23 -14
  136. package/src/client/components/core/Modal.js +462 -178
  137. package/src/client/components/core/NotificationManager.js +14 -18
  138. package/src/client/components/core/Panel.js +54 -50
  139. package/src/client/components/core/PanelForm.js +25 -125
  140. package/src/client/components/core/Polyhedron.js +110 -214
  141. package/src/client/components/core/PublicProfile.js +39 -32
  142. package/src/client/components/core/Recover.js +48 -44
  143. package/src/client/components/core/Responsive.js +88 -32
  144. package/src/client/components/core/RichText.js +9 -18
  145. package/src/client/components/core/Router.js +24 -3
  146. package/src/client/components/core/SearchBox.js +37 -37
  147. package/src/client/components/core/SignUp.js +39 -30
  148. package/src/client/components/core/SocketIo.js +31 -2
  149. package/src/client/components/core/SocketIoHandler.js +6 -6
  150. package/src/client/components/core/ToggleSwitch.js +8 -20
  151. package/src/client/components/core/ToolTip.js +5 -17
  152. package/src/client/components/core/Translate.js +56 -59
  153. package/src/client/components/core/Validator.js +26 -16
  154. package/src/client/components/core/Wallet.js +15 -26
  155. package/src/client/components/core/Worker.js +163 -27
  156. package/src/client/components/core/windowGetDimensions.js +7 -7
  157. package/src/client/components/cryptokoyn/{MenuCryptokoyn.js → AppShellCryptokoyn.js} +57 -57
  158. package/src/client/components/cryptokoyn/CssCryptokoyn.js +15 -15
  159. package/src/client/components/cryptokoyn/LogInCryptokoyn.js +6 -4
  160. package/src/client/components/cryptokoyn/LogOutCryptokoyn.js +6 -4
  161. package/src/client/components/cryptokoyn/RouterCryptokoyn.js +37 -0
  162. package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +4 -4
  163. package/src/client/components/cryptokoyn/SignUpCryptokoyn.js +6 -4
  164. package/src/client/components/cyberia/InstanceEngineCyberia.js +141 -60
  165. package/src/client/components/cyberia/MapEngineCyberia.js +691 -214
  166. package/src/client/components/cyberia/ObjectLayerEngine.js +19 -0
  167. package/src/client/components/cyberia/ObjectLayerEngineModal.js +1204 -94
  168. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +196 -298
  169. package/src/client/components/cyberia-portal/{MenuCyberiaPortal.js → AppShellCyberiaPortal.js} +102 -102
  170. package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +305 -61
  171. package/src/client/components/cyberia-portal/CssCyberiaPortal.js +15 -15
  172. package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +6 -4
  173. package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +6 -4
  174. package/src/client/components/cyberia-portal/MainBodyCyberiaPortal.js +4 -4
  175. package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +60 -0
  176. package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +4 -4
  177. package/src/client/components/cyberia-portal/SignUpCyberiaPortal.js +6 -4
  178. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +4 -4
  179. package/src/client/components/default/{MenuDefault.js → AppShellDefault.js} +87 -87
  180. package/src/client/components/default/CssDefault.js +12 -12
  181. package/src/client/components/default/LogInDefault.js +6 -4
  182. package/src/client/components/default/LogOutDefault.js +6 -4
  183. package/src/client/components/default/RouterDefault.js +47 -0
  184. package/src/client/components/default/SettingsDefault.js +4 -4
  185. package/src/client/components/default/SignUpDefault.js +6 -4
  186. package/src/client/components/default/TranslateDefault.js +3 -3
  187. package/src/client/components/itemledger/{MenuItemledger.js → AppShellItemledger.js} +57 -57
  188. package/src/client/components/itemledger/CssItemledger.js +15 -15
  189. package/src/client/components/itemledger/LogInItemledger.js +6 -4
  190. package/src/client/components/itemledger/LogOutItemledger.js +6 -4
  191. package/src/client/components/itemledger/RouterItemledger.js +38 -0
  192. package/src/client/components/itemledger/SettingsItemledger.js +4 -4
  193. package/src/client/components/itemledger/SignUpItemledger.js +6 -4
  194. package/src/client/components/itemledger/TranslateItemledger.js +3 -3
  195. package/src/client/components/underpost/{MenuUnderpost.js → AppShellUnderpost.js} +88 -88
  196. package/src/client/components/underpost/CssUnderpost.js +14 -14
  197. package/src/client/components/underpost/CyberpunkBloggerUnderpost.js +4 -4
  198. package/src/client/components/underpost/DocumentSearchProvider.js +1 -1
  199. package/src/client/components/underpost/LabGalleryUnderpost.js +12 -15
  200. package/src/client/components/underpost/LogInUnderpost.js +6 -4
  201. package/src/client/components/underpost/LogOutUnderpost.js +6 -4
  202. package/src/client/components/underpost/RouterUnderpost.js +45 -0
  203. package/src/client/components/underpost/SettingsUnderpost.js +4 -4
  204. package/src/client/components/underpost/SignUpUnderpost.js +6 -4
  205. package/src/client/components/underpost/TranslateUnderpost.js +4 -4
  206. package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +235 -0
  207. package/src/client/public/cyberia-docs/ARCHITECTURE.md +443 -0
  208. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +417 -0
  209. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +313 -0
  210. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +260 -0
  211. package/src/client/public/cyberia-docs/ENTITY-PROFILE.md +241 -0
  212. package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +300 -0
  213. package/src/client/public/cyberia-docs/OFF-CHAIN-ECONOMY.md +279 -0
  214. package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +206 -0
  215. package/src/client/public/cyberia-docs/ROADMAP.md +240 -0
  216. package/src/client/public/cyberia-docs/WHITE-PAPER.md +732 -0
  217. package/src/client/services/atlas-sprite-sheet/atlas-sprite-sheet.service.js +14 -20
  218. package/src/client/services/core/core.service.js +17 -49
  219. package/src/client/services/crypto/crypto.service.js +8 -13
  220. package/src/client/services/cyberia-action/cyberia-action.service.js +99 -0
  221. package/src/client/services/cyberia-dialogue/cyberia-dialogue.service.js +10 -16
  222. package/src/client/services/cyberia-entity/cyberia-entity.management.js +5 -5
  223. package/src/client/services/cyberia-entity/cyberia-entity.service.js +10 -16
  224. package/src/client/services/cyberia-instance/cyberia-instance.management.js +6 -6
  225. package/src/client/services/cyberia-instance/cyberia-instance.service.js +12 -18
  226. package/src/client/services/cyberia-instance-conf/cyberia-instance-conf.service.js +10 -16
  227. package/src/client/services/cyberia-map/cyberia-map.management.js +6 -6
  228. package/src/client/services/cyberia-map/cyberia-map.service.js +12 -18
  229. package/src/client/services/cyberia-quest/cyberia-quest.service.js +99 -0
  230. package/src/client/services/cyberia-quest-progress/cyberia-quest-progress.service.js +99 -0
  231. package/src/client/services/default/default.management.js +159 -267
  232. package/src/client/services/default/default.service.js +10 -16
  233. package/src/client/services/document/document.service.js +14 -19
  234. package/src/client/services/file/file.service.js +8 -13
  235. package/src/client/services/instance/instance.management.js +5 -5
  236. package/src/client/services/instance/instance.service.js +10 -15
  237. package/src/client/services/ipfs/ipfs.service.js +12 -18
  238. package/src/client/services/object-layer/object-layer.management.js +12 -12
  239. package/src/client/services/object-layer/object-layer.service.js +20 -26
  240. package/src/client/services/object-layer-render-frames/object-layer-render-frames.service.js +10 -16
  241. package/src/client/services/test/test.service.js +8 -13
  242. package/src/client/services/user/guest.service.js +86 -0
  243. package/src/client/services/user/user.management.js +5 -5
  244. package/src/client/services/user/user.service.js +14 -20
  245. package/src/client/ssr/body/404.js +3 -3
  246. package/src/client/ssr/body/500.js +3 -3
  247. package/src/client/ssr/body/CacheControl.js +5 -2
  248. package/src/client/ssr/body/DefaultSplashScreen.js +19 -12
  249. package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +13 -6
  250. package/src/client/ssr/head/PwaItemledger.js +197 -60
  251. package/src/client/ssr/mailer/DefaultRecoverEmail.js +19 -20
  252. package/src/client/ssr/mailer/DefaultVerifyEmail.js +15 -16
  253. package/src/client/ssr/offline/Maintenance.js +12 -11
  254. package/src/client/ssr/offline/NoNetworkConnection.js +3 -3
  255. package/src/client/ssr/pages/Test.js +2 -2
  256. package/src/client/sw/core.sw.js +212 -0
  257. package/src/grpc/cyberia/grpc-server.js +179 -67
  258. package/src/index.js +1 -1
  259. package/src/runtime/cyberia-client/Dockerfile +80 -0
  260. package/src/runtime/cyberia-server/Dockerfile +37 -0
  261. package/src/runtime/express/Dockerfile +4 -4
  262. package/src/runtime/lampp/Dockerfile +8 -7
  263. package/src/runtime/wp/Dockerfile +11 -17
  264. package/src/server/atlas-sprite-sheet-generator.js +4 -2
  265. package/src/server/client-build-docs.js +45 -46
  266. package/src/server/client-build.js +334 -60
  267. package/src/server/client-formatted.js +47 -16
  268. package/src/server/conf.js +5 -4
  269. package/src/server/data-query.js +32 -20
  270. package/src/server/dns.js +22 -0
  271. package/src/server/ipfs-client.js +232 -91
  272. package/src/server/object-layer.js +1 -6
  273. package/src/server/process.js +13 -27
  274. package/src/server/semantic-layer-generator-floor.js +11 -51
  275. package/src/server/semantic-layer-generator-resource.js +259 -0
  276. package/src/server/semantic-layer-generator-skin.js +41 -171
  277. package/src/server/semantic-layer-generator.js +122 -14
  278. package/src/server/shape-generator.js +108 -0
  279. package/src/server/start.js +17 -3
  280. package/src/server/valkey.js +141 -235
  281. package/tsconfig.docs.json +15 -0
  282. package/typedoc.dd-cyberia.json +29 -0
  283. package/typedoc.json +29 -0
  284. package/WHITE-PAPER.md +0 -1540
  285. package/hardhat/README.md +0 -531
  286. package/hardhat/WHITE-PAPER.md +0 -1540
  287. package/jsdoc.dd-cyberia.json +0 -68
  288. package/jsdoc.json +0 -68
  289. package/src/api/object-layer/README.md +0 -672
  290. package/src/client/components/core/ColorPalette.js +0 -5267
  291. package/src/client/components/core/JoyStick.js +0 -80
  292. package/src/client/components/cryptokoyn/RoutesCryptokoyn.js +0 -39
  293. package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +0 -62
  294. package/src/client/components/cyberia-portal/ServerCyberiaPortal.js +0 -136
  295. package/src/client/components/default/RoutesDefault.js +0 -49
  296. package/src/client/components/itemledger/RoutesItemledger.js +0 -40
  297. package/src/client/components/underpost/RoutesUnderpost.js +0 -47
  298. package/src/client/sw/default.sw.js +0 -127
  299. package/src/client/sw/template.sw.js +0 -84
  300. package/src/grpc/cyberia/OFF_CHAIN_ECONOMY.md +0 -305
  301. package/src/grpc/cyberia/README.md +0 -326
package/src/cli/index.js CHANGED
@@ -46,6 +46,9 @@ program
46
46
  .option('--sync-env-port', 'Sync environment port assignments across all deploy IDs')
47
47
  .option('--single-replica', 'Build single replica folders instead of full client')
48
48
  .option('--build-zip', 'Create zip files of the builds')
49
+ .option('--split <mb>', 'Split generated zip files into parts of the specified size in MB')
50
+ .option('--unzip <build-prefix>', 'Extract a built client zip or split zip parts using the given build prefix')
51
+ .option('--merge-zip <build-prefix>', 'Merge split ZIP parts back into a single ZIP file for the given build prefix')
49
52
  .option('--lite-build', 'Skip full build (default is full build)')
50
53
  .option('--icons-build', 'Build icons')
51
54
  .description('Builds client assets, single replicas, and/or syncs environment ports.')
@@ -62,6 +65,11 @@ program
62
65
  .option('--build', 'Triggers the client-side application build process.')
63
66
  .option('--underpost-quickly-install', 'Uses Underpost Quickly Install for dependency installation.')
64
67
  .option('--skip-pull-base', 'Skips cloning repositories, uses current workspace code directly.')
68
+ .option('--skip-full-build', 'Skips the full client bundle build during deployment.')
69
+ .option(
70
+ '--pull-bundle',
71
+ 'Downloads the pre-built client bundle from Cloudinary via pull-bundle before starting. Use together with --skip-full-build to skip the local build entirely.',
72
+ )
65
73
  .action(Underpost.start.callback)
66
74
  .description('Initiates application servers, build pipelines, or other defined services based on the deployment ID.');
67
75
 
@@ -226,6 +234,7 @@ program
226
234
  .option('--ban-egress-clear', 'Clears all banned egress IP addresses.')
227
235
  .option('--ban-both-add', 'Adds IP addresses to both banned ingress and egress lists.')
228
236
  .option('--ban-both-remove', 'Removes IP addresses from both banned ingress and egress lists.')
237
+ .option('--mac', 'Prints the MAC address of the main network interface.')
229
238
  .description('Displays the current public machine IP addresses.')
230
239
  .action(Underpost.dns.ipDispatcher);
231
240
 
@@ -329,6 +338,14 @@ program
329
338
  'Sets the local:remote port to expose when --expose is active (overrides auto-detected service port).',
330
339
  )
331
340
  .option('--cmd <cmd>', 'Custom initialization command for deployment (comma-separated commands).')
341
+ .option(
342
+ '--skip-full-build',
343
+ 'Skip client bundle rebuild; container will pull pre-built bundle via pull-bundle instead.',
344
+ )
345
+ .option(
346
+ '--pull-bundle',
347
+ 'Explicitly pull the pre-built client bundle from Cloudinary inside the container. Use together with --skip-full-build.',
348
+ )
332
349
  .description('Manages application deployments, defaulting to deploying development pods.')
333
350
  .action(Underpost.deploy.callback);
334
351
 
@@ -485,6 +502,7 @@ program
485
502
  .option('--recursive', 'Uploads files recursively from the specified path.')
486
503
  .option('--deploy-id <deploy-id>', 'Specifies the deployment configuration ID for file operations.')
487
504
  .option('--pull', 'Downloads the specified file.')
505
+ .option('--omit-unzip', 'With --pull, keeps the downloaded .zip file and skips extraction.')
488
506
  .option('--force', 'Forces the action, overriding any warnings or conflicts.')
489
507
  .option('--storage-file-path <storage-file-path>', 'Specifies a custom file storage path.')
490
508
  .description('Manages file storage, defaulting to file upload operations.')
@@ -613,7 +631,6 @@ program
613
631
  .option('--k3s', 'Sets the k3s cluster context for the runner execution.')
614
632
  .option('--kind', 'Sets the kind cluster context for the runner execution.')
615
633
  .option('--git-clean', 'Runs git clean on volume mount paths before copying.')
616
- .option('--log-type <log-type>', 'Sets the log type for the runner execution.')
617
634
  .option('--deploy-id <deploy-id>', 'Sets deploy id context for the runner execution.')
618
635
  .option('--user <user>', 'Sets user context for the runner execution.')
619
636
  .option('--hosts <hosts>', 'Comma-separated list of hosts for the runner execution.')
@@ -657,6 +674,14 @@ program
657
674
  '(e.g., "127.0.0.1=foo.local,bar.local;10.1.2.3=foo.remote,bar.remote").',
658
675
  )
659
676
  .option('--copy', 'Copies the runner output to the clipboard (supported by: generate-pass, template-deploy-local).')
677
+ .option(
678
+ '--skip-full-build',
679
+ 'Skip client bundle rebuild; triggers pull-bundle in container startup (supported by: sync, template-deploy).',
680
+ )
681
+ .option(
682
+ '--pull-bundle',
683
+ 'Explicitly download the pre-built client bundle from Cloudinary inside the container (supported by: sync, template-deploy). Use together with --skip-full-build.',
684
+ )
660
685
  .description('Runs specified scripts using various runners.')
661
686
  .action(Underpost.run.callback);
662
687
 
@@ -120,7 +120,7 @@ class UnderpostRelease {
120
120
  `./manifests/deployment/dd-default-development/deployment.yaml`,
121
121
  fs
122
122
  .readFileSync(`./manifests/deployment/dd-default-development/deployment.yaml`, 'utf8')
123
- .replaceAll(`underpost:v${version}`, `underpost:v${newVersion}`),
123
+ .replaceAll(`underpost-engine:v${version}`, `underpost-engine:v${newVersion}`),
124
124
  'utf8',
125
125
  );
126
126
 
@@ -133,6 +133,62 @@ class UnderpostRelease {
133
133
  'utf8',
134
134
  );
135
135
 
136
+ // Update underpost/* image versions in all engine-*.cd.yml workflows.
137
+ for (const wf of fs.readdirSync(`./.github/workflows`)) {
138
+ if (!wf.match(/^engine-.+\.cd\.yml$/)) continue;
139
+ const wfPath = `./.github/workflows/${wf}`;
140
+ const updated = fs
141
+ .readFileSync(wfPath, 'utf8')
142
+ .replace(/underpost\/([^:'"]+):v[0-9]+\.[0-9]+\.[0-9]+/g, `underpost/$1:v${newVersion}`);
143
+ fs.writeFileSync(wfPath, updated, 'utf8');
144
+ }
145
+
146
+ // Update version tag in all runtime docker image workflows (type=raw,value=v<version>).
147
+ for (const wf of fs.readdirSync(`./.github/workflows`)) {
148
+ if (!wf.match(/^docker-image\..+\.ci\.yml$/) || wf === 'docker-image.ci.yml') continue;
149
+ const wfPath = `./.github/workflows/${wf}`;
150
+ fs.writeFileSync(
151
+ wfPath,
152
+ fs.readFileSync(wfPath, 'utf8').replaceAll(`type=raw,value=v${version}`, `type=raw,value=v${newVersion}`),
153
+ 'utf8',
154
+ );
155
+ }
156
+
157
+ // Update image version in all conf.instances.json files for underpost/* images.
158
+ if (fs.existsSync(`./engine-private/conf`)) {
159
+ const confFiles = await fs.readdir(`./engine-private/conf`, { recursive: true });
160
+ for (const relativePath of confFiles) {
161
+ const filePath = `./engine-private/conf/${relativePath.replaceAll('\\', '/')}`;
162
+ if (filePath.split('/').pop() !== 'conf.instances.json' || !fs.existsSync(filePath)) continue;
163
+
164
+ let instances;
165
+ try {
166
+ instances = JSON.parse(fs.readFileSync(filePath, 'utf8'));
167
+ } catch {
168
+ logger.warn(`Skipping invalid JSON file: ${filePath}`);
169
+ continue;
170
+ }
171
+
172
+ if (!Array.isArray(instances)) continue;
173
+
174
+ let updated = false;
175
+ for (const instance of instances) {
176
+ if (!instance || typeof instance !== 'object') continue;
177
+ if (!instance.image || typeof instance.image !== 'string') continue;
178
+ if (!instance.image.startsWith('underpost/')) continue;
179
+
180
+ const baseImage = instance.image.split('@')[0].split(':')[0];
181
+ const nextImage = `${baseImage}:v${newVersion}`;
182
+ if (instance.image !== nextImage) {
183
+ instance.image = nextImage;
184
+ updated = true;
185
+ }
186
+ }
187
+
188
+ if (updated) fs.writeFileSync(filePath, JSON.stringify(instances, null, 2), 'utf8');
189
+ }
190
+ }
191
+
136
192
  fs.writeFileSync(
137
193
  `./src/index.js`,
138
194
  fs.readFileSync(`./src/index.js`, 'utf8').replaceAll(`${version}`, `${newVersion}`),
@@ -21,7 +21,7 @@ import {
21
21
  buildReplicaId,
22
22
  writeEnv,
23
23
  } from '../server/conf.js';
24
- import { buildClient } from '../server/client-build.js';
24
+ import { buildClient, unzipClientBuild, mergeClientBuildZip } from '../server/client-build.js';
25
25
  import { DefaultConf } from '../../conf.js';
26
26
  import Underpost from '../index.js';
27
27
 
@@ -401,6 +401,7 @@ class UnderpostRepository {
401
401
 
402
402
  /**
403
403
  * Retrieves the message of the last Git commit.
404
+ * @param {number} [skip=0] - Number of commits to skip from HEAD (0 = most recent).
404
405
  * @returns {string} The last commit message.
405
406
  * @memberof UnderpostRepository
406
407
  */
@@ -642,6 +643,9 @@ class UnderpostRepository {
642
643
  * @param {boolean} [options.syncEnvPort=false] - If true, syncs environment port assignments across all deploy IDs.
643
644
  * @param {boolean} [options.singleReplica=false] - If true, builds single replica folders instead of full client.
644
645
  * @param {boolean} [options.buildZip=false] - If true, creates zip files of the builds.
646
+ * @param {string|number} [options.split=''] - Optional ZIP part size in MB. When set with buildZip, writes split parts.
647
+ * @param {string} [options.unzip=''] - Optional build ZIP prefix to extract from ./build.
648
+ * @param {string} [options.mergeZip=''] - Optional build prefix to merge split ZIP parts into a single ZIP.
645
649
  * @param {boolean} [options.liteBuild=false] - If true, skips full build (default is full build).
646
650
  * @param {boolean} [options.iconsBuild=false] - If true, builds icons.
647
651
  * @returns {Promise<boolean>} A promise that resolves when the build is complete.
@@ -656,12 +660,31 @@ class UnderpostRepository {
656
660
  syncEnvPort: false,
657
661
  singleReplica: false,
658
662
  buildZip: false,
663
+ split: '',
664
+ unzip: '',
665
+ mergeZip: '',
659
666
  liteBuild: false,
660
667
  iconsBuild: false,
661
668
  },
662
669
  ) {
663
670
  return new Promise(async (resolve, reject) => {
664
671
  try {
672
+ if (options.mergeZip) {
673
+ mergeClientBuildZip({
674
+ buildPrefix: options.mergeZip,
675
+ logger,
676
+ });
677
+ return resolve(true);
678
+ }
679
+
680
+ if (options.unzip) {
681
+ unzipClientBuild({
682
+ buildPrefix: options.unzip,
683
+ logger,
684
+ });
685
+ return resolve(true);
686
+ }
687
+
665
688
  // Handle singleReplica operation (must run before syncEnvPort to ensure replica dirs exist)
666
689
  if (options.singleReplica) {
667
690
  const replicaPath = path;
@@ -804,6 +827,9 @@ class UnderpostRepository {
804
827
  let argPath = path ? path.split(',') : [];
805
828
  let deployIdSingleReplicas = [];
806
829
  let singleReplicaHosts = [];
830
+ const isReplicaContext = resolvedDeployId
831
+ ? fs.existsSync(`./engine-private/replica/${resolvedDeployId}`)
832
+ : false;
807
833
  const serverConf = resolvedDeployId
808
834
  ? readConfJson(resolvedDeployId, 'server', { loadReplicas: true })
809
835
  : Config.default.server;
@@ -814,7 +840,7 @@ class UnderpostRepository {
814
840
  if (argHost.length && argPath.length && (!argHost.includes(host) || !argPath.includes(path))) {
815
841
  delete serverConf[host][path];
816
842
  } else {
817
- if (serverConf[host][path].singleReplica && serverConf[host][path].replicas) {
843
+ if (!isReplicaContext && serverConf[host][path].singleReplica && serverConf[host][path].replicas) {
818
844
  singleReplicaHosts.push({ host, path });
819
845
  deployIdSingleReplicas = deployIdSingleReplicas.concat(
820
846
  serverConf[host][path].replicas.map((replica) =>
@@ -827,10 +853,17 @@ class UnderpostRepository {
827
853
  }
828
854
  await buildClient({
829
855
  buildZip: options.buildZip || false,
856
+ split: options.split || '',
830
857
  fullBuild: options.liteBuild ? false : true,
831
858
  iconsBuild: options.iconsBuild || false,
832
859
  });
833
- for (const replicaDeployId of deployIdSingleReplicas) await Underpost.repo.client(replicaDeployId);
860
+ for (const replicaDeployId of deployIdSingleReplicas) {
861
+ if (!fs.existsSync(`./engine-private/replica/${replicaDeployId}`)) {
862
+ logger.warn('Skip replica client build: replica folder not found', { replicaDeployId });
863
+ continue;
864
+ }
865
+ await Underpost.repo.client(replicaDeployId);
866
+ }
834
867
 
835
868
  return resolve(true);
836
869
  }
@@ -917,6 +950,7 @@ Prevent build private config repo.`,
917
950
  /**
918
951
  * Retrieves the Git commit history.
919
952
  * @param {number} [sinceCommit=1] - The number of recent commits to retrieve.
953
+ * @param {string} [repoPath='.'] - The path to the repository.
920
954
  * @returns {Array<{hash: string, message: string, files: string}>} An array of commit objects with hash, message, and files.
921
955
  * @memberof UnderpostRepository
922
956
  */
@@ -1238,19 +1272,10 @@ Prevent build private config repo.`,
1238
1272
  },
1239
1273
 
1240
1274
  /**
1241
- * Returns metadata about unpushed commits in a git repository.
1242
- * Fetches from origin, then counts commits ahead of the remote branch.
1243
- * @param {string} [repoPath='.'] - Path to the git repository.
1244
- * @param {number} [fallback=1] - Value to return as `count` when no unpushed commits are detected.
1245
- * @returns {{ count: number, branch: string, hasUnpushed: boolean }} Unpush metadata.
1246
- * @memberof UnderpostRepository
1247
- */
1248
- /**
1249
- * Checks whether a remote Git repository URL is reachable.
1250
- * Uses `git ls-remote` with `|| true` so the process always exits 0.
1251
- * Injects `GITHUB_TOKEN` into GitHub HTTPS URLs when available.
1252
- * @param {string} url - Full HTTPS clone URL to test (e.g. "https://github.com/org/repo.git").
1253
- * @returns {boolean} `true` when the remote responded with at least one ref hash.
1275
+ * Resolves a Git remote URL, normalizing short-form owner/repo references to full
1276
+ * GitHub HTTPS URLs and injecting GITHUB_TOKEN when available.
1277
+ * @param {string} url - The repository URL or short-form (e.g. "owner/repo" or full HTTPS URL).
1278
+ * @returns {string} The resolved (and optionally authenticated) HTTPS URL.
1254
1279
  * @memberof UnderpostRepository
1255
1280
  */
1256
1281
  resolveAuthUrl(url) {
@@ -1268,7 +1293,14 @@ Prevent build private config repo.`,
1268
1293
  }
1269
1294
  return normalized;
1270
1295
  },
1271
-
1296
+ /**
1297
+ * Checks whether a remote Git repository URL is reachable.
1298
+ * Uses `git ls-remote` with `|| true` so the process always exits 0.
1299
+ * Injects `GITHUB_TOKEN` into GitHub HTTPS URLs when available.
1300
+ * @param {string} url - Full HTTPS clone URL to test (e.g. "https://github.com/org/repo.git").
1301
+ * @returns {boolean} `true` when the remote responded with at least one ref hash.
1302
+ * @memberof UnderpostRepository
1303
+ */
1272
1304
  isRemoteRepo(url) {
1273
1305
  if (!url) return false;
1274
1306
  const authUrl = Underpost.repo.resolveAuthUrl(url);
@@ -1282,6 +1314,14 @@ Prevent build private config repo.`,
1282
1314
  return typeof raw === 'string' && /^[0-9a-f]{40}\t/m.test(raw);
1283
1315
  },
1284
1316
 
1317
+ /**
1318
+ * Returns metadata about unpushed commits in a git repository.
1319
+ * Fetches from origin, then counts commits ahead of the remote branch.
1320
+ * @param {string} [repoPath='.'] - Path to the git repository.
1321
+ * @param {number} [fallback=1] - Value to return as `count` when no unpushed commits are detected.
1322
+ * @returns {{ count: number, branch: string, hasUnpushed: boolean }} Unpush metadata.
1323
+ * @memberof UnderpostRepository
1324
+ */
1285
1325
  getUnpushedCount(repoPath = '.', fallback = 1) {
1286
1326
  const branch = shellExec(`cd ${repoPath} && git branch --show-current`, {
1287
1327
  stdout: true,
@@ -1321,19 +1361,6 @@ Prevent build private config repo.`,
1321
1361
  .trim()
1322
1362
  .replaceAll('] - ', '] ');
1323
1363
  },
1324
-
1325
- /**
1326
- * Manages a cron-backup Git repository: clone, pull, commit, or push.
1327
- * Resolves the repository path as `../<repoName>` relative to the CWD.
1328
- * Requires the `GITHUB_USERNAME` environment variable to be set.
1329
- * @param {object} params
1330
- * @param {string} params.repoName - Repository name (e.g. `engine-cyberia-cron-backups`).
1331
- * @param {'clone'|'pull'|'commit'|'push'} params.operation - Git operation to perform.
1332
- * @param {string} [params.message=''] - Commit message (used by the `commit` operation).
1333
- * @param {boolean} [params.forceClone=false] - Remove existing clone before re-cloning.
1334
- * @returns {boolean} `true` on success, `false` if GITHUB_USERNAME is unset or on error.
1335
- * @memberof UnderpostRepository
1336
- */
1337
1364
  /**
1338
1365
  * Initializes a git repository at the given path and configures user identity
1339
1366
  * from environment variables (`GITHUB_USERNAME` / `GITHUB_EMAIL`).
@@ -1366,7 +1393,18 @@ Prevent build private config repo.`,
1366
1393
  }
1367
1394
  }
1368
1395
  },
1369
-
1396
+ /**
1397
+ * Manages a cron-backup Git repository: clone, pull, commit, or push.
1398
+ * Resolves the repository path as `../<repoName>` relative to the CWD.
1399
+ * Requires the `GITHUB_USERNAME` environment variable to be set.
1400
+ * @param {object} params
1401
+ * @param {string} params.repoName - Repository name (e.g. `engine-cyberia-cron-backups`).
1402
+ * @param {'clone'|'pull'|'commit'|'push'} params.operation - Git operation to perform.
1403
+ * @param {string} [params.message=''] - Commit message (used by the `commit` operation).
1404
+ * @param {boolean} [params.forceClone=false] - Remove existing clone before re-cloning.
1405
+ * @returns {boolean} `true` on success, `false` if GITHUB_USERNAME is unset or on error.
1406
+ * @memberof UnderpostRepository
1407
+ */
1370
1408
  manageBackupRepo({ repoName, operation, message = '', forceClone = false }) {
1371
1409
  try {
1372
1410
  const username = process.env.GITHUB_USERNAME;