cyberia 3.2.5 → 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 (381) hide show
  1. package/.github/workflows/engine-cyberia.cd.yml +8 -2
  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 +2 -2
  5. package/.vscode/extensions.json +9 -9
  6. package/.vscode/settings.json +20 -4
  7. package/CHANGELOG.md +563 -1
  8. package/CLI-HELP.md +130 -34
  9. package/Dockerfile +0 -4
  10. package/README.md +194 -607
  11. package/bin/build.js +42 -12
  12. package/bin/build.template.js +187 -0
  13. package/bin/cyberia.js +1367 -281
  14. package/bin/deploy.js +582 -3
  15. package/bin/index.js +1367 -281
  16. package/bump.config.js +26 -0
  17. package/conf.js +195 -111
  18. package/deployment.yaml +6 -222
  19. package/hardhat/package-lock.json +118 -149
  20. package/hardhat/package.json +5 -4
  21. package/jsconfig.json +1 -1
  22. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +2 -2
  23. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +2 -2
  24. package/manifests/deployment/dd-cyberia-development/deployment.yaml +6 -222
  25. package/manifests/deployment/dd-cyberia-development/proxy.yaml +10 -118
  26. package/manifests/deployment/dd-default-development/deployment.yaml +2 -6
  27. package/manifests/deployment/dd-test-development/deployment.yaml +138 -66
  28. package/manifests/deployment/dd-test-development/proxy.yaml +41 -5
  29. package/manifests/kind-config-dev.yaml +8 -0
  30. package/manifests/lxd/lxd-admin-profile.yaml +12 -3
  31. package/manifests/mongodb/pv-pvc.yaml +44 -8
  32. package/manifests/mongodb/statefulset.yaml +55 -68
  33. package/manifests/mongodb-4.4/headless-service.yaml +10 -0
  34. package/manifests/mongodb-4.4/kustomization.yaml +3 -1
  35. package/manifests/mongodb-4.4/mongodb-nodeport.yaml +17 -0
  36. package/manifests/mongodb-4.4/pv-pvc.yaml +10 -14
  37. package/manifests/mongodb-4.4/statefulset.yaml +79 -0
  38. package/manifests/mongodb-4.4/storage-class.yaml +9 -0
  39. package/manifests/valkey/statefulset.yaml +1 -1
  40. package/manifests/valkey/valkey-nodeport.yaml +17 -0
  41. package/package.json +45 -24
  42. package/proxy.yaml +10 -118
  43. package/scripts/ipxe-setup.sh +52 -49
  44. package/scripts/k3s-node-setup.sh +83 -48
  45. package/scripts/lxd-vm-setup.sh +193 -8
  46. package/scripts/maas-nat-firewalld.sh +145 -0
  47. package/scripts/nat-iptables.sh +103 -18
  48. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +18 -18
  49. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +7 -14
  50. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +38 -33
  51. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +91 -36
  52. package/src/api/core/core.controller.js +10 -10
  53. package/src/api/core/core.router.js +19 -14
  54. package/src/api/core/core.service.js +15 -15
  55. package/src/api/crypto/crypto.controller.js +8 -8
  56. package/src/api/crypto/crypto.router.js +18 -12
  57. package/src/api/crypto/crypto.service.js +11 -11
  58. package/src/api/cyberia-action/cyberia-action.controller.js +74 -0
  59. package/src/api/cyberia-action/cyberia-action.model.js +87 -0
  60. package/src/api/cyberia-action/cyberia-action.router.js +31 -0
  61. package/src/api/cyberia-action/cyberia-action.service.js +42 -0
  62. package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +74 -0
  63. package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +99 -0
  64. package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +98 -0
  65. package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +152 -0
  66. package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +13 -13
  67. package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +11 -11
  68. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +25 -20
  69. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +22 -22
  70. package/src/api/cyberia-entity/cyberia-entity.controller.js +10 -10
  71. package/src/api/cyberia-entity/cyberia-entity.router.js +22 -18
  72. package/src/api/cyberia-entity/cyberia-entity.service.js +15 -15
  73. package/src/api/cyberia-instance/cyberia-fallback-world.js +83 -198
  74. package/src/api/cyberia-instance/cyberia-instance.controller.js +14 -14
  75. package/src/api/cyberia-instance/cyberia-instance.model.js +3 -0
  76. package/src/api/cyberia-instance/cyberia-instance.router.js +57 -52
  77. package/src/api/cyberia-instance/cyberia-instance.service.js +32 -67
  78. package/src/api/cyberia-instance/cyberia-portal-connector.js +20 -246
  79. package/src/api/cyberia-instance/cyberia-world-generator.js +505 -0
  80. package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +10 -10
  81. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +18 -49
  82. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +22 -18
  83. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +19 -15
  84. package/src/api/cyberia-map/cyberia-map.controller.js +10 -10
  85. package/src/api/cyberia-map/cyberia-map.router.js +35 -30
  86. package/src/api/cyberia-map/cyberia-map.service.js +17 -17
  87. package/src/api/cyberia-quest/cyberia-quest.controller.js +74 -0
  88. package/src/api/cyberia-quest/cyberia-quest.model.js +67 -0
  89. package/src/api/cyberia-quest/cyberia-quest.router.js +31 -0
  90. package/src/api/cyberia-quest/cyberia-quest.service.js +42 -0
  91. package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +74 -0
  92. package/src/api/cyberia-quest-progress/cyberia-quest-progress.model.js +49 -0
  93. package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +31 -0
  94. package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +42 -0
  95. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +451 -0
  96. package/src/api/default/default.controller.js +10 -10
  97. package/src/api/default/default.router.js +22 -18
  98. package/src/api/default/default.service.js +15 -15
  99. package/src/api/document/document.controller.js +12 -12
  100. package/src/api/document/document.model.js +10 -16
  101. package/src/api/document/document.router.js +28 -23
  102. package/src/api/document/document.service.js +100 -23
  103. package/src/api/file/file.controller.js +8 -8
  104. package/src/api/file/file.model.js +10 -10
  105. package/src/api/file/file.router.js +19 -13
  106. package/src/api/file/file.service.js +45 -43
  107. package/src/api/instance/instance.controller.js +10 -10
  108. package/src/api/instance/instance.model.js +4 -10
  109. package/src/api/instance/instance.router.js +29 -24
  110. package/src/api/instance/instance.service.js +16 -16
  111. package/src/api/ipfs/ipfs.controller.js +12 -12
  112. package/src/api/ipfs/ipfs.model.js +4 -13
  113. package/src/api/ipfs/ipfs.router.js +21 -16
  114. package/src/api/ipfs/ipfs.service.js +22 -36
  115. package/src/api/object-layer/object-layer.controller.js +12 -12
  116. package/src/api/object-layer/object-layer.model.js +4 -17
  117. package/src/api/object-layer/object-layer.router.js +512 -507
  118. package/src/api/object-layer/object-layer.service.js +29 -26
  119. package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +10 -10
  120. package/src/api/object-layer-render-frames/object-layer-render-frames.model.js +6 -16
  121. package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +22 -18
  122. package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +19 -15
  123. package/src/api/test/test.controller.js +8 -8
  124. package/src/api/test/test.router.js +17 -12
  125. package/src/api/test/test.service.js +8 -8
  126. package/src/api/types.js +24 -0
  127. package/src/api/user/guest.service.js +100 -0
  128. package/src/api/user/user.controller.js +6 -6
  129. package/src/api/user/user.model.js +8 -13
  130. package/src/api/user/user.router.js +297 -288
  131. package/src/api/user/user.service.js +103 -55
  132. package/src/cli/baremetal.js +132 -101
  133. package/src/cli/cluster.js +732 -217
  134. package/src/cli/db.js +106 -62
  135. package/src/cli/deploy.js +260 -149
  136. package/src/cli/fs.js +90 -9
  137. package/src/cli/image.js +43 -1
  138. package/src/cli/index.js +106 -16
  139. package/src/cli/ipfs.js +4 -6
  140. package/src/cli/kubectl.js +4 -1
  141. package/src/cli/lxd.js +1099 -223
  142. package/src/cli/monitor.js +9 -3
  143. package/src/cli/release.js +336 -86
  144. package/src/cli/repository.js +136 -53
  145. package/src/cli/run.js +599 -76
  146. package/src/cli/secrets.js +11 -2
  147. package/src/cli/ssh.js +1 -1
  148. package/src/cli/static.js +43 -115
  149. package/src/cli/test.js +9 -3
  150. package/src/client/Cryptokoyn.index.js +18 -21
  151. package/src/client/CyberiaPortal.index.js +19 -23
  152. package/src/client/Default.index.js +30 -36
  153. package/src/client/Itemledger.index.js +20 -26
  154. package/src/client/Underpost.index.js +19 -23
  155. package/src/client/components/core/404.js +4 -4
  156. package/src/client/components/core/500.js +4 -4
  157. package/src/client/components/core/Account.js +73 -60
  158. package/src/client/components/core/AgGrid.js +23 -33
  159. package/src/client/components/core/Alert.js +12 -13
  160. package/src/client/components/core/AppStore.js +1 -1
  161. package/src/client/components/core/Auth.js +40 -37
  162. package/src/client/components/core/Badge.js +7 -13
  163. package/src/client/components/core/BtnIcon.js +15 -17
  164. package/src/client/components/core/CalendarCore.js +42 -63
  165. package/src/client/components/core/Chat.js +13 -15
  166. package/src/client/components/core/ClientEvents.js +163 -0
  167. package/src/client/components/core/ColorPaletteElement.js +309 -0
  168. package/src/client/components/core/Content.js +17 -14
  169. package/src/client/components/core/Css.js +15 -71
  170. package/src/client/components/core/CssCore.js +12 -16
  171. package/src/client/components/core/D3Chart.js +4 -4
  172. package/src/client/components/core/Docs.js +64 -91
  173. package/src/client/components/core/DropDown.js +69 -91
  174. package/src/client/components/core/EventBus.js +96 -0
  175. package/src/client/components/core/EventsUI.js +14 -17
  176. package/src/client/components/core/FileExplorer.js +96 -228
  177. package/src/client/components/core/FullScreen.js +47 -75
  178. package/src/client/components/core/Input.js +24 -69
  179. package/src/client/components/core/Keyboard.js +25 -18
  180. package/src/client/components/core/KeyboardAvoidance.js +145 -0
  181. package/src/client/components/core/LoadingAnimation.js +25 -31
  182. package/src/client/components/core/LogIn.js +41 -41
  183. package/src/client/components/core/LogOut.js +23 -14
  184. package/src/client/components/core/Modal.js +544 -219
  185. package/src/client/components/core/NotificationManager.js +14 -18
  186. package/src/client/components/core/Panel.js +54 -50
  187. package/src/client/components/core/PanelForm.js +81 -177
  188. package/src/client/components/core/Polyhedron.js +110 -214
  189. package/src/client/components/core/PublicProfile.js +39 -32
  190. package/src/client/components/core/Recover.js +48 -44
  191. package/src/client/components/core/Responsive.js +88 -32
  192. package/src/client/components/core/RichText.js +9 -18
  193. package/src/client/components/core/Router.js +24 -3
  194. package/src/client/components/core/SearchBox.js +37 -37
  195. package/src/client/components/core/SignUp.js +39 -30
  196. package/src/client/components/core/SocketIo.js +31 -2
  197. package/src/client/components/core/SocketIoHandler.js +6 -6
  198. package/src/client/components/core/ToggleSwitch.js +8 -20
  199. package/src/client/components/core/ToolTip.js +5 -17
  200. package/src/client/components/core/Translate.js +56 -59
  201. package/src/client/components/core/Validator.js +26 -16
  202. package/src/client/components/core/Wallet.js +15 -26
  203. package/src/client/components/core/Worker.js +211 -276
  204. package/src/client/components/core/windowGetDimensions.js +7 -7
  205. package/src/client/components/cryptokoyn/{MenuCryptokoyn.js → AppShellCryptokoyn.js} +57 -57
  206. package/src/client/components/cryptokoyn/CssCryptokoyn.js +15 -15
  207. package/src/client/components/cryptokoyn/LogInCryptokoyn.js +6 -4
  208. package/src/client/components/cryptokoyn/LogOutCryptokoyn.js +6 -4
  209. package/src/client/components/cryptokoyn/RouterCryptokoyn.js +37 -0
  210. package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +4 -4
  211. package/src/client/components/cryptokoyn/SignUpCryptokoyn.js +6 -4
  212. package/src/client/components/cyberia/InstanceEngineCyberia.js +141 -60
  213. package/src/client/components/cyberia/MapEngineCyberia.js +691 -214
  214. package/src/client/components/cyberia/ObjectLayerEngine.js +19 -0
  215. package/src/client/components/cyberia/ObjectLayerEngineModal.js +1204 -94
  216. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +196 -298
  217. package/src/client/components/cyberia/SharedDefaultsCyberia.js +330 -0
  218. package/src/client/components/cyberia-portal/{MenuCyberiaPortal.js → AppShellCyberiaPortal.js} +102 -102
  219. package/src/client/components/cyberia-portal/CssCyberiaPortal.js +15 -15
  220. package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +6 -4
  221. package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +6 -4
  222. package/src/client/components/cyberia-portal/MainBodyCyberiaPortal.js +4 -4
  223. package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +60 -0
  224. package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +4 -4
  225. package/src/client/components/cyberia-portal/SignUpCyberiaPortal.js +6 -4
  226. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +4 -4
  227. package/src/client/components/default/{MenuDefault.js → AppShellDefault.js} +87 -87
  228. package/src/client/components/default/CssDefault.js +12 -12
  229. package/src/client/components/default/LogInDefault.js +6 -4
  230. package/src/client/components/default/LogOutDefault.js +6 -4
  231. package/src/client/components/default/RouterDefault.js +47 -0
  232. package/src/client/components/default/SettingsDefault.js +4 -4
  233. package/src/client/components/default/SignUpDefault.js +6 -4
  234. package/src/client/components/default/TranslateDefault.js +3 -3
  235. package/src/client/components/itemledger/{MenuItemledger.js → AppShellItemledger.js} +57 -57
  236. package/src/client/components/itemledger/CssItemledger.js +15 -15
  237. package/src/client/components/itemledger/LogInItemledger.js +6 -4
  238. package/src/client/components/itemledger/LogOutItemledger.js +6 -4
  239. package/src/client/components/itemledger/RouterItemledger.js +38 -0
  240. package/src/client/components/itemledger/SettingsItemledger.js +4 -4
  241. package/src/client/components/itemledger/SignUpItemledger.js +6 -4
  242. package/src/client/components/itemledger/TranslateItemledger.js +3 -3
  243. package/src/client/components/underpost/{MenuUnderpost.js → AppShellUnderpost.js} +88 -88
  244. package/src/client/components/underpost/CssUnderpost.js +14 -14
  245. package/src/client/components/underpost/CyberpunkBloggerUnderpost.js +4 -4
  246. package/src/client/components/underpost/DocumentSearchProvider.js +1 -1
  247. package/src/client/components/underpost/LabGalleryUnderpost.js +12 -15
  248. package/src/client/components/underpost/LogInUnderpost.js +6 -4
  249. package/src/client/components/underpost/LogOutUnderpost.js +6 -4
  250. package/src/client/components/underpost/RouterUnderpost.js +45 -0
  251. package/src/client/components/underpost/SettingsUnderpost.js +4 -4
  252. package/src/client/components/underpost/SignUpUnderpost.js +6 -4
  253. package/src/client/components/underpost/TranslateUnderpost.js +4 -4
  254. package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +235 -0
  255. package/src/client/public/cyberia-docs/ARCHITECTURE.md +83 -0
  256. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +204 -0
  257. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +291 -0
  258. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +278 -0
  259. package/src/client/public/cyberia-docs/CYBERIA.md +259 -0
  260. package/src/client/public/cyberia-docs/ENTITY-PROFILE.md +241 -0
  261. package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +300 -0
  262. package/src/client/public/cyberia-docs/OFF-CHAIN-ECONOMY.md +279 -0
  263. package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +206 -0
  264. package/src/client/public/cyberia-docs/ROADMAP.md +240 -0
  265. package/src/client/public/cyberia-docs/UNDERPOST-PLATFORM.md +106 -0
  266. package/src/client/public/cyberia-docs/WHITE-PAPER.md +732 -0
  267. package/src/client/services/atlas-sprite-sheet/atlas-sprite-sheet.service.js +14 -20
  268. package/src/client/services/core/core.service.js +17 -49
  269. package/src/client/services/crypto/crypto.service.js +8 -13
  270. package/src/client/services/cyberia-action/cyberia-action.service.js +99 -0
  271. package/src/client/services/cyberia-client-hints/cyberia-client-hints.service.js +99 -0
  272. package/src/client/services/cyberia-dialogue/cyberia-dialogue.service.js +10 -16
  273. package/src/client/services/cyberia-entity/cyberia-entity.management.js +5 -5
  274. package/src/client/services/cyberia-entity/cyberia-entity.service.js +10 -16
  275. package/src/client/services/cyberia-instance/cyberia-instance.management.js +6 -6
  276. package/src/client/services/cyberia-instance/cyberia-instance.service.js +12 -18
  277. package/src/client/services/cyberia-instance-conf/cyberia-instance-conf.service.js +10 -16
  278. package/src/client/services/cyberia-map/cyberia-map.management.js +6 -6
  279. package/src/client/services/cyberia-map/cyberia-map.service.js +12 -18
  280. package/src/client/services/cyberia-quest/cyberia-quest.service.js +99 -0
  281. package/src/client/services/cyberia-quest-progress/cyberia-quest-progress.service.js +99 -0
  282. package/src/client/services/default/default.management.js +159 -267
  283. package/src/client/services/default/default.service.js +10 -16
  284. package/src/client/services/document/document.service.js +14 -19
  285. package/src/client/services/file/file.service.js +8 -13
  286. package/src/client/services/instance/instance.management.js +5 -5
  287. package/src/client/services/instance/instance.service.js +10 -15
  288. package/src/client/services/ipfs/ipfs.service.js +12 -18
  289. package/src/client/services/object-layer/object-layer.management.js +12 -12
  290. package/src/client/services/object-layer/object-layer.service.js +20 -26
  291. package/src/client/services/object-layer-render-frames/object-layer-render-frames.service.js +10 -16
  292. package/src/client/services/test/test.service.js +8 -13
  293. package/src/client/services/user/guest.service.js +86 -0
  294. package/src/client/services/user/user.management.js +5 -5
  295. package/src/client/services/user/user.service.js +14 -20
  296. package/src/client/ssr/body/404.js +3 -3
  297. package/src/client/ssr/body/500.js +3 -3
  298. package/src/client/ssr/body/CacheControl.js +5 -2
  299. package/src/client/ssr/body/DefaultSplashScreen.js +19 -12
  300. package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +13 -6
  301. package/src/client/ssr/head/PwaItemledger.js +197 -60
  302. package/src/client/ssr/mailer/DefaultRecoverEmail.js +19 -20
  303. package/src/client/ssr/mailer/DefaultVerifyEmail.js +15 -16
  304. package/src/client/ssr/views/CyberiaServerMetrics.js +982 -0
  305. package/src/client/ssr/{offline → views}/Maintenance.js +12 -11
  306. package/src/client/ssr/{offline → views}/NoNetworkConnection.js +3 -3
  307. package/src/client/ssr/{pages → views}/Test.js +2 -2
  308. package/src/client/sw/core.sw.js +274 -0
  309. package/src/db/DataBaseProvider.js +115 -15
  310. package/src/db/mariadb/MariaDB.js +2 -1
  311. package/src/db/mongo/MongoBootstrap.js +657 -0
  312. package/src/db/mongo/MongooseDB.js +129 -21
  313. package/src/grpc/cyberia/grpc-server.js +185 -105
  314. package/src/index.js +1 -1
  315. package/src/runtime/cyberia-client/Dockerfile +101 -0
  316. package/src/runtime/cyberia-client/Dockerfile.dev +82 -0
  317. package/src/runtime/cyberia-server/Dockerfile +62 -0
  318. package/src/runtime/cyberia-server/Dockerfile.dev +71 -0
  319. package/src/runtime/express/Dockerfile +4 -4
  320. package/src/runtime/express/Express.js +2 -2
  321. package/src/runtime/lampp/Dockerfile +8 -7
  322. package/src/runtime/wp/Dockerfile +11 -17
  323. package/src/runtime/wp/Wp.js +8 -5
  324. package/src/server/atlas-sprite-sheet-generator.js +4 -2
  325. package/src/server/auth.js +2 -2
  326. package/src/server/client-build-docs.js +46 -47
  327. package/src/server/client-build.js +371 -132
  328. package/src/server/client-formatted.js +47 -16
  329. package/src/server/conf.js +91 -87
  330. package/src/server/data-query.js +32 -20
  331. package/src/server/dns.js +22 -0
  332. package/src/server/ipfs-client.js +232 -91
  333. package/src/server/object-layer.js +1 -6
  334. package/src/server/process.js +192 -45
  335. package/src/server/proxy.js +9 -2
  336. package/src/server/runtime.js +1 -1
  337. package/src/server/semantic-layer-generator-floor.js +11 -51
  338. package/src/server/semantic-layer-generator-resource.js +259 -0
  339. package/src/server/semantic-layer-generator-skin.js +41 -171
  340. package/src/server/semantic-layer-generator.js +122 -14
  341. package/src/server/shape-generator.js +108 -0
  342. package/src/server/start.js +34 -8
  343. package/src/server/valkey.js +143 -235
  344. package/src/ws/IoInterface.js +16 -16
  345. package/src/ws/core/channels/core.ws.chat.js +11 -11
  346. package/src/ws/core/channels/core.ws.mailer.js +29 -29
  347. package/src/ws/core/channels/core.ws.stream.js +19 -19
  348. package/src/ws/core/core.ws.connection.js +8 -8
  349. package/src/ws/core/core.ws.server.js +6 -5
  350. package/src/ws/default/channels/default.ws.main.js +10 -10
  351. package/src/ws/default/default.ws.connection.js +4 -4
  352. package/src/ws/default/default.ws.server.js +4 -3
  353. package/tsconfig.docs.json +15 -0
  354. package/typedoc.dd-cyberia.json +29 -0
  355. package/typedoc.json +29 -0
  356. package/WHITE-PAPER.md +0 -1540
  357. package/bin/file.js +0 -196
  358. package/bin/vs.js +0 -74
  359. package/bin/zed.js +0 -84
  360. package/hardhat/README.md +0 -531
  361. package/hardhat/WHITE-PAPER.md +0 -1540
  362. package/jsdoc.dd-cyberia.json +0 -68
  363. package/jsdoc.json +0 -68
  364. package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +0 -413
  365. package/src/api/object-layer/README.md +0 -672
  366. package/src/client/components/core/ColorPalette.js +0 -5267
  367. package/src/client/components/core/JoyStick.js +0 -80
  368. package/src/client/components/cryptokoyn/RoutesCryptokoyn.js +0 -39
  369. package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +0 -223
  370. package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +0 -62
  371. package/src/client/components/cyberia-portal/ServerCyberiaPortal.js +0 -136
  372. package/src/client/components/default/RoutesDefault.js +0 -49
  373. package/src/client/components/itemledger/RoutesItemledger.js +0 -40
  374. package/src/client/components/underpost/RoutesUnderpost.js +0 -47
  375. package/src/client/ssr/email/DefaultRecoverEmail.js +0 -21
  376. package/src/client/ssr/email/DefaultVerifyEmail.js +0 -17
  377. package/src/client/ssr/pages/CyberiaServerMetrics.js +0 -461
  378. package/src/client/sw/default.sw.js +0 -127
  379. package/src/client/sw/template.sw.js +0 -84
  380. package/src/grpc/cyberia/OFF_CHAIN_ECONOMY.md +0 -305
  381. package/src/grpc/cyberia/README.md +0 -326
