cyberia 3.2.22 → 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 (185) 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 +33 -24
  11. package/.github/workflows/engine-cyberia.ci.yml +13 -3
  12. package/.github/workflows/ghpkg.ci.yml +88 -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 +10 -7
  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 +301 -1
  21. package/CLI-HELP.md +71 -6
  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 +31 -0
  28. package/bin/cyberia.js +1080 -184
  29. package/bin/deploy.js +2 -2
  30. package/bin/index.js +1080 -184
  31. package/bump.config.js +1 -0
  32. package/compose.env +131 -0
  33. package/conf.js +18 -1
  34. package/deployment.yaml +2 -2
  35. package/docker-compose.yml +316 -0
  36. package/hardhat/hardhat.config.js +2 -2
  37. package/hardhat/package-lock.json +620 -2041
  38. package/hardhat/package.json +7 -5
  39. package/hardhat/scripts/deployObjectLayerToken.js +18 -18
  40. package/hardhat/test/ObjectLayerToken.js +378 -274
  41. package/ipfs/configure-ipfs.sh +13 -0
  42. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +1 -1
  43. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +1 -1
  44. package/manifests/deployment/dd-cyberia-development/deployment.yaml +2 -2
  45. package/manifests/deployment/dd-cyberia-development/grpc-service.yaml +17 -0
  46. package/manifests/deployment/dd-cyberia-development/pv-pvc.yaml +32 -0
  47. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  48. package/mongodb/entrypoint.sh +76 -0
  49. package/nginx.conf +87 -0
  50. package/package.json +31 -19
  51. package/pv-pvc.yaml +32 -0
  52. package/scripts/disk-clean.sh +85 -60
  53. package/scripts/kubeadm-node-setup.sh +317 -0
  54. package/scripts/rocky-kickstart.sh +877 -185
  55. package/scripts/rpmfusion-ffmpeg-setup.sh +26 -50
  56. package/scripts/test-monitor.sh +3 -5
  57. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +43 -7
  58. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +17 -25
  59. package/src/api/cyberia-action/cyberia-action.controller.js +19 -0
  60. package/src/api/cyberia-action/cyberia-action.model.js +21 -29
  61. package/src/api/cyberia-action/cyberia-action.router.js +42 -7
  62. package/src/api/cyberia-action/cyberia-action.service.js +20 -4
  63. package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +58 -57
  64. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +37 -6
  65. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +8 -2
  66. package/src/api/cyberia-entity/cyberia-entity.router.js +39 -7
  67. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +74 -0
  68. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.model.js +67 -0
  69. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +63 -0
  70. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +46 -0
  71. package/src/api/cyberia-instance/cyberia-fallback-world.js +62 -10
  72. package/src/api/cyberia-instance/cyberia-instance.model.js +32 -2
  73. package/src/api/cyberia-instance/cyberia-instance.router.js +6 -6
  74. package/src/api/cyberia-instance/cyberia-world-generator.js +116 -3
  75. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +3 -0
  76. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +39 -7
  77. package/src/api/cyberia-map/cyberia-map.router.js +21 -6
  78. package/src/api/cyberia-quest/cyberia-quest.controller.js +38 -0
  79. package/src/api/cyberia-quest/cyberia-quest.router.js +47 -7
  80. package/src/api/cyberia-quest/cyberia-quest.service.js +59 -4
  81. package/src/api/cyberia-saga/cyberia-saga.controller.js +74 -0
  82. package/src/api/cyberia-saga/cyberia-saga.model.js +59 -0
  83. package/src/api/cyberia-saga/cyberia-saga.router.js +63 -0
  84. package/src/api/cyberia-saga/cyberia-saga.service.js +42 -0
  85. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +551 -129
  86. package/src/api/cyberia-skill/cyberia-skill.controller.js +74 -0
  87. package/src/api/cyberia-skill/cyberia-skill.model.js +50 -0
  88. package/src/api/cyberia-skill/cyberia-skill.router.js +63 -0
  89. package/src/api/cyberia-skill/cyberia-skill.service.js +42 -0
  90. package/src/api/ipfs/ipfs.service.js +28 -15
  91. package/src/api/object-layer/object-layer.router.js +25 -15
  92. package/src/api/object-layer/object-layer.service.js +15 -20
  93. package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +39 -7
  94. package/src/cli/baremetal.js +717 -16
  95. package/src/cli/cluster.js +80 -5
  96. package/src/cli/deploy.js +127 -11
  97. package/src/cli/docker-compose.js +648 -0
  98. package/src/cli/env.js +11 -2
  99. package/src/cli/fs.js +75 -30
  100. package/src/cli/image.js +129 -51
  101. package/src/cli/index.js +110 -6
  102. package/src/cli/kickstart.js +142 -20
  103. package/src/cli/release.js +46 -4
  104. package/src/cli/repository.js +238 -33
  105. package/src/cli/run.js +520 -114
  106. package/src/cli/secrets.js +82 -48
  107. package/src/cli/ssh.js +234 -0
  108. package/src/cli/static.js +2 -2
  109. package/src/client/components/cyberia/ActionEngineCyberia.js +1867 -0
  110. package/src/client/components/cyberia/EntityEngineCyberia.js +585 -0
  111. package/src/client/components/cyberia/InstanceEngineCyberia.js +219 -13
  112. package/src/client/components/cyberia/MapEngineCyberia.js +154 -71
  113. package/src/client/components/cyberia/ObjectLayerEngineModal.js +40 -63
  114. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +34 -20
  115. package/src/client/components/cyberia/SharedDefaultsCyberia.js +195 -4
  116. package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +66 -0
  117. package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +8 -0
  118. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +8 -0
  119. package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +45 -27
  120. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +3 -3
  121. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +39 -22
  122. package/src/client/public/cyberia-docs/CYBERIA-LORE.md +88 -0
  123. package/src/client/public/cyberia-docs/CYBERIA-SAGA.md +394 -0
  124. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +8 -1
  125. package/src/client/public/cyberia-docs/CYBERIA.md +1 -1
  126. package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +5 -5
  127. package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
  128. package/src/client/public/cyberia-docs/WHITE-PAPER.md +1 -1
  129. package/src/client/services/cyberia-entity-type-default/cyberia-entity-type-default.service.js +99 -0
  130. package/src/client/services/cyberia-instance/cyberia-instance.management.js +2 -2
  131. package/src/client/services/cyberia-map/cyberia-map.management.js +2 -2
  132. package/src/client/services/cyberia-saga/cyberia-saga.service.js +99 -0
  133. package/src/client/services/cyberia-skill/cyberia-skill.service.js +99 -0
  134. package/src/client/services/object-layer/object-layer.management.js +6 -6
  135. package/src/{server → client-builder}/client-build-docs.js +15 -5
  136. package/src/{server → client-builder}/client-build-live.js +3 -3
  137. package/src/{server → client-builder}/client-build.js +25 -22
  138. package/src/{server → client-builder}/client-dev-server.js +3 -3
  139. package/src/{server → client-builder}/client-icons.js +2 -2
  140. package/src/{server → client-builder}/ssr.js +5 -5
  141. package/src/client.build.js +1 -3
  142. package/src/client.dev.js +1 -1
  143. package/src/db/mongo/MongoBootstrap.js +12 -12
  144. package/src/grpc/cyberia/grpc-server.js +255 -70
  145. package/src/index.js +12 -1
  146. package/src/mailer/EmailRender.js +1 -1
  147. package/src/{server → projects/cyberia}/atlas-sprite-sheet-generator.js +2 -2
  148. package/src/{server → projects/cyberia}/besu-genesis-generator.js +3 -3
  149. package/src/projects/cyberia/catalog-cyberia.js +81 -0
  150. package/src/projects/cyberia/gemini-client.js +175 -0
  151. package/src/projects/cyberia/generate-saga.js +2107 -0
  152. package/src/{server → projects/cyberia}/ipfs-client.js +2 -2
  153. package/src/{server → projects/cyberia}/object-layer.js +12 -108
  154. package/src/{server → projects/cyberia}/semantic-layer-generator-floor.js +1 -1
  155. package/src/{server → projects/cyberia}/semantic-layer-generator-resource.js +1 -1
  156. package/src/{server → projects/cyberia}/semantic-layer-generator-skin.js +1 -1
  157. package/src/{server → projects/cyberia}/semantic-layer-generator.js +2 -2
  158. package/src/{server → projects/cyberia}/shape-generator.js +2 -2
  159. package/src/{server → projects/underpost}/catalog-underpost.js +1 -2
  160. package/src/runtime/cyberia-client/Dockerfile +27 -61
  161. package/src/runtime/cyberia-client/Dockerfile.dev +20 -12
  162. package/src/runtime/cyberia-server/Dockerfile +21 -20
  163. package/src/runtime/cyberia-server/Dockerfile.dev +17 -8
  164. package/src/runtime/engine-cyberia/Dockerfile +143 -0
  165. package/src/runtime/engine-cyberia/Dockerfile.dev +143 -0
  166. package/src/runtime/engine-cyberia/Dockerfile.test +165 -0
  167. package/src/runtime/engine-cyberia/compose.env +131 -0
  168. package/src/runtime/engine-cyberia/docker-compose.yml +316 -0
  169. package/src/runtime/engine-cyberia/ipfs/configure-ipfs.sh +13 -0
  170. package/src/runtime/engine-cyberia/mongodb/entrypoint.sh +76 -0
  171. package/src/runtime/engine-cyberia/nginx.conf +87 -0
  172. package/src/runtime/express/Express.js +2 -2
  173. package/src/runtime/nginx/Nginx.js +250 -0
  174. package/src/server/catalog.js +9 -14
  175. package/src/server/conf.js +3 -6
  176. package/src/server/runtime-status.js +18 -1
  177. package/src/server/start.js +12 -2
  178. package/src/server.js +6 -2
  179. package/test/cyberia-instance-conf-defaults.test.js +140 -0
  180. package/test/deploy-monitor.test.js +26 -10
  181. package/test/shape-generator.test.js +7 -1
  182. package/typedoc.dd-cyberia.json +3 -1
  183. package/typedoc.json +3 -1
  184. /package/src/client/ssr/{Render.js → RootDocument.js} +0 -0
  185. /package/src/{server → client-builder}/client-formatted.js +0 -0
