cyberia 3.2.12 → 3.2.70

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 (194) hide show
  1. package/.env.example +127 -68
  2. package/.github/workflows/cyberia-client.cd.yml +40 -0
  3. package/.github/workflows/cyberia-server.cd.yml +40 -0
  4. package/.github/workflows/docker-image.cyberia-client.ci.yml +49 -0
  5. package/.github/workflows/docker-image.cyberia-client.dev.ci.yml +48 -0
  6. package/.github/workflows/docker-image.cyberia-server.ci.yml +69 -0
  7. package/.github/workflows/docker-image.cyberia-server.dev.ci.yml +69 -0
  8. package/.github/workflows/docker-image.engine-cyberia.ci.yml +52 -0
  9. package/.github/workflows/docker-image.engine-cyberia.dev.ci.yml +52 -0
  10. package/.github/workflows/engine-cyberia.cd.yml +34 -24
  11. package/.github/workflows/engine-cyberia.ci.yml +27 -5
  12. package/.github/workflows/ghpkg.ci.yml +89 -1
  13. package/.github/workflows/gitlab.ci.yml +1 -1
  14. package/.github/workflows/hardhat.ci.yml +1 -1
  15. package/.github/workflows/npmpkg.ci.yml +19 -12
  16. package/.github/workflows/publish.ci.yml +2 -2
  17. package/.github/workflows/publish.cyberia.ci.yml +5 -16
  18. package/.github/workflows/pwa-microservices-template-page.cd.yml +1 -8
  19. package/.github/workflows/pwa-microservices-template-test.ci.yml +1 -1
  20. package/CHANGELOG.md +451 -1
  21. package/CLI-HELP.md +1040 -1130
  22. package/Dockerfile +141 -43
  23. package/Dockerfile.dev +143 -0
  24. package/Dockerfile.test +165 -0
  25. package/README.md +1 -1
  26. package/baremetal/commission-workflows.json +1 -0
  27. package/bin/build.js +128 -136
  28. package/bin/build.template.js +25 -179
  29. package/bin/cyberia.js +1089 -188
  30. package/bin/deploy.js +6 -3
  31. package/bin/index.js +1089 -188
  32. package/bump.config.js +1 -0
  33. package/compose.env +131 -0
  34. package/conf.js +19 -1
  35. package/deployment.yaml +74 -2
  36. package/docker-compose.yml +316 -0
  37. package/hardhat/hardhat.config.js +2 -2
  38. package/hardhat/package-lock.json +620 -2041
  39. package/hardhat/package.json +7 -5
  40. package/hardhat/scripts/deployObjectLayerToken.js +18 -18
  41. package/hardhat/test/ObjectLayerToken.js +378 -274
  42. package/ipfs/configure-ipfs.sh +13 -0
  43. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +2 -2
  44. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +1 -1
  45. package/manifests/deployment/dd-cyberia-development/deployment.yaml +74 -2
  46. package/manifests/deployment/dd-cyberia-development/grpc-service.yaml +17 -0
  47. package/manifests/deployment/dd-cyberia-development/pv-pvc.yaml +32 -0
  48. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  49. package/mongodb/entrypoint.sh +76 -0
  50. package/nginx.conf +87 -0
  51. package/package.json +34 -22
  52. package/pv-pvc.yaml +32 -0
  53. package/scripts/disk-clean.sh +85 -60
  54. package/scripts/kubeadm-node-setup.sh +317 -0
  55. package/scripts/link-local-underpost-cli.sh +6 -0
  56. package/scripts/rocky-kickstart.sh +877 -185
  57. package/scripts/rpmfusion-ffmpeg-setup.sh +26 -50
  58. package/scripts/test-monitor.sh +248 -0
  59. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +43 -7
  60. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +17 -25
  61. package/src/api/cyberia-action/cyberia-action.controller.js +19 -0
  62. package/src/api/cyberia-action/cyberia-action.model.js +21 -29
  63. package/src/api/cyberia-action/cyberia-action.router.js +42 -7
  64. package/src/api/cyberia-action/cyberia-action.service.js +20 -4
  65. package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +58 -57
  66. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +37 -6
  67. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +8 -2
  68. package/src/api/cyberia-entity/cyberia-entity.router.js +39 -7
  69. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +74 -0
  70. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.model.js +67 -0
  71. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +63 -0
  72. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +46 -0
  73. package/src/api/cyberia-instance/cyberia-fallback-world.js +62 -10
  74. package/src/api/cyberia-instance/cyberia-instance.model.js +32 -2
  75. package/src/api/cyberia-instance/cyberia-instance.router.js +6 -6
  76. package/src/api/cyberia-instance/cyberia-world-generator.js +116 -3
  77. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +3 -0
  78. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +39 -7
  79. package/src/api/cyberia-map/cyberia-map.router.js +21 -6
  80. package/src/api/cyberia-quest/cyberia-quest.controller.js +38 -0
  81. package/src/api/cyberia-quest/cyberia-quest.router.js +47 -7
  82. package/src/api/cyberia-quest/cyberia-quest.service.js +59 -4
  83. package/src/api/cyberia-saga/cyberia-saga.controller.js +74 -0
  84. package/src/api/cyberia-saga/cyberia-saga.model.js +59 -0
  85. package/src/api/cyberia-saga/cyberia-saga.router.js +63 -0
  86. package/src/api/cyberia-saga/cyberia-saga.service.js +42 -0
  87. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +551 -122
  88. package/src/api/cyberia-skill/cyberia-skill.controller.js +74 -0
  89. package/src/api/cyberia-skill/cyberia-skill.model.js +50 -0
  90. package/src/api/cyberia-skill/cyberia-skill.router.js +63 -0
  91. package/src/api/cyberia-skill/cyberia-skill.service.js +42 -0
  92. package/src/api/ipfs/ipfs.service.js +28 -15
  93. package/src/api/object-layer/object-layer.router.js +25 -15
  94. package/src/api/object-layer/object-layer.service.js +15 -20
  95. package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +39 -7
  96. package/src/cli/baremetal.js +717 -16
  97. package/src/cli/cluster.js +80 -5
  98. package/src/cli/deploy.js +326 -292
  99. package/src/cli/docker-compose.js +648 -0
  100. package/src/cli/env.js +12 -6
  101. package/src/cli/fs.js +75 -30
  102. package/src/cli/image.js +187 -55
  103. package/src/cli/index.js +157 -6
  104. package/src/cli/kickstart.js +142 -20
  105. package/src/cli/monitor.js +387 -6
  106. package/src/cli/release.js +72 -15
  107. package/src/cli/repository.js +339 -40
  108. package/src/cli/run.js +678 -186
  109. package/src/cli/secrets.js +82 -48
  110. package/src/cli/ssh.js +234 -0
  111. package/src/cli/static.js +2 -2
  112. package/src/client/components/core/PanelForm.js +44 -44
  113. package/src/client/components/cyberia/ActionEngineCyberia.js +1867 -0
  114. package/src/client/components/cyberia/EntityEngineCyberia.js +585 -0
  115. package/src/client/components/cyberia/InstanceEngineCyberia.js +219 -13
  116. package/src/client/components/cyberia/MapEngineCyberia.js +154 -71
  117. package/src/client/components/cyberia/ObjectLayerEngineModal.js +40 -63
  118. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +34 -20
  119. package/src/client/components/cyberia/SharedDefaultsCyberia.js +195 -4
  120. package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +66 -0
  121. package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +8 -0
  122. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +8 -0
  123. package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +92 -20
  124. package/src/client/public/cyberia-docs/ARCHITECTURE.md +272 -50
  125. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +3 -3
  126. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +39 -22
  127. package/src/client/public/cyberia-docs/CYBERIA-LORE.md +88 -0
  128. package/src/client/public/cyberia-docs/CYBERIA-SAGA.md +394 -0
  129. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +28 -12
  130. package/src/client/public/cyberia-docs/CYBERIA.md +1 -1
  131. package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +27 -5
  132. package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
  133. package/src/client/public/cyberia-docs/WHITE-PAPER.md +1 -1
  134. package/src/client/services/cyberia-entity-type-default/cyberia-entity-type-default.service.js +99 -0
  135. package/src/client/services/cyberia-instance/cyberia-instance.management.js +2 -2
  136. package/src/client/services/cyberia-map/cyberia-map.management.js +2 -2
  137. package/src/client/services/cyberia-saga/cyberia-saga.service.js +99 -0
  138. package/src/client/services/cyberia-skill/cyberia-skill.service.js +99 -0
  139. package/src/client/services/object-layer/object-layer.management.js +6 -6
  140. package/src/{server → client-builder}/client-build-docs.js +15 -5
  141. package/src/{server → client-builder}/client-build-live.js +3 -3
  142. package/src/{server → client-builder}/client-build.js +25 -22
  143. package/src/{server → client-builder}/client-dev-server.js +3 -3
  144. package/src/{server → client-builder}/client-icons.js +2 -2
  145. package/src/{server → client-builder}/ssr.js +5 -5
  146. package/src/client.build.js +1 -3
  147. package/src/client.dev.js +1 -1
  148. package/src/db/mongo/MongoBootstrap.js +12 -12
  149. package/src/db/mongo/MongooseDB.js +2 -1
  150. package/src/grpc/cyberia/grpc-server.js +255 -70
  151. package/src/index.js +12 -1
  152. package/src/mailer/EmailRender.js +1 -1
  153. package/src/{server → projects/cyberia}/atlas-sprite-sheet-generator.js +2 -2
  154. package/src/{server → projects/cyberia}/besu-genesis-generator.js +3 -3
  155. package/src/projects/cyberia/catalog-cyberia.js +81 -0
  156. package/src/projects/cyberia/gemini-client.js +175 -0
  157. package/src/projects/cyberia/generate-saga.js +2107 -0
  158. package/src/{server → projects/cyberia}/ipfs-client.js +6 -4
  159. package/src/{server → projects/cyberia}/object-layer.js +12 -108
  160. package/src/{server → projects/cyberia}/semantic-layer-generator-floor.js +1 -1
  161. package/src/{server → projects/cyberia}/semantic-layer-generator-resource.js +1 -1
  162. package/src/{server → projects/cyberia}/semantic-layer-generator-skin.js +1 -1
  163. package/src/{server → projects/cyberia}/semantic-layer-generator.js +2 -2
  164. package/src/{server → projects/cyberia}/shape-generator.js +2 -2
  165. package/src/projects/underpost/catalog-underpost.js +60 -0
  166. package/src/runtime/cyberia-client/Dockerfile +31 -83
  167. package/src/runtime/cyberia-client/Dockerfile.dev +23 -30
  168. package/src/runtime/cyberia-server/Dockerfile +23 -42
  169. package/src/runtime/cyberia-server/Dockerfile.dev +20 -35
  170. package/src/runtime/engine-cyberia/Dockerfile +143 -0
  171. package/src/runtime/engine-cyberia/Dockerfile.dev +143 -0
  172. package/src/runtime/engine-cyberia/Dockerfile.test +165 -0
  173. package/src/runtime/engine-cyberia/compose.env +131 -0
  174. package/src/runtime/engine-cyberia/docker-compose.yml +316 -0
  175. package/src/runtime/engine-cyberia/ipfs/configure-ipfs.sh +13 -0
  176. package/src/runtime/engine-cyberia/mongodb/entrypoint.sh +76 -0
  177. package/src/runtime/engine-cyberia/nginx.conf +87 -0
  178. package/src/runtime/express/Express.js +2 -2
  179. package/src/runtime/nginx/Nginx.js +250 -0
  180. package/src/runtime/wp/Dockerfile +3 -3
  181. package/src/server/catalog.js +72 -0
  182. package/src/server/conf.js +415 -60
  183. package/src/server/runtime-status.js +252 -0
  184. package/src/server/start.js +42 -11
  185. package/src/server.js +6 -2
  186. package/test/cyberia-instance-conf-defaults.test.js +140 -0
  187. package/test/deploy-monitor.test.js +267 -0
  188. package/test/shape-generator.test.js +7 -1
  189. package/typedoc.dd-cyberia.json +3 -1
  190. package/typedoc.json +3 -1
  191. package/manifests/deployment/dd-test-development/deployment.yaml +0 -256
  192. package/manifests/deployment/dd-test-development/proxy.yaml +0 -102
  193. /package/src/client/ssr/{Render.js → RootDocument.js} +0 -0
  194. /package/src/{server → client-builder}/client-formatted.js +0 -0