@@ -1,20 +1,26 @@
1
1
  import { loggerFactory } from '../../server/logger.js';
2
2
  import { CryptoController } from './crypto.controller.js';
3
3
  import express from 'express';
4
+
4
5
  const logger = loggerFactory(import.meta);
5
6
 
6
- const CryptoRouter = (options) => {
7
- const router = express.Router();
8
- const authMiddleware = options.authMiddleware;
9
- router.post(`/:id`, async (req, res) => await CryptoController.post(req, res, options));
10
- router.post(`/`, authMiddleware, async (req, res) => await CryptoController.post(req, res, options));
11
- router.get(`/:id`, async (req, res) => await CryptoController.get(req, res, options));
12
- router.get(`/`, async (req, res) => await CryptoController.get(req, res, options));
13
- router.delete(`/:id`, async (req, res) => await CryptoController.delete(req, res, options));
14
- router.delete(`/`, async (req, res) => await CryptoController.delete(req, res, options));
15
- return router;
16
- };
7
+ class CryptoRouter {
8
+ /**
9
+ * @param {import('../types.js').RouterOptions} options
10
+ * @returns {import('express').Router}
11
+ */
12
+ static router(options) {
13
+ const router = express.Router();
14
+ router.post(`/:id`, async (req, res) => await CryptoController.post(req, res, options));
15
+ router.post(`/`, options.authMiddleware, async (req, res) => await CryptoController.post(req, res, options));
16
+ router.get(`/:id`, async (req, res) => await CryptoController.get(req, res, options));
17
+ router.get(`/`, async (req, res) => await CryptoController.get(req, res, options));
18
+ router.delete(`/:id`, async (req, res) => await CryptoController.delete(req, res, options));
19
+ router.delete(`/`, async (req, res) => await CryptoController.delete(req, res, options));
20
+ return router;
21
+ }
22
+ }
17
23
 
