cyberia 3.2.9 → 3.2.12

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 (169) hide show
  1. package/.github/workflows/engine-cyberia.cd.yml +6 -0
  2. package/.github/workflows/npmpkg.ci.yml +1 -0
  3. package/.github/workflows/pwa-microservices-template-test.ci.yml +1 -1
  4. package/.github/workflows/release.cd.yml +1 -0
  5. package/.vscode/extensions.json +9 -9
  6. package/.vscode/settings.json +20 -4
  7. package/CHANGELOG.md +213 -1
  8. package/CLI-HELP.md +92 -23
  9. package/README.md +190 -348
  10. package/bin/build.js +24 -8
  11. package/bin/build.template.js +187 -0
  12. package/bin/cyberia.js +229 -52
  13. package/bin/deploy.js +12 -2
  14. package/bin/index.js +229 -52
  15. package/bump.config.js +26 -0
  16. package/conf.js +130 -24
  17. package/deployment.yaml +4 -2
  18. package/hardhat/package-lock.json +113 -144
  19. package/hardhat/package.json +4 -3
  20. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +1 -1
  21. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +1 -1
  22. package/manifests/deployment/dd-cyberia-development/deployment.yaml +4 -2
  23. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  24. package/manifests/deployment/dd-test-development/deployment.yaml +4 -2
  25. package/manifests/kind-config-dev.yaml +8 -0
  26. package/manifests/lxd/lxd-admin-profile.yaml +12 -3
  27. package/manifests/mongodb/pv-pvc.yaml +44 -8
  28. package/manifests/mongodb/statefulset.yaml +55 -68
  29. package/manifests/mongodb-4.4/headless-service.yaml +10 -0
  30. package/manifests/mongodb-4.4/kustomization.yaml +3 -1
  31. package/manifests/mongodb-4.4/mongodb-nodeport.yaml +17 -0
  32. package/manifests/mongodb-4.4/pv-pvc.yaml +10 -14
  33. package/manifests/mongodb-4.4/statefulset.yaml +79 -0
  34. package/manifests/mongodb-4.4/storage-class.yaml +9 -0
  35. package/manifests/valkey/statefulset.yaml +1 -1
  36. package/manifests/valkey/valkey-nodeport.yaml +17 -0
  37. package/package.json +27 -15
  38. package/scripts/ipxe-setup.sh +52 -49
  39. package/scripts/k3s-node-setup.sh +81 -46
  40. package/scripts/lxd-vm-setup.sh +193 -8
  41. package/scripts/maas-nat-firewalld.sh +145 -0
  42. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +38 -33
  43. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +16 -16
  44. package/src/api/core/core.router.js +19 -14
  45. package/src/api/core/core.service.js +5 -5
  46. package/src/api/crypto/crypto.router.js +18 -12
  47. package/src/api/crypto/crypto.service.js +3 -3
  48. package/src/api/cyberia-action/cyberia-action.model.js +1 -1
  49. package/src/api/cyberia-action/cyberia-action.router.js +22 -18
  50. package/src/api/cyberia-action/cyberia-action.service.js +5 -5
  51. package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +74 -0
  52. package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +99 -0
  53. package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +98 -0
  54. package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +152 -0
  55. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +25 -20
  56. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +6 -6
  57. package/src/api/cyberia-entity/cyberia-entity.router.js +22 -18
  58. package/src/api/cyberia-entity/cyberia-entity.service.js +5 -5
  59. package/src/api/cyberia-instance/cyberia-fallback-world.js +79 -4
  60. package/src/api/cyberia-instance/cyberia-instance.router.js +57 -52
  61. package/src/api/cyberia-instance/cyberia-instance.service.js +10 -10
  62. package/src/api/cyberia-instance/cyberia-world-generator.js +3 -3
  63. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +14 -48
  64. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +22 -18
  65. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +5 -5
  66. package/src/api/cyberia-map/cyberia-map.router.js +35 -30
  67. package/src/api/cyberia-map/cyberia-map.service.js +7 -7
  68. package/src/api/cyberia-quest/cyberia-quest.model.js +1 -1
  69. package/src/api/cyberia-quest/cyberia-quest.router.js +22 -18
  70. package/src/api/cyberia-quest/cyberia-quest.service.js +5 -5
  71. package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +22 -18
  72. package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +5 -5
  73. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +451 -0
  74. package/src/api/default/default.router.js +22 -18
  75. package/src/api/default/default.service.js +5 -5
  76. package/src/api/document/document.router.js +28 -23
  77. package/src/api/document/document.service.js +100 -23
  78. package/src/api/file/file.router.js +19 -13
  79. package/src/api/file/file.service.js +9 -7
  80. package/src/api/instance/instance.router.js +29 -24
  81. package/src/api/instance/instance.service.js +6 -6
  82. package/src/api/ipfs/ipfs.router.js +21 -16
  83. package/src/api/ipfs/ipfs.service.js +8 -8
  84. package/src/api/object-layer/object-layer.router.js +512 -507
  85. package/src/api/object-layer/object-layer.service.js +17 -14
  86. package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +22 -18
  87. package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +5 -5
  88. package/src/api/test/test.router.js +17 -12
  89. package/src/api/types.js +24 -0
  90. package/src/api/user/guest.service.js +5 -4
  91. package/src/api/user/user.router.js +297 -288
  92. package/src/api/user/user.service.js +100 -35
  93. package/src/cli/baremetal.js +132 -101
  94. package/src/cli/cluster.js +700 -232
  95. package/src/cli/db.js +59 -60
  96. package/src/cli/deploy.js +216 -137
  97. package/src/cli/fs.js +13 -3
  98. package/src/cli/index.js +80 -15
  99. package/src/cli/ipfs.js +4 -6
  100. package/src/cli/kubectl.js +4 -1
  101. package/src/cli/lxd.js +1099 -223
  102. package/src/cli/monitor.js +9 -3
  103. package/src/cli/release.js +334 -140
  104. package/src/cli/repository.js +68 -23
  105. package/src/cli/run.js +193 -49
  106. package/src/cli/secrets.js +11 -2
  107. package/src/cli/test.js +9 -3
  108. package/src/client/Default.index.js +9 -3
  109. package/src/client/components/core/Auth.js +5 -0
  110. package/src/client/components/core/ClientEvents.js +76 -0
  111. package/src/client/components/core/EventBus.js +4 -0
  112. package/src/client/components/core/Modal.js +82 -41
  113. package/src/client/components/core/PanelForm.js +56 -52
  114. package/src/client/components/core/Worker.js +162 -363
  115. package/src/client/components/cyberia/MapEngineCyberia.js +1 -1
  116. package/src/client/components/cyberia/SharedDefaultsCyberia.js +330 -0
  117. package/src/client/public/cyberia-docs/ARCHITECTURE.md +50 -410
  118. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +114 -327
  119. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +200 -222
  120. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +203 -185
  121. package/src/client/public/cyberia-docs/CYBERIA.md +259 -0
  122. package/src/client/public/cyberia-docs/OFF-CHAIN-ECONOMY.md +2 -2
  123. package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
  124. package/src/client/public/cyberia-docs/UNDERPOST-PLATFORM.md +106 -0
  125. package/src/client/public/cyberia-docs/WHITE-PAPER.md +1 -1
  126. package/src/client/services/cyberia-client-hints/cyberia-client-hints.service.js +99 -0
  127. package/src/client/ssr/views/CyberiaServerMetrics.js +982 -0
  128. package/src/client/sw/core.sw.js +174 -112
  129. package/src/db/DataBaseProvider.js +115 -15
  130. package/src/db/mariadb/MariaDB.js +2 -1
  131. package/src/db/mongo/MongoBootstrap.js +657 -0
  132. package/src/db/mongo/MongooseDB.js +129 -21
  133. package/src/grpc/cyberia/grpc-server.js +25 -57
  134. package/src/index.js +1 -1
  135. package/src/runtime/cyberia-client/Dockerfile +24 -3
  136. package/src/runtime/cyberia-client/Dockerfile.dev +82 -0
  137. package/src/runtime/cyberia-server/Dockerfile +29 -4
  138. package/src/runtime/cyberia-server/Dockerfile.dev +71 -0
  139. package/src/runtime/express/Express.js +2 -2
  140. package/src/runtime/wp/Wp.js +8 -5
  141. package/src/server/auth.js +2 -2
  142. package/src/server/client-build-docs.js +1 -1
  143. package/src/server/client-build.js +94 -129
  144. package/src/server/conf.js +86 -83
  145. package/src/server/process.js +180 -19
  146. package/src/server/proxy.js +9 -2
  147. package/src/server/runtime.js +1 -1
  148. package/src/server/start.js +17 -5
  149. package/src/server/valkey.js +2 -0
  150. package/src/ws/IoInterface.js +16 -16
  151. package/src/ws/core/channels/core.ws.chat.js +11 -11
  152. package/src/ws/core/channels/core.ws.mailer.js +29 -29
  153. package/src/ws/core/channels/core.ws.stream.js +19 -19
  154. package/src/ws/core/core.ws.connection.js +8 -8
  155. package/src/ws/core/core.ws.server.js +6 -5
  156. package/src/ws/default/channels/default.ws.main.js +10 -10
  157. package/src/ws/default/default.ws.connection.js +4 -4
  158. package/src/ws/default/default.ws.server.js +4 -3
  159. package/bin/file.js +0 -202
  160. package/bin/vs.js +0 -74
  161. package/bin/zed.js +0 -84
  162. package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +0 -574
  163. package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +0 -467
  164. package/src/client/ssr/email/DefaultRecoverEmail.js +0 -21
  165. package/src/client/ssr/email/DefaultVerifyEmail.js +0 -17
  166. package/src/client/ssr/pages/CyberiaServerMetrics.js +0 -461
  167. /package/src/client/ssr/{offline → views}/Maintenance.js +0 -0
  168. /package/src/client/ssr/{offline → views}/NoNetworkConnection.js +0 -0
  169. /package/src/client/ssr/{pages → views}/Test.js +0 -0