@@ -11,7 +11,8 @@
11
11
  * @namespace IpfsClient
12
12
  */
13
13
  import stringify from 'fast-json-stable-stringify';
14
- import { loggerFactory } from './logger.js';
14
+ import { loggerFactory } from '../../server/logger.js';
15
+ import Underpost from '../../index.js';
15
16
  const logger = loggerFactory(import.meta);
16
17
  const DEFAULT_IPFS_HTTP_TIMEOUT_MS = Number(process.env.IPFS_HTTP_TIMEOUT_MS || 10000);
17
18
  const getRequestTimeoutMs = (kind = 'kubo') => {
@@ -46,21 +47,22 @@ const fetchWithTimeout = async (url, options = {}, { kind = 'kubo', label = url
46
47
  * @returns {string}
47
48
  */
48
49
  const getIpfsApiUrl = () =>
49
- process.env.IPFS_API_URL || `http://${process.env.NODE_ENV === 'development' ? 'localhost' : 'ipfs-cluster'}:5001`;
50
+ process.env.IPFS_API_URL ||
51
+ `http://${process.env.NODE_ENV === 'development' && !Underpost.env.isInsideContainer() ? 'localhost' : 'ipfs-cluster'}:5001`;
50
52
  /**
51
53
  * Base URL of the IPFS Cluster REST API (port 9094).
52
54
  * @returns {string}
53
55
  */
54
56
  const getClusterApiUrl = () =>
55
57
  process.env.IPFS_CLUSTER_API_URL ||
56
- `http://${process.env.NODE_ENV === 'development' ? 'localhost' : 'ipfs-cluster'}:9094`;
58
+ `http://${process.env.NODE_ENV === 'development' && !Underpost.env.isInsideContainer() ? 'localhost' : 'ipfs-cluster'}:9094`;
57
59
  /**
58
60
  * Base URL of the IPFS HTTP Gateway (port 8080).
59
61
  * @returns {string}
60
62
  */
61
63
  const getGatewayUrl = () =>
62
64
  process.env.IPFS_GATEWAY_URL ||
63
- `http://${process.env.NODE_ENV === 'development' ? 'localhost' : 'ipfs-cluster'}:8080`;
65
+ `http://${process.env.NODE_ENV === 'development' && !Underpost.env.isInsideContainer() ? 'localhost' : 'ipfs-cluster'}:8080`;
64
66
  // ─────────────────────────────────────────────────────────
65
67
  // Core: add content
66
68
  // ─────────────────────────────────────────────────────────
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Provides utilities and engine logic for processing and managing Cyberia Online's object layer assets (skins, floors, weapons, etc.).
3
3
  * Shared logic consumed by both the Cyberia CLI and the REST API service layer.
4
- * @module src/server/object-layer.js
4
+ * @module src/projects/cyberia/object-layer.js
5
5
  * @namespace CyberiaObjectLayer
6
6
  */
7
7
 
@@ -13,9 +13,13 @@ import { Jimp, intToRGBA, rgbaToInt } from 'jimp';
13
13
  import crypto from 'crypto';
14
14
  import stringify from 'fast-json-stable-stringify';
15
15
 
16
- import { range } from '../client/components/core/CommonJs.js';
17
- import { random } from '../client/components/core/CommonJs.js';
18
- import { loggerFactory } from '../server/logger.js';
16
+ import { range } from '../../client/components/core/CommonJs.js';
17
+ import {
18
+ generateRandomStats,
19
+ getKeyframeDirectionsByCode,
20
+ OBJECT_LAYER_DIRECTION_NAME_TO_CODE,
21
+ } from '../../client/components/cyberia/SharedDefaultsCyberia.js';
22
+ import { loggerFactory } from '../../server/logger.js';
19
23
 
20
24
  const logger = loggerFactory(import.meta);
21
25
 
@@ -206,46 +210,6 @@ export class ObjectLayerEngine {
206
210
  return { frame, colors };
207
211
  }
208
212
 
209
- /**
210
- * Converts a numerical folder direction (e.g., '08', '14') into an array of corresponding keyframe names (e.g., 'down_idle', 'left_walking').
211
- * @static
212
- * @param {string} direction - The numerical direction string.
213
- * @returns {string[]} An array of keyframe direction names.
214
- * @memberof CyberiaObjectLayer
215
- */
216
- static getKeyFramesDirectionsFromNumberFolderDirection(direction) {
217
- let objectLayerFrameDirections = [];
218
-
219
- switch (direction) {
220
- case '08':
221
- objectLayerFrameDirections = ['down_idle', 'none_idle', 'default_idle'];
222
- break;
223
- case '18':
224
- objectLayerFrameDirections = ['down_walking'];
225
- break;
226
- case '02':
227
- objectLayerFrameDirections = ['up_idle'];
228
- break;
229
- case '12':
230
- objectLayerFrameDirections = ['up_walking'];
231
- break;
232
- case '04':
233
- objectLayerFrameDirections = ['left_idle', 'up_left_idle', 'down_left_idle'];
234
- break;
235
- case '14':
236
- objectLayerFrameDirections = ['left_walking', 'up_left_walking', 'down_left_walking'];
237
- break;
238
- case '06':
239
- objectLayerFrameDirections = ['right_idle', 'up_right_idle', 'down_right_idle'];
240
- break;
241
- case '16':
242
- objectLayerFrameDirections = ['right_walking', 'up_right_walking', 'down_right_walking'];
243
- break;
244
- }
245
-
246
- return objectLayerFrameDirections;
247
- }
248
-
249
213
  /**
250
214
  * Processes an image file through {@link ObjectLayerEngine.frameFactory} and adds the resulting frame to the render data structure.
251
215
  * Updates the color palette and pushes the frame to all keyframe directions corresponding to the given direction code.
@@ -278,7 +242,7 @@ export class ObjectLayerEngine {
278
242
  objectLayerRenderFramesData.colors = processedObjectLayerRenderFramesData.colors;
279
243
 
280
244
  // Get all keyframe directions for this direction code
281
- const keyframeDirections = ObjectLayerEngine.getKeyFramesDirectionsFromNumberFolderDirection(directionCode);
245
+ const keyframeDirections = getKeyframeDirectionsByCode(directionCode);
282
246
 
283
247
  // Push the frame to all corresponding directions
284
248
  for (const keyframeDirection of keyframeDirections) {
@@ -355,23 +319,6 @@ export class ObjectLayerEngine {
355
319
  await image.write(imagePath);
356
320
  }
357
321
 
358
- /**
359
- * Generates a random set of character statistics for an item, with values between 0 and 10.
360
- * @static
361
- * @returns {{effect: number, resistance: number, agility: number, range: number, intelligence: number, utility: number}} The random stats object.
362
- * @memberof CyberiaObjectLayer
363
- */
364
- static generateRandomStats() {
365
- return {
366
- effect: random(0, 10),
367
- resistance: random(0, 10),
368
- agility: random(0, 10),
369
- range: random(0, 10),
370
- intelligence: random(0, 10),
371
- utility: random(0, 10),
372
- };
373
- }
374
-
375
322
  // ──────────────────────────────────────────────────────────────────────────
376
323
  // Document lifecycle methods
377
324
  // ──────────────────────────────────────────────────────────────────────────
@@ -441,7 +388,7 @@ export class ObjectLayerEngine {
441
388
  description: '',
442
389
  activable: true,
443
390
  },
444
- stats: metadata.data.stats || ObjectLayerEngine.generateRandomStats(),
391
+ stats: metadata.data.stats || generateRandomStats(),
445
392
  ledger: metadata.data.ledger || { type: 'OFF_CHAIN' },
446
393
  },
447
394
  };
@@ -454,7 +401,7 @@ export class ObjectLayerEngine {
454
401
  description: '',
455
402
  activable: true,
456
403
  },
457
- stats: ObjectLayerEngine.generateRandomStats(),
404
+ stats: generateRandomStats(),
458
405
  ledger: { type: 'OFF_CHAIN' },
459
406
  },