18
- const ApiRouter = CryptoRouter;
24
+ const ApiRouter = (options) => CryptoRouter.router(options);
19
25
 
20
26
  export { ApiRouter, CryptoRouter };
@@ -1,14 +1,14 @@
1
1
  import { loggerFactory } from '../../server/logger.js';
2
2
  import crypto from 'crypto';
3
- import { DataBaseProvider } from '../../db/DataBaseProvider.js';
3
+ import { DataBaseProviderService } from '../../db/DataBaseProvider.js';
4
4
  const logger = loggerFactory(import.meta);
5
5
 
6
- const CryptoService = {
7
- post: async (req, res, options) => {
6
+ class CryptoService {
7
+ static post = async (req, res, options) => {
8
8
  /** @type {import('./crypto.model.js').CryptoModel} */
9
- const Crypto = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.Crypto;
9
+ const Crypto = DataBaseProviderService.getModel("Crypto", options);
10
10
  /** @type {import('../user/user.model.js').UserModel} */
11
- const User = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.User;
11
+ const User = DataBaseProviderService.getModel("User", options);
12
12
 
13
13
  switch (req.params.id) {
14
14
  case 'verify': {
@@ -48,17 +48,17 @@ const CryptoService = {
48
48
  return publicKey;
49
49
  }
50
50
  }
51
- },
52
- get: async (req, res, options) => {
51
+ };
52
+ static get = async (req, res, options) => {
53
53
  switch (req.params.id) {
54
54
  default:
55
55
  }
56
- },
57
- delete: async (req, res, options) => {
56
+ };
57
+ static delete = async (req, res, options) => {
58
58
  switch (req.params.id) {
59
59
  default:
60
60
  }
61
- },
62
- };
61
+ };
62
+ }
63
63
 
64
64
  export { CryptoService };
@@ -0,0 +1,74 @@
1
+ import { loggerFactory } from '../../server/logger.js';
2
+ import { CyberiaActionService } from './cyberia-action.service.js';
3
+
4
+ const logger = loggerFactory(import.meta);
5
+
6
+ class CyberiaActionController {
7
+ static post = async (req, res, options) => {
8
+ try {
9
+ const result = await CyberiaActionService.post(req, res, options);
10
+ return res.status(200).json({
11
+ status: 'success',
12
+ data: result,
13
+ });
14
+ } catch (error) {
15
+ logger.error(error, error.stack);
16
+ return res.status(400).json({
17
+ status: 'error',
18
+ message: error.message,
19
+ });
20
+ }
21
+ };
22
+ static get = async (req, res, options) => {
23
+ try {
24
+ const { page, limit } = req.query;
25
+ const result = await CyberiaActionService.get(
26
+ { ...req, query: { ...req.query, page: parseInt(page), limit: parseInt(limit) } },
27
+ res,
28
+ options,
29
+ );
30
+ return res.status(200).json({
31
+ status: 'success',
32
+ data: result,
33
+ });
34
+ } catch (error) {
35
+ logger.error(error, error.stack);
36
+ return res.status(400).json({
37
+ status: 'error',
38
+ message: error.message,
39
+ });
40
+ }
41
+ };
42
+ static put = async (req, res, options) => {
43
+ try {
44
+ const result = await CyberiaActionService.put(req, res, options);
45
+ return res.status(200).json({
46
+ status: 'success',
47
+ data: result,
48
+ });
49
+ } catch (error) {
50
+ logger.error(error, error.stack);
51
+ return res.status(400).json({
52
+ status: 'error',
53
+ message: error.message,
54
+ });
55
+ }
56
+ };
57
+ static delete = async (req, res, options) => {
58
+ try {
59
+ const result = await CyberiaActionService.delete(req, res, options);
60
+ return res.status(200).json({
61
+ status: 'success',
62
+ data: result,
63
+ });
64
+ } catch (error) {
65
+ logger.error(error, error.stack);
66
+ return res.status(400).json({
67
+ status: 'error',
68
+ message: error.message,
69
+ });
70
+ }
71
+ };
72
+ }
73
+
74
+ export { CyberiaActionController };
@@ -0,0 +1,87 @@
1
+ import { Schema, model } from 'mongoose';
2
+ import { CYBERIA_ACTION_TYPES } from '../../client/components/cyberia/SharedDefaultsCyberia.js';
3
+
4
+ // https://mongoosejs.com/docs/2.7.x/docs/schematypes.html
5
+
6
+ const CyberiaActionSchema = new Schema(
7
+ {
8
+ // Spatial origin: the NPC/entity cell that provides this action.
9
+ // Matched against map entity initCellX/initCellY during instance init
10
+ // and assignable from ObjectLayerEngineModal.
11
+ sourceMapCode: { type: String, trim: true },
12
+ sourceCellX: { type: Number },
13
+ sourceCellY: { type: Number },
14
+
15
+ // ── Identity ──────────────────────────────────────────────────────────
16
+ code: { type: String, required: true, trim: true },
17
+ type: {
18
+ type: String,
19
+ required: true,
20
+ trim: true,
21
+ enum: CYBERIA_ACTION_TYPES,
22
+ },
23
+ label: { type: String, trim: true, default: '' },
24
+
25
+ // The item ID of the NPC/entity that provides this action.
26
+ // Used to match 'talk' quest objectives: a step with { type: 'talk', itemId: X }
27
+ // is satisfied when the player triggers an action where provideItemId === X.
28
+ // Typically the entity's active skin ObjectLayer item ID (e.g. 'wason', 'alex').
29
+ provideItemId: { type: String, trim: true, default: '' },
30
+
31
+ // Quest code granted to the player on their first interaction with this action.
32
+ // Used by 'quest-talk' NPCs to start a quest chain on first contact.
33
+ // Empty string = no quest granted.
34
+ grantQuestCode: { type: String, trim: true, default: '' },
35
+
36
+ // ── Dialogue ──────────────────────────────────────────────────────────
37
+ // General greeting/intro dialogue shown when the action button is tapped.
38
+ dialogCode: { type: String, trim: true, default: '' },
39
+
40
+ // Ordered list of CyberiaDialogue codes the player must view to satisfy
41
+ // a 'talk' quest objective linked to this action via provideItemId.
42
+ // For simple actions this may match dialogCode; for multi-stage NPCs it can diverge.
43
+ questDialogueCodes: [{ type: String, trim: true }],
44
+
45
+ // ── Shop payload (type="shop") ─────────────────────────────────────────
46
+ shopItems: [
47
+ {
48
+ itemId: { type: String, required: true, trim: true },
49
+ priceItemId: { type: String, default: 'coin', trim: true },
50
+ priceQty: { type: Number, default: 1, min: 0 },
51
+ },
52
+ ],
53
+
54
+ // ── Craft payload (type="craft") ───────────────────────────────────────
55
+ craftRecipes: [
56
+ {
57
+ outputItems: [
58
+ {
59
+ itemId: { type: String, required: true, trim: true },
60
+ qty: { type: Number, default: 1, min: 1 },
61
+ },
62
+ ],
63
+ ingredients: [
64
+ {
65
+ itemId: { type: String, required: true, trim: true },
66
+ qty: { type: Number, default: 1, min: 1 },
67
+ },
68
+ ],
69
+ },
70
+ ],
71
+
72
+ // ── Storage payload (type="storage") ──────────────────────────────────
73
+ storageSlots: { type: Number, default: 0, min: 0 },
74
+ },
75
+ { timestamps: true },
76
+ );
77
+
78
+ CyberiaActionSchema.index({ code: 1 }, { unique: true });
79
+ CyberiaActionSchema.index({ provideItemId: 1 });
80
+ CyberiaActionSchema.index({ grantQuestCode: 1 }, { sparse: true });
81
+ CyberiaActionSchema.index({ sourceMapCode: 1, sourceCellX: 1, sourceCellY: 1 });
82
+
83
+ const CyberiaActionModel = model('CyberiaAction', CyberiaActionSchema);
84
+
85
+ const ProviderSchema = CyberiaActionSchema;
86
+
87
+ export { CyberiaActionSchema, CyberiaActionModel, ProviderSchema };
@@ -0,0 +1,31 @@
1
+ import { loggerFactory } from '../../server/logger.js';
2
+ import { CyberiaActionController } from './cyberia-action.controller.js';
3
+ import express from 'express';
4
+
5
+ const logger = loggerFactory(import.meta);
6
+
7
+ class CyberiaActionRouter {
8
+ /**
9
+ * @param {import('../types.js').RouterOptions} options
10
+ * @returns {import('express').Router}
11
+ */
12
+ static router(options) {
13
+ const router = express.Router();
14
+ router.post(`/:id`, async (req, res) => await CyberiaActionController.post(req, res, options));
15
+ router.post(`/`, async (req, res) => await CyberiaActionController.post(req, res, options));
16
+ router.get(`/:id`,
17
+ // options.authMiddleware,
18
+ async (req, res) => await CyberiaActionController.get(req, res, options),
19
+ );
20
+ router.get(`/`, async (req, res) => await CyberiaActionController.get(req, res, options));
21
+ router.put(`/:id`, async (req, res) => await CyberiaActionController.put(req, res, options));
22
+ router.put(`/`, async (req, res) => await CyberiaActionController.put(req, res, options));
23
+ router.delete(`/:id`, async (req, res) => await CyberiaActionController.delete(req, res, options));
24
+ router.delete(`/`, async (req, res) => await CyberiaActionController.delete(req, res, options));
25
+ return router;
26
+ }
27
+ }
28
+
29
+ const ApiRouter = (options) => CyberiaActionRouter.router(options);
30
+
31
+ export { ApiRouter, CyberiaActionRouter };
@@ -0,0 +1,42 @@
1
+ import { DataBaseProviderService } from '../../db/DataBaseProvider.js';
2
+ import { loggerFactory } from '../../server/logger.js';
3
+ import { DataQuery } from '../../server/data-query.js';
4
+
5
+ const logger = loggerFactory(import.meta);
6
+
7
+ class CyberiaActionService {
8
+ static post = async (req, res, options) => {
9
+ /** @type {import('./cyberia-action.model.js').CyberiaActionModel} */
10
+ const CyberiaAction = DataBaseProviderService.getModel("CyberiaAction", options);
11
+ return await new CyberiaAction(req.body).save();
12
+ };
13
+ static get = async (req, res, options) => {
14
+ /** @type {import('./cyberia-action.model.js').CyberiaActionModel} */
15
+ const CyberiaAction = DataBaseProviderService.getModel("CyberiaAction", options);
16
+ if (req.params.id) return await CyberiaAction.findById(req.params.id);
17
+
18
+ // Parse query parameters using DataQuery helper
19
+ const { query, sort, skip, limit, page } = DataQuery.parse(req.query);
20
+
21
+ const [data, total] = await Promise.all([
22
+ CyberiaAction.find(query).sort(sort).limit(limit).skip(skip),
23
+ CyberiaAction.countDocuments(query),
24
+ ]);
25
+
26
+ const totalPages = Math.ceil(total / limit);
27
+ return { data, total, page, totalPages };
28
+ };
29
+ static put = async (req, res, options) => {
30
+ /** @type {import('./cyberia-action.model.js').CyberiaActionModel} */
31
+ const CyberiaAction = DataBaseProviderService.getModel("CyberiaAction", options);
32
+ return await CyberiaAction.findByIdAndUpdate(req.params.id, req.body);
33
+ };
34
+ static delete = async (req, res, options) => {
35
+ /** @type {import('./cyberia-action.model.js').CyberiaActionModel} */
36
+ const CyberiaAction = DataBaseProviderService.getModel("CyberiaAction", options);
37
+ if (req.params.id) return await CyberiaAction.findByIdAndDelete(req.params.id);
38
+ else return await CyberiaAction.deleteMany();
39
+ };
40
+ }
41
+
42
+ export { CyberiaActionService };
@@ -0,0 +1,74 @@
1
+ import { loggerFactory } from '../../server/logger.js';
2
+ import { CyberiaClientHintsService } from './cyberia-client-hints.service.js';
3
+
4
+ const logger = loggerFactory(import.meta);
5
+
6
+ class CyberiaClientHintsController {
7
+ static post = async (req, res, options) => {
8
+ try {
9
+ const result = await CyberiaClientHintsService.post(req, res, options);
10
+ return res.status(200).json({
11
+ status: 'success',
12
+ data: result,
13
+ });
14
+ } catch (error) {
15
+ logger.error(error, error.stack);
16
+ return res.status(400).json({
17
+ status: 'error',
18
+ message: error.message,
19
+ });
20
+ }
21
+ };
22
+ static get = async (req, res, options) => {
23
+ try {
24
+ const { page, limit } = req.query;
25
+ const result = await CyberiaClientHintsService.get(
26
+ { ...req, query: { ...req.query, page: parseInt(page), limit: parseInt(limit) } },
27
+ res,
28
+ options,
29
+ );
30
+ return res.status(200).json({
31
+ status: 'success',
32
+ data: result,
33
+ });
34
+ } catch (error) {
35
+ logger.error(error, error.stack);
36
+ return res.status(400).json({
37
+ status: 'error',
38
+ message: error.message,
39
+ });
40
+ }
41
+ };
42
+ static put = async (req, res, options) => {
43
+ try {
44
+ const result = await CyberiaClientHintsService.put(req, res, options);
45
+ return res.status(200).json({
46
+ status: 'success',
47
+ data: result,
48
+ });
49
+ } catch (error) {
50
+ logger.error(error, error.stack);
51
+ return res.status(400).json({
52
+ status: 'error',
53
+ message: error.message,
54
+ });
55
+ }
56
+ };
57
+ static delete = async (req, res, options) => {
58
+ try {
59
+ const result = await CyberiaClientHintsService.delete(req, res, options);
60
+ return res.status(200).json({
61
+ status: 'success',
62
+ data: result,
63
+ });
64
+ } catch (error) {
65
+ logger.error(error, error.stack);
66
+ return res.status(400).json({
67
+ status: 'error',
68
+ message: error.message,
69
+ });
70
+ }
71
+ };
72
+ }
73
+
74
+ export { CyberiaClientHintsController };
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Mongoose model for `CyberiaClientHints`.
3
+ *
4
+ * Dedicated collection for per-instance presentation overrides.
5
+ *
6
+ * Ownership:
7
+ * - Read by: cyberia-client (via /api/cyberia-client-hints/:code), CMS UIs.
8
+ * - Written by: CMS / editor flows. The Cyberia simulation server
9
+ * never reads or writes this collection.
10
+ * - Cacheable: yes — the service layer keeps an in-memory TTL cache.
11
+ *
12
+ * Schema scope: purely visual fields. Anything that influences simulation
13
+ * belongs in `CyberiaInstanceConf`.
14
+ *
15
+ * @module src/api/cyberia-client-hints/cyberia-client-hints.model.js
16
+ */
17
+
18
+ import { Schema, model } from 'mongoose';
19
+
20
+ const ColorRgbaSchema = new Schema(
21
+ {
22
+ r: { type: Number, default: 0 },
23
+ g: { type: Number, default: 0 },
24
+ b: { type: Number, default: 0 },
25
+ a: { type: Number, default: 255 },
26
+ },
27
+ { _id: false },
28
+ );
29
+
30
+ const PaletteEntrySchema = new Schema(
31
+ {
32
+ key: { type: String, required: true },
33
+ r: { type: Number, default: 0 },
34
+ g: { type: Number, default: 0 },
35
+ b: { type: Number, default: 0 },
36
+ a: { type: Number, default: 255 },
37
+ },
38
+ { _id: false },
39
+ );
40
+
41
+ const StatusIconHintSchema = new Schema(
42
+ {
43
+ id: { type: Number, required: true },
44
+ iconId: { type: String, default: '' },
45
+ bounce: { type: Boolean, default: false },
46
+ borderColor: { type: ColorRgbaSchema, default: () => ({ r: 100, g: 100, b: 100, a: 200 }) },
47
+ },
48
+ { _id: false },
49
+ );
50
+
51
+ const EntityColorKeySchema = new Schema(
52
+ {
53
+ entityType: { type: String, required: true },
54
+ colorKey: { type: String, required: true },
55
+ },
56
+ { _id: false },
57
+ );
58
+
59
+ const CyberiaClientHintsSchema = new Schema(
60
+ {
61
+ // Instance code this hint set is scoped to. Matches CyberiaInstance.code
62
+ // and CyberiaInstanceConf.instanceCode. Indexed and unique to make the
63
+ // service-layer cache a 1-to-1 keyed lookup.
64
+ code: { type: String, required: true, unique: true, index: true },
65
+
66
+ // Optional palette overrides. Keys not present here fall back to the
67
+ // client's compile-time defaults.
68
+ palette: { type: [PaletteEntrySchema], default: [] },
69
+
70
+ // Optional per-entity-type color-key overrides.
71
+ entityColorKeys: { type: [EntityColorKeySchema], default: [] },
72
+
73
+ // Optional status-icon visual overrides (id → iconId + borderColor).
74
+ statusIcons: { type: [StatusIconHintSchema], default: [] },
75
+
76
+ // Camera, viewport, and cell-sizing tunings — null/undefined means
77
+ // "use the SharedDefaultsCyberia.RENDER_DEFAULTS value".
78
+ cellSize: { type: Number, default: null },
79
+ defaultObjWidth: { type: Number, default: null },
80
+ defaultObjHeight: { type: Number, default: null },
81
+ cameraSmoothing: { type: Number, default: null },
82
+ cameraZoom: { type: Number, default: null },
83
+ defaultWidthScreenFactor: { type: Number, default: null },
84
+ defaultHeightScreenFactor: { type: Number, default: null },
85
+ interpolationMs: { type: Number, default: null },
86
+ devUi: { type: Boolean, default: null },
87
+ },
88
+ { timestamps: true },
89
+ );
90
+
91
+ const CyberiaClientHintsModel = model('CyberiaClientHints', CyberiaClientHintsSchema);
92
+
93
+ const ProviderSchema = CyberiaClientHintsSchema;
94
+
95
+ export {
96
+ CyberiaClientHintsSchema,
97
+ CyberiaClientHintsModel,
98
+ ProviderSchema,
99
+ };
@@ -0,0 +1,98 @@
1
+ /**
2
+ * @module src/api/cyberia-client-hints
3
+ *
4
+ * Client presentation hints — read-only REST endpoint.
5
+ *
6
+ * Purpose
7
+ * -------
8
+ * The cyberia-server (Go authoritative simulation) and the WS init payload
9
+ * carry *only* simulation contracts. Client-render policy (palette, camera
10
+ * defaults, status-icon visuals, interpolation window, dev-overlay flag)
11
+ * lives off the simulation path entirely.
12
+ *
13
+ * This endpoint exposes optional per-instance overrides of those values.
14
+ * The client is required to function with no calls to this endpoint at
15
+ * all (it ships built-in defaults that match the canonical engine
16
+ * defaults 1-to-1 — see cyberia-client/src/domain/presentation_defaults.h).
17
+ *
18
+ * Endpoint
19
+ * --------
20
+ * GET /api/cyberia-client-hints/:instanceCode
21
+ * -> 200 { palette, entityColorKeys, statusIcons, cameraSmoothing,
22
+ * cameraZoom, defaultWidthScreenFactor,
23
+ * defaultHeightScreenFactor, interpolationMs, devUi }
24
+ * -> 404 if no instance with that code exists in the database — the
25
+ * client falls back to its built-in defaults on 404 (this is
26
+ * the normal path for stateless servers / fresh deployments).
27
+ *
28
+ * GET /api/cyberia-client-hints/
29
+ * -> 200 canonical defaults — same shape as above, no DB read.
30
+ *
31
+ * What it intentionally does NOT do
32
+ * ---------------------------------
33
+ * - It does not touch gameplay state (no entity, map, economy, skill,
34
+ * equipment, or stat fields).
35
+ * - It is not consumed by cyberia-server; the Go process never calls
36
+ * this endpoint.
37
+ * - It is not authenticated. Presentation hints are not secret.
38
+ */
39
+
40
+ import express from 'express';
41
+ import { loggerFactory } from '../../server/logger.js';
42
+ import { CYBERIA_CLIENT_HINTS_DEFAULTS } from '../../client/components/cyberia/SharedDefaultsCyberia.js';
43
+ import { resolveClientHints } from './cyberia-client-hints.service.js';
44
+
45
+ const logger = loggerFactory(import.meta);
46
+
47
+ class CyberiaClientHintsRouter {
48
+ /**
49
+ * @param {import('../types.js').RouterOptions} options
50
+ * @returns {import('express').Router}
51
+ */
52
+ static router(options) {
53
+ const router = express.Router();
54
+
55
+ // GET /:code -> resolved hints.
56
+ // Resolution order is documented in cyberia-client-hints.service.js:
57
+ // 1. In-memory TTL cache.
58
+ // 2. CyberiaClientHints collection (preferred).
59
+ // 3. Legacy presentation fields on CyberiaInstanceConf (back-compat).
60
+ // 4. Canonical client defaults (never cached so a later DB insert wins).
61
+ router.get('/:code', async (req, res) => {
62
+ try {
63
+ if (req && req.headers && req.headers.origin) {
64
+ res.set('Access-Control-Allow-Origin', req.headers.origin);
65
+ } else res.setHeader('Access-Control-Allow-Origin', '*');
66
+ res.setHeader('Cross-Origin-Resource-Policy', 'cross-origin');
67
+ const { data, source } = await resolveClientHints(req.params.code, {
68
+ host: options.host || 'default',
69
+ path: options.path || '/',
70
+ });
71
+ // Surface the resolution source as a non-authoritative header so
72
+ // operators can see whether the runtime fetched from the new
73
+ // collection, the compatibility read on instance-conf, the cache, or defaults.
74
+ res.setHeader('X-Cyberia-Hints-Source', source);
75
+ return res.status(200).json({ status: 'success', data });
76
+ } catch (err) {
77
+ logger.error('cyberia-client-hints GET failed:', err);
78
+ return res.status(500).json({ status: 'error', message: err.message });
79
+ }
80
+ });
81
+
82
+ // GET / -> canonical defaults. No DB read. Documentation/diagnostic.
83
+ router.get('/', async (_req, res) => {
84
+ if (_req && _req.headers && _req.headers.origin) {
85
+ res.set('Access-Control-Allow-Origin', _req.headers.origin);
86
+ } else res.setHeader('Access-Control-Allow-Origin', '*');
87
+ res.setHeader('Cross-Origin-Resource-Policy', 'cross-origin');
88
+ res.setHeader('X-Cyberia-Hints-Source', 'defaults');
89
+ return res.status(200).json({ status: 'success', data: CYBERIA_CLIENT_HINTS_DEFAULTS });
90
+ });
91
+
92
+ return router;
93
+ }
94
+ }
95
+
96
+ const ApiRouter = (options) => CyberiaClientHintsRouter.router(options);
97
+
98
+ export { ApiRouter, CyberiaClientHintsRouter };