@@ -11,8 +11,8 @@
11
11
  * @namespace IpfsClient
12
12
  */
13
13
  import stringify from 'fast-json-stable-stringify';
14
- import { loggerFactory } from './logger.js';
15
- import Underpost from '../index.js';
14
+ import { loggerFactory } from '../../server/logger.js';
15
+ import Underpost from '../../index.js';
16
16
  const logger = loggerFactory(import.meta);
17
17
  const DEFAULT_IPFS_HTTP_TIMEOUT_MS = Number(process.env.IPFS_HTTP_TIMEOUT_MS || 10000);
18
18
  const getRequestTimeoutMs = (kind = 'kubo') => {
@@ -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)
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Underpost platform content catalog — the base `pwa-microservices-template`.
3
3
  *
4
- * @module src/server/catalog-underpost.js
4
+ * @module src/projects/underpost/catalog-underpost.js
5
5
  * @namespace UnderpostCatalog
6
6
  */
7
7
 
@@ -11,7 +11,6 @@
11
11
  * @memberof UnderpostCatalog
12
12
  */
13
13
  const TEMPLATE_RESTORE_PATHS = [
14
- `./src/server/catalog-underpost.js`,
15
14
  `./.github/workflows/pwa-microservices-template-page.cd.yml`,
16
15
  `./.github/workflows/pwa-microservices-template-test.ci.yml`,
17
16
  `./.github/workflows/npmpkg.ci.yml`,
@@ -2,82 +2,48 @@
2
2
  ARG BUILD_MODE=RELEASE
3
3
 
4
4
  # --- Build Image ---
5
- FROM rockylinux/rockylinux:9 AS builder
5
+ FROM emscripten/emsdk:5.0.6 AS builder
6
6
 
7
7
  ARG BUILD_MODE=RELEASE
8
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}"
46
-
47
- ARG EMSDK_VERSION=5.0.6
48
- WORKDIR /opt
49
- RUN git clone https://github.com/emscripten-core/emsdk.git ${EMSDK}
50
- WORKDIR ${EMSDK}
51
- RUN ./emsdk install ${EMSDK_VERSION} && \
52
- ./emsdk activate ${EMSDK_VERSION}
53
-
54
9
  WORKDIR /cyberia-client