460
407
  };
@@ -506,34 +453,6 @@ export class ObjectLayerEngine {
506
453
  return crypto.createHash('sha256').update(stringify(data)).digest('hex');
507
454
  }
508
455
 
509
- /**
510
- * Map of keyframe direction names to their numeric folder direction codes.
511
- * Inverse of {@link ObjectLayerEngine.getKeyFramesDirectionsFromNumberFolderDirection}.
512
- * @static
513
- * @type {Object<string, string>}
514
- * @memberof CyberiaObjectLayer
515
- */
516
- static directionNameToCode = {
517
- down_idle: '08',
518
- none_idle: '08',
519
- default_idle: '08',
520
- up_idle: '02',
521
- left_idle: '04',
522
- up_left_idle: '04',
523
- down_left_idle: '04',
524
- right_idle: '06',
525
- up_right_idle: '06',
526
- down_right_idle: '06',
527
- down_walking: '18',
528
- up_walking: '12',
529
- left_walking: '14',
530
- up_left_walking: '14',
531
- down_left_walking: '14',
532
- right_walking: '16',
533
- up_right_walking: '16',
534
- down_right_walking: '16',
535
- };
536
-
537
456
  /**
538
457
  * Writes frame PNGs and an optional metadata.json to one or more base asset
539
458
  * directories. This is the shared write-to-disk step consumed by both the
@@ -571,7 +490,7 @@ export class ObjectLayerEngine {
571
490
  cellPixelDim = 20,
572
491
  }) {
573
492
  const writtenPaths = [];
574
- const dirToCode = ObjectLayerEngine.directionNameToCode;
493
+ const dirToCode = OBJECT_LAYER_DIRECTION_NAME_TO_CODE;
575
494
 
576
495
  for (const basePath of basePaths) {
577
496
  // Track which directionCode/frameIndex combos we already wrote for
@@ -995,14 +914,6 @@ export const readPngAsync = ObjectLayerEngine.readPngAsync;
995
914
  */