@@ -924,8 +924,6 @@ class UnderpostRepository {
924
924
  shellExec(`cd ${privateRepoPath} && underpost pull . ${process.env.GITHUB_USERNAME}/${privateRepoName}`, {
925
925
  silent: true,
926
926
  });
927
- shellExec(`underpost run secret`);
928
- shellExec(`underpost run underpost-config`);
929
927
  const packageJsonDeploy = JSON.parse(fs.readFileSync(`./engine-private/conf/${deployId}/package.json`, 'utf8'));
930
928
  const packageJsonEngine = JSON.parse(fs.readFileSync(`./package.json`, 'utf8'));
931
929
  if (packageJsonDeploy.version !== packageJsonEngine.version) {
@@ -1008,11 +1006,14 @@ Prevent build private config repo.`,
1008
1006
  const host = 'default.net';
1009
1007
  const path = '/';
1010
1008
  DefaultConf.server[host][path].valkey = {
1011
- port: 6379,
1012
- host: 'valkey-service.default.svc.cluster.local',
1009
+ port: 'env:VALKEY_PORT:int:6379',
1010
+ host: 'env:VALKEY_HOST:127.0.0.1',
1013
1011
  };
1014
- // mongodb-0.mongodb-service
1015
- DefaultConf.server[host][path].db.host = 'mongodb://mongodb-service:27017';
1012
+ DefaultConf.server[host][path].db.host = 'env:DB_HOST:mongodb://127.0.0.1:27017';
1013
+ DefaultConf.server[host][path].db.replicaSet = 'env:DB_REPLICA_SET:rs0';
1014
+ DefaultConf.server[host][path].db.authSource = 'env:DB_AUTH_SOURCE:admin';
1015
+ DefaultConf.server[host][path].db.user = 'env:DB_USER:';
1016
+ DefaultConf.server[host][path].db.password = 'env:DB_PASSWORD:';
1016
1017
  defaultConf = true;
1017
1018
  break;
1018
1019
  }
@@ -1048,9 +1049,9 @@ Prevent build private config repo.`,
1048
1049
  */
1049
1050
  clean(options = { paths: [''] }) {
1050
1051
  for (const path of options.paths) {
1051
- shellExec(`cd ${path} && git reset`, { silent: true });
1052
- shellExec(`cd ${path} && git checkout .`, { silent: true });
1053
- shellExec(`cd ${path} && git clean -f -d`, { silent: true });
1052
+ shellExec(`cd ${path} && git reset`, { silentOnError: true, silent: true, disableLog: true });
1053
+ shellExec(`cd ${path} && git checkout .`, { silentOnError: true, silent: true, disableLog: true });
1054
+ shellExec(`cd ${path} && git clean -f -d`, { silentOnError: true, silent: true, disableLog: true });
1054
1055
  }
1055
1056
  },
1056
1057
 
@@ -1104,7 +1105,7 @@ Prevent build private config repo.`,
1104
1105
 
1105
1106
  try {
1106
1107
  // Fetch directory contents recursively
1107
- const copiedFiles = await this._fetchAndCopyGitHubDirectory({
1108
+ const copiedFiles = await this.fetchAndCopyGitHubDirectory({
1108
1109
  apiUrl,
1109
1110
  targetPath,
1110
1111
  basePath: directoryPath,
@@ -1140,7 +1141,7 @@ Prevent build private config repo.`,
1140
1141
  * @returns {Promise<array>} Array of copied file paths.
1141
1142
  * @memberof UnderpostRepository
1142
1143
  */
1143
- async _fetchAndCopyGitHubDirectory(options) {
1144
+ async fetchAndCopyGitHubDirectory(options) {
1144
1145
  const { apiUrl, targetPath, basePath, branch } = options;
1145
1146
  const copiedFiles = [];
1146
1147
 
@@ -1175,14 +1176,12 @@ Prevent build private config repo.`,
1175
1176
 
1176
1177
  logger.info(`Found ${contents.length} items in directory: ${basePath}`);
1177
1178
 
1178
- // Process each item in the directory
1179
1179
  for (const item of contents) {
1180
1180
  const itemTargetPath = `${targetPath}/${item.name}`;
1181
1181
 
1182
1182
  if (item.type === 'file') {
1183
1183
  logger.info(`Downloading file: ${item.path}`);
1184
1184
 
1185
- // Download file content
1186
1185
  const fileResponse = await fetch(item.download_url);
1187
1186
  if (!fileResponse.ok) {
1188
1187
  logger.error(`Failed to download: ${item.download_url}`);
@@ -1192,16 +1191,14 @@ Prevent build private config repo.`,
1192
1191
  const fileContent = await fileResponse.text();
1193
1192
  fs.writeFileSync(itemTargetPath, fileContent);
1194
1193
 
1195
- logger.info(`✓ Saved: ${itemTargetPath}`);
1194
+ logger.info(`Saved: ${itemTargetPath}`);
1196
1195
  copiedFiles.push(itemTargetPath);
1197
1196
  } else if (item.type === 'dir') {
1198
- logger.info(`📁 Processing directory: ${item.path}`);
1197
+ logger.info(`Processing directory: ${item.path}`);
1199
1198
 
1200
- // Create subdirectory
1201
1199
  fs.mkdirSync(itemTargetPath, { recursive: true });
1202
1200
 
1203
- // Recursively process subdirectory
1204
- const subFiles = await this._fetchAndCopyGitHubDirectory({
1201
+ const subFiles = await this.fetchAndCopyGitHubDirectory({
1205
1202
  apiUrl: item.url,
1206
1203
  targetPath: itemTargetPath,
1207
1204
  basePath: item.path,
@@ -1209,7 +1206,7 @@ Prevent build private config repo.`,
1209
1206
  });
1210
1207
 
1211
1208
  copiedFiles.push(...subFiles);
1212
- logger.info(`✓ Completed directory: ${item.path} (${subFiles.length} files)`);
1209
+ logger.info(`Completed directory: ${item.path} (${subFiles.length} files)`);
1213
1210
  } else {
1214
1211
  logger.warn(`Skipping unknown item type '${item.type}': ${item.path}`);
1215
1212
  }
@@ -1295,7 +1292,7 @@ Prevent build private config repo.`,
1295
1292
  },
1296
1293
  /**
1297
1294
  * Checks whether a remote Git repository URL is reachable.
1298
- * Uses `git ls-remote` with `|| true` so the process always exits 0.
1295
+ * Uses `silentOnError` so a non-reachable remote returns false instead of throwing.
1299
1296
  * Injects `GITHUB_TOKEN` into GitHub HTTPS URLs when available.
1300
1297
  * @param {string} url - Full HTTPS clone URL to test (e.g. "https://github.com/org/repo.git").
1301
1298
  * @returns {boolean} `true` when the remote responded with at least one ref hash.
@@ -1305,10 +1302,11 @@ Prevent build private config repo.`,
1305
1302
  if (!url) return false;
1306
1303
  const authUrl = Underpost.repo.resolveAuthUrl(url);
1307
1304
  // GIT_TERMINAL_PROMPT=0 prevents git from hanging on credential prompts inside containers.
1308
- const raw = shellExec(`GIT_TERMINAL_PROMPT=0 git ls-remote "${authUrl}" HEAD 2>&1 || true`, {
1305
+ const raw = shellExec(`GIT_TERMINAL_PROMPT=0 git ls-remote "${authUrl}" HEAD 2>&1`, {
1309
1306
  stdout: true,
1310
1307
  silent: true,
1311
1308
  disableLog: true,
1309
+ silentOnError: true,
1312
1310
  });
1313
1311
  logger.info('isRemoteRepo', { url, raw: (raw || '').slice(0, 120) });
1314
1312
  return typeof raw === 'string' && /^[0-9a-f]{40}\t/m.test(raw);
@@ -1380,11 +1378,12 @@ Prevent build private config repo.`,
1380
1378
  }
1381
1379
  shellExec(`cd "${repoPath}" && git config user.name '${gitUsername}'`);
1382
1380
  shellExec(`cd "${repoPath}" && git config user.email '${gitEmail}'`);
1383
-
1381
+ shellExec(`cd "${repoPath}" && git config core.filemode false`);
1384
1382
  if (origin) {
1385
- const currentRemote = shellExec(`cd "${repoPath}" && git remote get-url origin 2>/dev/null || true`, {
1383
+ const currentRemote = shellExec(`cd "${repoPath}" && git remote get-url origin`, {
1386
1384
  stdout: true,
1387
1385
  silent: true,
1386
+ silentOnError: true,
1388
1387
  }).trim();
1389
1388
  if (!currentRemote) {
1390
1389
  shellExec(`cd "${repoPath}" && git remote add origin "${origin}"`);
@@ -1608,6 +1607,52 @@ Prevent build private config repo.`,
1608
1607
  logger.info('engine-private in /home/dd removed');
1609
1608
  }
1610
1609
  },
1610
+
1611
+ /**
1612
+ * Resolves the GitHub repository for a given instance runtime by scanning
1613
+ * every `conf.instances.json` listed in `./engine-private/deploy/dd.router`.
1614
+ *
1615
+ * Resolution order:
1616
+ * 1. If `runtime` is falsy, returns `${GITHUB_USERNAME}/engine`.
1617
+ * 2. Iterates each deploy ID found in `dd.router` and looks for an instance
1618
+ * whose `runtime` field matches the supplied value.
1619
+ * 3. When a match is found, returns `instance.metadata.repository`.
1620
+ * 4. Falls back to `${GITHUB_USERNAME}/engine` when no match is found.
1621
+ *
1622
+ * @param {string} [runtime=''] - The runtime identifier to look up (e.g. `'cyberia-server'`, `'cyberia-client'`).
1623
+ * @returns {string} The resolved `owner/repo` string.
1624
+ * @memberof UnderpostRepository
1625
+ */
1626
+ resolveInstanceRepo(runtime = '') {
1627
+ const fallback = `${process.env.GITHUB_USERNAME}/engine`;
1628
+ if (!runtime) return fallback;
1629
+ const ddRouter = './engine-private/deploy/dd.router';
1630
+ const deployIds = fs.existsSync(ddRouter)
1631
+ ? fs
1632
+ .readFileSync(ddRouter, 'utf8')
1633
+ .split(',')
1634
+ .map((s) => s.trim())
1635
+ .filter(Boolean)
1636
+ : [];
1637
+ for (const deployId of deployIds) {
1638
+ const confPath = `./engine-private/conf/${deployId}/conf.instances.json`;
1639
+ if (!fs.existsSync(confPath)) continue;
1640
+ try {
1641
+ const instances = JSON.parse(fs.readFileSync(confPath, 'utf8'));
1642
+ const match = instances.find((i) => i && i.runtime === runtime);
1643
+ if (match && match.metadata && match.metadata.repository) {
1644
+ logger.info(`[resolveInstanceRepo] resolved from ${confPath}`, {
1645
+ runtime,
1646
+ repo: match.metadata.repository,
1647
+ });
1648
+ return match.metadata.repository;
1649
+ }
1650
+ } catch (err) {
1651
+ logger.warn(`[resolveInstanceRepo] failed to parse ${confPath}: ${err.message}`);
1652
+ }
1653
+ }
1654
+ return fallback;
1655
+ },
1611
1656
  };
1612
1657
  }
1613
1658