55
10
 
56
11
  COPY . .
57
12
 
58
- 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/
59
14
 
60
15
  # --- Runtime Image ---
61
16
  FROM rockylinux/rockylinux:9 AS runtime
62
-
63
- ARG UNDERPOST_VERSION=3.2.9
64
- RUN dnf -y update && \
65
- dnf -y install epel-release && \
66
- dnf -y install --allowerasing curl git python3 && \
67
- curl -fsSL https://rpm.nodesource.com/setup_24.x | bash - && \
68
- dnf install -y nodejs && \
69
- npm install -g underpost@${UNDERPOST_VERSION} && \
70
- 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; \
71
33
  npm cache clean --force
72
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.
73
39
  WORKDIR /home/dd/engine/cyberia-client
74
40
 
75
- COPY --from=builder /cyberia-client/server.py ./server.py
76
- 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/
77
43
 
44
+ ENV PYTHONUNBUFFERED=1
78
45
  ENV CYBERIA_PORT=8081
79
- ENV CYBERIA_MODE=production
80
46
 
81
- EXPOSE 8081 8082
47
+ EXPOSE 8081
82
48
 
83
- CMD ["sh", "-c", "exec python3 server.py ${CYBERIA_PORT} bin ${CYBERIA_MODE}"]
49
+ CMD ["sh", "-c", "exec python3 docker-driver.py ${CYBERIA_PORT} bin"]
@@ -43,25 +43,33 @@ RUN make -f Web.mk all BUILD_MODE=${BUILD_MODE} OUTPUT_DIR=bin/
43
43
  # --- Runtime Image ---