996
915
  export const frameFactory = ObjectLayerEngine.frameFactory;
997
916
 
998
- /**
999
- * @see {@link ObjectLayerEngine.getKeyFramesDirectionsFromNumberFolderDirection}
1000
- * @function getKeyFramesDirectionsFromNumberFolderDirection
1001
- * @memberof CyberiaObjectLayer
1002
- */
1003
- export const getKeyFramesDirectionsFromNumberFolderDirection =
1004
- ObjectLayerEngine.getKeyFramesDirectionsFromNumberFolderDirection;
1005
-
1006
917
  /**
1007
918
  * @see {@link ObjectLayerEngine.processAndPushFrame}
1008
919
  * @function processAndPushFrame
@@ -1017,13 +928,6 @@ export const processAndPushFrame = ObjectLayerEngine.processAndPushFrame;
1017
928
  */
1018
929
  export const buildImgFromTile = ObjectLayerEngine.buildImgFromTile;
1019
930
 
1020
- /**
1021
- * @see {@link ObjectLayerEngine.generateRandomStats}
1022
- * @function generateRandomStats
1023
- * @memberof CyberiaObjectLayer
1024
- */
1025
- export const generateRandomStats = ObjectLayerEngine.generateRandomStats;
1026
-
1027
931
  /**
1028
932
  * @see {@link ObjectLayerEngine.buildObjectLayerDataFromDirectory}
1029
933
  * @function buildObjectLayerDataFromDirectory
@@ -9,7 +9,7 @@
9
9
  * parent module (circular import is safe because the function body is only
10
10
  * executed after module initialisation completes).
11
11
  *
12
- * @module src/server/semantic-layer-generator-floor.js
12
+ * @module src/projects/cyberia/semantic-layer-generator-floor.js
13
13
  * @namespace SemanticLayerGeneratorFloor
14
14
  */
15
15
 
@@ -23,7 +23,7 @@
23
23
  * frame pipeline (`down_idle` / `default_idle`) is used — matching the
24
24
  * stateless, non-directional nature of world-placed resource pickups.
25
25
  *
26
- * @module src/server/semantic-layer-generator-resource.js
26
+ * @module src/projects/cyberia/semantic-layer-generator-resource.js
27
27
  * @namespace SemanticLayerGeneratorResource
28
28
  */
29
29
 
@@ -24,7 +24,7 @@
24
24
  * The canonical side template is direction 06 (right); LEFT is derived by
25
25
  * mirroring it so generated frame keys stay aligned with 04 = left and 06 = right.
26
26
  *
27
- * @module src/server/semantic-layer-generator-skin.js
27
+ * @module src/projects/cyberia/semantic-layer-generator-skin.js
28
28
  * @namespace SemanticLayerGeneratorSkin
29
29
  */
30
30
  import { readFileSync } from 'fs';
@@ -12,14 +12,14 @@
12
12
  * • semantic-layer-generator-floor.js — all floor-* descriptors
13
13
  * • semantic-layer-generator-skin.js — skin-* descriptors
14
14
  *
15
- * @module src/server/semantic-layer-generator.js
15
+ * @module src/projects/cyberia/semantic-layer-generator.js
16
16
  * @namespace SemanticLayerGenerator
17
17
  */
18
18
 
19
19
  import crypto from 'crypto';
20
20
 
21
21
  import { createRng, seedToInt, createNoise2D, generateShape, listShapes } from './shape-generator.js';
22
- import { loggerFactory } from './logger.js';
22
+ import { loggerFactory } from '../../server/logger.js';
23
23
 
24
24
  import { registerFloorSemantics } from './semantic-layer-generator-floor.js';
25
25
  import { registerSkinSemantics } from './semantic-layer-generator-skin.js';
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Parametric shape generator with procedural noise, seeded RNG, and arc-length resampling.
3
3
  * Exports a single pure function `generateShape` that returns ordered contour points.
4
- * @module src/server/shape-generator.js
4
+ * @module src/projects/cyberia/shape-generator.js
5
5
  * @namespace ShapeGenerator
6
6
  */
7
7
 