44
44
  FROM rockylinux/rockylinux:9 AS runtime
45
45
 
46
- ARG UNDERPOST_VERSION=3.2.9
47
- RUN dnf -y update && \
48
- 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; \
49
51
  dnf -y install --allowerasing \
50
- curl git python3 \
51
- procps-ng strace lsof vim-minimal && \
52
- curl -fsSL https://rpm.nodesource.com/setup_24.x | bash - && \
53
- dnf install -y nodejs && \
54
- 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}; \
55
64
  dnf clean all
56
65
 
57
66
  WORKDIR /home/dd/engine/cyberia-client
58
67
 
59
- COPY --from=builder /cyberia-client/server.py ./server.py
60
- 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/
61
70
 
62
71
  ENV CYBERIA_PORT=8082
63
- ENV CYBERIA_MODE=development
64
72
 
65
73
  EXPOSE 8081 8082
66
74
 
67
- 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,36 +1,37 @@
1
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
2
+ FROM golang:1.24 AS builder
11
3
 
12
4
  WORKDIR /build
13
5
 
14
-
15
6
  COPY go.mod go.sum ./
16
7
  RUN go mod download
17
8
 
18
9
  COPY . ./
19
- RUN chmod +x build.sh && ./build.sh
10
+ RUN CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o server ./cmd/cyberia-server/
20
11
 
21
12
  # --- Runtime Image ---
22
13
  FROM rockylinux/rockylinux:9 AS runtime
23
-
24
- ARG UNDERPOST_VERSION=3.2.9
25
- RUN dnf -y update && \
26
- dnf -y install epel-release && \
27
- dnf -y install --allowerasing curl git && \
28
- curl -fsSL https://rpm.nodesource.com/setup_24.x | bash - && \
29
- dnf install -y nodejs && \
30
- npm install -g underpost@${UNDERPOST_VERSION} && \
31
- 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; \
32
30
  npm cache clean --force
33
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.
34
35
  WORKDIR /home/dd/engine/cyberia-server
35
36
 
36
37
  COPY --from=builder /build/server ./server
@@ -25,15 +25,24 @@ RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \
25
25
  # --- Runtime Image ---
26
26
  FROM rockylinux/rockylinux:9 AS runtime
27
27
 
28
- ARG UNDERPOST_VERSION=3.2.9
29
- RUN dnf -y update && \
30
- dnf -y install epel-release && \
28
+ ARG UNDERPOST_VERSION=3.2.70
29
+ ARG NODE_VERSION=24.15.0
30
+ RUN set -eux; \
31
+ dnf -y update; \
32
+ dnf -y install epel-release; \
31
33
  dnf -y install --allowerasing \
32
- curl git \
33
- procps-ng strace lsof vim-minimal && \
34
- curl -fsSL https://rpm.nodesource.com/setup_24.x | bash - && \
35
- dnf install -y nodejs && \
36
- npm install -g underpost@${UNDERPOST_VERSION} && \
34
+ curl git tar xz \
35
+ procps-ng strace lsof vim-minimal; \
36
+ arch="$(uname -m)"; \
37
+ case "$arch" in \
38
+ x86_64) node_arch=x64 ;; \
39
+ aarch64) node_arch=arm64 ;; \
40
+ *) echo "unsupported arch: $arch" >&2; exit 1 ;; \
41
+ esac; \
42
+ curl -fsSL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-${node_arch}.tar.xz" \
43
+ | tar -xJ -C /usr/local --strip-components=1; \
44
+ node --version; npm --version; \
45
+ npm install -g underpost@${UNDERPOST_VERSION}; \
37
46
  dnf clean all
38
47
 
39
48
  WORKDIR /home/dd/engine/cyberia-server