@@ -161,7 +161,7 @@ registerShape('thick-parabola', (t, params) => {
161
161
  // `a` controls curvature, `rangeX` controls horizontal span, and
162
162
  // `thickness` controls band width (vertical gap between outer/inner).
163
163
  const a = params.a ?? 0.6;
164
- const rangeX = params.rangeX ?? 1.3;
164
+ const rangeX = params.rangeX ?? 2.0;
165
165
  const thickness = params.thickness ?? 0.35;
166
166
  if (t <= 0.5) {
167
167
  // Outer parabola (forward: left → right)
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Underpost platform content catalog — the base `pwa-microservices-template`.
3
+ *
4
+ * @module src/projects/underpost/catalog-underpost.js
5
+ * @namespace UnderpostCatalog
6
+ */
7
+
8
+ /**
9
+ * Workflow + service files re-added to the template after the engine-only strip.
10
+ * @constant {string[]}
11
+ * @memberof UnderpostCatalog
12
+ */
13
+ const TEMPLATE_RESTORE_PATHS = [
14
+ `./.github/workflows/pwa-microservices-template-page.cd.yml`,
15
+ `./.github/workflows/pwa-microservices-template-test.ci.yml`,
16
+ `./.github/workflows/npmpkg.ci.yml`,
17
+ `./.github/workflows/ghpkg.ci.yml`,
18
+ `./.github/workflows/gitlab.ci.yml`,
19
+ `./.github/workflows/publish.ci.yml`,
20
+ `./.github/workflows/release.cd.yml`,
21
+ `./src/client/services/user/guest.service.js`,
22
+ './src/api/user/guest.service.js',
23
+ './src/ws/IoInterface.js',
24
+ './src/ws/IoServer.js',
25
+ './manifests/deployment/dd-default-development',
26
+ ];
27
+
28
+ /**
29
+ * npm keywords for the standalone Underpost platform / template package.
30
+ * @constant {string[]}
31
+ * @memberof UnderpostCatalog
32
+ */
33
+ const TEMPLATE_KEYWORDS = [
34
+ 'underpost',
35
+ 'underpost-platform',
36
+ 'cli',
37
+ 'toolchain',
38
+ 'ci-cd',
39
+ 'devops',
40
+ 'kubernetes',
41
+ 'k3s',
42
+ 'kubeadm',
43
+ 'lxd',
44
+ 'baremetal',
45
+ 'container-orchestration',
46
+ 'image-management',
47
+ 'pwa',
48
+ 'workbox',
49
+ 'microservices',
50
+ ];
51
+
52
+ /**
53
+ * npm description for the standalone Underpost platform / template package.
54
+ * @constant {string}
55
+ * @memberof UnderpostCatalog
56
+ */
57
+ const TEMPLATE_DESCRIPTION =
58
+ 'Underpost Platform — end-to-end CI/CD and application-delivery toolchain CLI. Covers bare metal, Kubernetes, K3s, kubeadm, LXD, container/image orchestration, secrets, databases, cron jobs, monitoring, SSH, runners, PWA + Workbox delivery, and release orchestration. Extensible via downstream CLIs.';
59
+
60
+ export { TEMPLATE_RESTORE_PATHS, TEMPLATE_KEYWORDS, TEMPLATE_DESCRIPTION };
@@ -1,101 +1,49 @@
1
1
  # BUILD_MODE: RELEASE | DEBUG
2
2
  ARG BUILD_MODE=RELEASE
3
3
 
4
- # --- Build Image
5
- FROM rockylinux/rockylinux:9 AS builder
6
- # Re-declare ARG after FROM so it is in scope for RUN
7
- ARG BUILD_MODE=RELEASE
8
-
9
- RUN dnf -y update && \
10
- dnf -y install epel-release && \
11
- dnf -y install --allowerasing \
12
- git \
13
- curl \
14
- wget \
15
- openssl-devel \
16
- libnsl \
17
- perl \
18
- gnupg2 \
19
- bzip2 && \
20
- dnf clean all
21
-
22
- # System packages (raylib gfx + build dependencies)
23
- RUN dnf groupinstall -y "Development Tools" && \
24
- dnf install -y \
25
- cmake \
26
- unzip \
27
- python3 \
28
- python3.11 \
29
- alsa-lib-devel \
30
- mesa-libGL-devel \
31
- mesa-libGLU-devel \
32
- libX11-devel \
33
- libXrandr-devel \
34
- libXi-devel \
35
- libXcursor-devel \
36
- libXinerama-devel \
37
- libXfixes-devel \
38
- freeglut-devel \
39
- glfw-devel \
40
- libatomic.x86_64 && \
41
- dnf clean all && \
42
- alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 2 && \
43
- alternatives --set python3 /usr/bin/python3.11
44
- ENV EMSDK=/opt/emsdk
45
- ENV PATH="${EMSDK}:${EMSDK}/upstream/emscripten:${PATH}"
4
+ # --- Build Image ---
5
+ FROM emscripten/emsdk:5.0.6 AS builder
46
6
 
47
- # Pin emsdk version for reproducible builds
48
- ARG EMSDK_VERSION=5.0.6
49
- WORKDIR /opt
50
- RUN git clone https://github.com/emscripten-core/emsdk.git ${EMSDK}
51
- WORKDIR ${EMSDK}
52
- RUN ./emsdk install ${EMSDK_VERSION} && \
53
- ./emsdk activate ${EMSDK_VERSION}
7
+ ARG BUILD_MODE=RELEASE
54
8
 
55
9
  WORKDIR /cyberia-client
56
- # Build context is the cyberia-client project repo root (the workflow
57
- # in .github/workflows/docker-image.cyberia-client.ci.yml sets
58
- # context: . from the cyberia-client checkout). The legacy
59
- # engine-context layout (COPY cyberia-client/ .) is no longer used.
10
+
60
11
  COPY . .
61
12
 
62
- # `make clean` first so stale bin/ or build/ artefacts copied in from a
63
- # developer's local checkout (or a previous Docker layer cache hit)
64
- # can't shadow a fresh BUILD_MODE rebuild — e.g. mixing a DEBUG-mode
65
- # index.wasm with a RELEASE-mode index.js once produced the
66
- # "corrupted heap memory area" panic that masked the real Closure bug.
67
- RUN make -f Web.mk clean && make -f Web.mk all BUILD_MODE=${BUILD_MODE} OUTPUT_DIR=bin/
13
+ RUN make -f Web.mk clean all BUILD_MODE=${BUILD_MODE} OUTPUT_DIR=bin/
68
14
 
69
- # --- Runtime Image
15
+ # --- Runtime Image ---
70
16
  FROM rockylinux/rockylinux:9 AS runtime
71
-
72
- # Runtime needs:
73
- # - python3 (serves the built /bin/ static files via server.py)
74
- # - nodejs + the underpost CLI globally, for the container-status
75
- # lifecycle hooks invoked from conf.instances.json before / after
76
- # launching server.py. Installing it at build time avoids the slow
77
- # `npm install -g` startup the K8S cmd would otherwise repeat.
78
- ARG UNDERPOST_VERSION=3.2.9
79
- RUN dnf -y update && \
80
- dnf -y install epel-release && \
81
- dnf -y install --allowerasing curl git python3 && \
82
- curl -fsSL https://rpm.nodesource.com/setup_24.x | bash - && \
83
- dnf install -y nodejs && \
84
- npm install -g underpost@${UNDERPOST_VERSION} && \
85
- dnf clean all && \
17
+ ARG UNDERPOST_VERSION=3.2.70
18
+ ARG NODE_VERSION=24.15.0
19
+
20
+ RUN set -eux; \
21
+ dnf install -y python3 git tar xz; \
22
+ arch="$(uname -m)"; \
23
+ case "$arch" in \
24
+ x86_64) node_arch=x64 ;; \
25
+ aarch64) node_arch=arm64 ;; \
26
+ *) echo "unsupported arch: $arch" >&2; exit 1 ;; \
27
+ esac; \
28
+ curl -fsSL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-${node_arch}.tar.xz" \
29
+ | tar -xJ -C /usr/local --strip-components=1; \
30
+ node --version; npm --version; \
31
+ npm install -g underpost@${UNDERPOST_VERSION}; \
32
+ dnf clean all; rm -rf /var/cache/dnf; \
86
33
  npm cache clean --force
87
34
 
35
+ # Path + server layout is the contract with conf.instances.json mmo-client cmd,
36
+ # which execs `python3 /home/dd/engine/cyberia-client/docker-driver.py <port>
37
+ # /home/dd/engine/cyberia-client/bin` in both development and production.
38
+ # Keep this identical to Dockerfile.dev so prod and dev images are interchangeable.
88
39
  WORKDIR /home/dd/engine/cyberia-client
89
40
 
90
- COPY --from=builder /cyberia-client/server.py ./server.py
91
- COPY --from=builder /cyberia-client/bin ./bin/
41
+ COPY --from=builder /cyberia-client/docker-driver.py ./docker-driver.py
42
+ COPY --from=builder /cyberia-client/bin ./bin/
92
43
 
44
+ ENV PYTHONUNBUFFERED=1
93
45
  ENV CYBERIA_PORT=8081
94
- ENV CYBERIA_MODE=production
95
46
 
96
- EXPOSE 8081 8082
47
+ EXPOSE 8081
97
48
 
98
- # Default CMD when the image is run directly (not via K8S cmd).
99
- # In K8S deploys conf.instances.json supplies its own cmd that wraps
100
- # container-status hooks + this same server.py invocation.
101
- CMD ["sh", "-c", "exec python3 server.py ${CYBERIA_PORT} bin ${CYBERIA_MODE}"]
49
+ CMD ["sh", "-c", "exec python3 docker-driver.py ${CYBERIA_PORT} bin"]
@@ -1,22 +1,8 @@
1
1
  # cyberia-client DEV runtime image.
2
- #
3
- # Differences vs the production Dockerfile in this same directory:
4
- # - Builds the C/WASM bundle with BUILD_MODE=DEBUG (raylib + emcc keep
5
- # symbols, asserts, and DWARF info; the bundle is larger but
6
- # debuggable in the browser devtools).
7
- # - Default CYBERIA_MODE is `development` instead of `production`.
8
- # - Default CYBERIA_PORT is `8082` (debug port) instead of `8081`.
9
- # - Keeps `vim-minimal`, `lsof`, `strace`, `procps-ng` in the runtime
10
- # image so the operator can attach and inspect a misbehaving pod.
11
- # - Does NOT clean the npm cache.
12
- #
13
- # Selected automatically by `node bin run instance-build-manifest`
14
- # whenever the `--dev` flag is set; the production Dockerfile in the
15
- # same directory is used otherwise.
16
2
 
17
3
  ARG BUILD_MODE=DEBUG
18
4
 
19
- # --- Build Image
5
+ # --- Build Image ---
20
6
  FROM rockylinux/rockylinux:9 AS builder
21
7
  ARG BUILD_MODE=DEBUG
22
8
 
@@ -48,35 +34,42 @@ RUN ./emsdk install ${EMSDK_VERSION} && \
48
34
  ./emsdk activate ${EMSDK_VERSION}
49
35
 
50
36
  WORKDIR /cyberia-client
51
- # Build context is the cyberia-client project repo root (see the
52
- # production Dockerfile in this directory for the rationale).
37
+
53
38
  COPY . .
54
39
 
55
40
  # Dev build: BUILD_MODE=DEBUG keeps symbols, asserts, source maps.
56
41
  RUN make -f Web.mk all BUILD_MODE=${BUILD_MODE} OUTPUT_DIR=bin/
57
42
 
58
- # --- Runtime Image
43
+ # --- Runtime Image ---
59
44
  FROM rockylinux/rockylinux:9 AS runtime
60
45
 
61
- ARG UNDERPOST_VERSION=3.2.9
62
- RUN dnf -y update && \
63
- dnf -y install epel-release && \
46
+ ARG UNDERPOST_VERSION=3.2.70
47
+ ARG NODE_VERSION=24.15.0
48
+ RUN set -eux; \
49
+ dnf -y update; \
50
+ dnf -y install epel-release; \
64
51
  dnf -y install --allowerasing \
65
- curl git python3 \
66
- procps-ng strace lsof vim-minimal && \
67
- curl -fsSL https://rpm.nodesource.com/setup_24.x | bash - && \
68
- dnf install -y nodejs && \
69
- npm install -g underpost@${UNDERPOST_VERSION} && \
52
+ curl git python3 tar xz \
53
+ procps-ng strace lsof vim-minimal; \
54
+ arch="$(uname -m)"; \
55
+ case "$arch" in \
56
+ x86_64) node_arch=x64 ;; \
57
+ aarch64) node_arch=arm64 ;; \
58
+ *) echo "unsupported arch: $arch" >&2; exit 1 ;; \
59
+ esac; \
60
+ curl -fsSL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-${node_arch}.tar.xz" \
61
+ | tar -xJ -C /usr/local --strip-components=1; \
62
+ node --version; npm --version; \
63
+ npm install -g underpost@${UNDERPOST_VERSION}; \
70
64
  dnf clean all
71
65
 
72
66
  WORKDIR /home/dd/engine/cyberia-client
73
67
 
74
- COPY --from=builder /cyberia-client/server.py ./server.py
75
- COPY --from=builder /cyberia-client/bin ./bin/
68
+ COPY --from=builder /cyberia-client/docker-driver.py ./docker-driver.py
69
+ COPY --from=builder /cyberia-client/bin ./bin/
76
70
 
77
71
  ENV CYBERIA_PORT=8082
78
- ENV CYBERIA_MODE=development
79
72
 
80
73
  EXPOSE 8081 8082
81
74
 
82
- CMD ["sh", "-c", "exec python3 server.py ${CYBERIA_PORT} bin ${CYBERIA_MODE}"]
75
+ CMD ["sh", "-c", "exec python3 docker-driver.py ${CYBERIA_PORT} bin"]
@@ -1,62 +1,43 @@
1
- # --- Build Image
2
- FROM rockylinux/rockylinux:9 AS builder
3
-
4
- RUN dnf -y update && \
5
- dnf -y install epel-release && \
6
- dnf -y install --allowerasing \
7
- git \
8
- make \
9
- golang && \
10
- dnf clean all
1
+ # --- Build Image ---
2
+ FROM golang:1.24 AS builder
11
3
 
12
4
  WORKDIR /build
13
5
 
14
- # Build context is the cyberia-server project repo root (the workflow
15
- # in .github/workflows/docker-image.cyberia-server.ci.yml sets
16
- # context: . from the cyberia-server checkout). The legacy
17
- # engine-context layout (COPY cyberia-server/ .) is no longer used.
18
6
  COPY go.mod go.sum ./
19
7
  RUN go mod download
20
8
 
21
9
  COPY . ./
22
- RUN chmod +x build.sh && ./build.sh
10
+ RUN CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o server ./cmd/cyberia-server/
23
11
 
24
- # --- Runtime Image
12
+ # --- Runtime Image ---
25
13
  FROM rockylinux/rockylinux:9 AS runtime
26
-
27
- # Runtime needs:
28
- # - the compiled Go binary (cyberia-server itself)
29
- # - nodejs + the underpost CLI globally, for the container-status
30
- # lifecycle hooks (`underpost config set container-status ...`) that
31
- # the conf.instances.json cmd invokes before / after launching the
32
- # server binary. Installing it at build time avoids the slow
33
- # `npm install -g` startup the K8S cmd would otherwise have to do
34
- # on every pod boot.
35
- ARG UNDERPOST_VERSION=3.2.9
36
- RUN dnf -y update && \
37
- dnf -y install epel-release && \
38
- dnf -y install --allowerasing curl git && \
39
- curl -fsSL https://rpm.nodesource.com/setup_24.x | bash - && \
40
- dnf install -y nodejs && \
41
- npm install -g underpost@${UNDERPOST_VERSION} && \
42
- dnf clean all && \
14
+ ARG UNDERPOST_VERSION=3.2.70
15
+ ARG NODE_VERSION=24.15.0
16
+
17
+ RUN set -eux; \
18
+ dnf install -y git tar xz; \
19
+ arch="$(uname -m)"; \
20
+ case "$arch" in \
21
+ x86_64) node_arch=x64 ;; \
22
+ aarch64) node_arch=arm64 ;; \
23
+ *) echo "unsupported arch: $arch" >&2; exit 1 ;; \
24
+ esac; \
25
+ curl -fsSL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-${node_arch}.tar.xz" \
26
+ | tar -xJ -C /usr/local --strip-components=1; \
27
+ node --version; npm --version; \
28
+ npm install -g underpost@${UNDERPOST_VERSION}; \
29
+ dnf clean all; rm -rf /var/cache/dnf; \
43
30
  npm cache clean --force
44
31
 
32
+ # Path is the contract with conf.instances.json mmo-server cmd, which execs
33
+ # /home/dd/engine/cyberia-server/server in both development and production.
34
+ # Keep this identical to Dockerfile.dev so prod and dev images are interchangeable.
45
35
  WORKDIR /home/dd/engine/cyberia-server
46
36
 
47
37
  COPY --from=builder /build/server ./server
48
38
 
49
- # Static SSR dashboard rendered by `node bin/cyberia run-workflow
50
- # build-server-dashboard --output-path <project-root>/public/index.html`
51
- # from inside the engine repo checkout. The Go server's findPublicDir()
52
- # hard-requires public/index.html at boot and log.Fatalf's without it.
53
- # CI writes the dashboard into ./public/ at the cyberia-server repo root
54
- # before docker build picks it up here.
55
39
  COPY public/ ./public/
56
40
 
57
41
  EXPOSE 8081
58
42
 
59
- # Default entrypoint when the image is run directly (not via K8S cmd).
60
- # In K8S deploys conf.instances.json supplies its own cmd that wraps env
61
- # sourcing + container-status hooks + this same binary.
62
43
  ENTRYPOINT ["/home/dd/engine/cyberia-server/server"]