cyberia 3.2.12 → 3.2.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. package/.env.example +127 -68
  2. package/.github/workflows/cyberia-client.cd.yml +40 -0
  3. package/.github/workflows/cyberia-server.cd.yml +40 -0
  4. package/.github/workflows/docker-image.cyberia-client.ci.yml +49 -0
  5. package/.github/workflows/docker-image.cyberia-client.dev.ci.yml +48 -0
  6. package/.github/workflows/docker-image.cyberia-server.ci.yml +69 -0
  7. package/.github/workflows/docker-image.cyberia-server.dev.ci.yml +69 -0
  8. package/.github/workflows/docker-image.engine-cyberia.ci.yml +52 -0
  9. package/.github/workflows/docker-image.engine-cyberia.dev.ci.yml +52 -0
  10. package/.github/workflows/engine-cyberia.cd.yml +34 -24
  11. package/.github/workflows/engine-cyberia.ci.yml +27 -5
  12. package/.github/workflows/ghpkg.ci.yml +89 -1
  13. package/.github/workflows/gitlab.ci.yml +1 -1
  14. package/.github/workflows/hardhat.ci.yml +1 -1
  15. package/.github/workflows/npmpkg.ci.yml +19 -12
  16. package/.github/workflows/publish.ci.yml +2 -2
  17. package/.github/workflows/publish.cyberia.ci.yml +5 -16
  18. package/.github/workflows/pwa-microservices-template-page.cd.yml +1 -8
  19. package/.github/workflows/pwa-microservices-template-test.ci.yml +1 -1
  20. package/CHANGELOG.md +451 -1
  21. package/CLI-HELP.md +1040 -1130
  22. package/Dockerfile +141 -43
  23. package/Dockerfile.dev +143 -0
  24. package/Dockerfile.test +165 -0
  25. package/README.md +1 -1
  26. package/baremetal/commission-workflows.json +1 -0
  27. package/bin/build.js +128 -136
  28. package/bin/build.template.js +25 -179
  29. package/bin/cyberia.js +1089 -188
  30. package/bin/deploy.js +6 -3
  31. package/bin/index.js +1089 -188
  32. package/bump.config.js +1 -0
  33. package/compose.env +131 -0
  34. package/conf.js +19 -1
  35. package/deployment.yaml +74 -2
  36. package/docker-compose.yml +316 -0
  37. package/hardhat/hardhat.config.js +2 -2
  38. package/hardhat/package-lock.json +620 -2041
  39. package/hardhat/package.json +7 -5
  40. package/hardhat/scripts/deployObjectLayerToken.js +18 -18
  41. package/hardhat/test/ObjectLayerToken.js +378 -274
  42. package/ipfs/configure-ipfs.sh +13 -0
  43. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +2 -2
  44. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +1 -1
  45. package/manifests/deployment/dd-cyberia-development/deployment.yaml +74 -2
  46. package/manifests/deployment/dd-cyberia-development/grpc-service.yaml +17 -0
  47. package/manifests/deployment/dd-cyberia-development/pv-pvc.yaml +32 -0
  48. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  49. package/mongodb/entrypoint.sh +76 -0
  50. package/nginx.conf +87 -0
  51. package/package.json +34 -22
  52. package/pv-pvc.yaml +32 -0
  53. package/scripts/disk-clean.sh +85 -60
  54. package/scripts/kubeadm-node-setup.sh +317 -0
  55. package/scripts/link-local-underpost-cli.sh +6 -0
  56. package/scripts/rocky-kickstart.sh +877 -185
  57. package/scripts/rpmfusion-ffmpeg-setup.sh +26 -50
  58. package/scripts/test-monitor.sh +248 -0
  59. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +43 -7
  60. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +17 -25
  61. package/src/api/cyberia-action/cyberia-action.controller.js +19 -0
  62. package/src/api/cyberia-action/cyberia-action.model.js +21 -29
  63. package/src/api/cyberia-action/cyberia-action.router.js +42 -7
  64. package/src/api/cyberia-action/cyberia-action.service.js +20 -4
  65. package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +58 -57
  66. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +37 -6
  67. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +8 -2
  68. package/src/api/cyberia-entity/cyberia-entity.router.js +39 -7
  69. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +74 -0
  70. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.model.js +67 -0
  71. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +63 -0
  72. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +46 -0
  73. package/src/api/cyberia-instance/cyberia-fallback-world.js +62 -10
  74. package/src/api/cyberia-instance/cyberia-instance.model.js +32 -2
  75. package/src/api/cyberia-instance/cyberia-instance.router.js +6 -6
  76. package/src/api/cyberia-instance/cyberia-world-generator.js +116 -3
  77. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +3 -0
  78. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +39 -7
  79. package/src/api/cyberia-map/cyberia-map.router.js +21 -6
  80. package/src/api/cyberia-quest/cyberia-quest.controller.js +38 -0
  81. package/src/api/cyberia-quest/cyberia-quest.router.js +47 -7
  82. package/src/api/cyberia-quest/cyberia-quest.service.js +59 -4
  83. package/src/api/cyberia-saga/cyberia-saga.controller.js +74 -0
  84. package/src/api/cyberia-saga/cyberia-saga.model.js +59 -0
  85. package/src/api/cyberia-saga/cyberia-saga.router.js +63 -0
  86. package/src/api/cyberia-saga/cyberia-saga.service.js +42 -0
  87. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +551 -122
  88. package/src/api/cyberia-skill/cyberia-skill.controller.js +74 -0
  89. package/src/api/cyberia-skill/cyberia-skill.model.js +50 -0
  90. package/src/api/cyberia-skill/cyberia-skill.router.js +63 -0
  91. package/src/api/cyberia-skill/cyberia-skill.service.js +42 -0
  92. package/src/api/ipfs/ipfs.service.js +28 -15
  93. package/src/api/object-layer/object-layer.router.js +25 -15
  94. package/src/api/object-layer/object-layer.service.js +15 -20
  95. package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +39 -7
  96. package/src/cli/baremetal.js +717 -16
  97. package/src/cli/cluster.js +80 -5
  98. package/src/cli/deploy.js +326 -292
  99. package/src/cli/docker-compose.js +648 -0
  100. package/src/cli/env.js +12 -6
  101. package/src/cli/fs.js +75 -30
  102. package/src/cli/image.js +187 -55
  103. package/src/cli/index.js +157 -6
  104. package/src/cli/kickstart.js +142 -20
  105. package/src/cli/monitor.js +387 -6
  106. package/src/cli/release.js +72 -15
  107. package/src/cli/repository.js +339 -40
  108. package/src/cli/run.js +678 -186
  109. package/src/cli/secrets.js +82 -48
  110. package/src/cli/ssh.js +234 -0
  111. package/src/cli/static.js +2 -2
  112. package/src/client/components/core/PanelForm.js +44 -44
  113. package/src/client/components/cyberia/ActionEngineCyberia.js +1867 -0
  114. package/src/client/components/cyberia/EntityEngineCyberia.js +585 -0
  115. package/src/client/components/cyberia/InstanceEngineCyberia.js +219 -13
  116. package/src/client/components/cyberia/MapEngineCyberia.js +154 -71
  117. package/src/client/components/cyberia/ObjectLayerEngineModal.js +40 -63
  118. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +34 -20
  119. package/src/client/components/cyberia/SharedDefaultsCyberia.js +195 -4
  120. package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +66 -0
  121. package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +8 -0
  122. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +8 -0
  123. package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +92 -20
  124. package/src/client/public/cyberia-docs/ARCHITECTURE.md +272 -50
  125. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +3 -3
  126. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +39 -22
  127. package/src/client/public/cyberia-docs/CYBERIA-LORE.md +88 -0
  128. package/src/client/public/cyberia-docs/CYBERIA-SAGA.md +394 -0
  129. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +28 -12
  130. package/src/client/public/cyberia-docs/CYBERIA.md +1 -1
  131. package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +27 -5
  132. package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
  133. package/src/client/public/cyberia-docs/WHITE-PAPER.md +1 -1
  134. package/src/client/services/cyberia-entity-type-default/cyberia-entity-type-default.service.js +99 -0
  135. package/src/client/services/cyberia-instance/cyberia-instance.management.js +2 -2
  136. package/src/client/services/cyberia-map/cyberia-map.management.js +2 -2
  137. package/src/client/services/cyberia-saga/cyberia-saga.service.js +99 -0
  138. package/src/client/services/cyberia-skill/cyberia-skill.service.js +99 -0
  139. package/src/client/services/object-layer/object-layer.management.js +6 -6
  140. package/src/{server → client-builder}/client-build-docs.js +15 -5
  141. package/src/{server → client-builder}/client-build-live.js +3 -3
  142. package/src/{server → client-builder}/client-build.js +25 -22
  143. package/src/{server → client-builder}/client-dev-server.js +3 -3
  144. package/src/{server → client-builder}/client-icons.js +2 -2
  145. package/src/{server → client-builder}/ssr.js +5 -5
  146. package/src/client.build.js +1 -3
  147. package/src/client.dev.js +1 -1
  148. package/src/db/mongo/MongoBootstrap.js +12 -12
  149. package/src/db/mongo/MongooseDB.js +2 -1
  150. package/src/grpc/cyberia/grpc-server.js +255 -70
  151. package/src/index.js +12 -1
  152. package/src/mailer/EmailRender.js +1 -1
  153. package/src/{server → projects/cyberia}/atlas-sprite-sheet-generator.js +2 -2
  154. package/src/{server → projects/cyberia}/besu-genesis-generator.js +3 -3
  155. package/src/projects/cyberia/catalog-cyberia.js +81 -0
  156. package/src/projects/cyberia/gemini-client.js +175 -0
  157. package/src/projects/cyberia/generate-saga.js +2107 -0
  158. package/src/{server → projects/cyberia}/ipfs-client.js +6 -4
  159. package/src/{server → projects/cyberia}/object-layer.js +12 -108
  160. package/src/{server → projects/cyberia}/semantic-layer-generator-floor.js +1 -1
  161. package/src/{server → projects/cyberia}/semantic-layer-generator-resource.js +1 -1
  162. package/src/{server → projects/cyberia}/semantic-layer-generator-skin.js +1 -1
  163. package/src/{server → projects/cyberia}/semantic-layer-generator.js +2 -2
  164. package/src/{server → projects/cyberia}/shape-generator.js +2 -2
  165. package/src/projects/underpost/catalog-underpost.js +60 -0
  166. package/src/runtime/cyberia-client/Dockerfile +31 -83
  167. package/src/runtime/cyberia-client/Dockerfile.dev +23 -30
  168. package/src/runtime/cyberia-server/Dockerfile +23 -42
  169. package/src/runtime/cyberia-server/Dockerfile.dev +20 -35
  170. package/src/runtime/engine-cyberia/Dockerfile +143 -0
  171. package/src/runtime/engine-cyberia/Dockerfile.dev +143 -0
  172. package/src/runtime/engine-cyberia/Dockerfile.test +165 -0
  173. package/src/runtime/engine-cyberia/compose.env +131 -0
  174. package/src/runtime/engine-cyberia/docker-compose.yml +316 -0
  175. package/src/runtime/engine-cyberia/ipfs/configure-ipfs.sh +13 -0
  176. package/src/runtime/engine-cyberia/mongodb/entrypoint.sh +76 -0
  177. package/src/runtime/engine-cyberia/nginx.conf +87 -0
  178. package/src/runtime/express/Express.js +2 -2
  179. package/src/runtime/nginx/Nginx.js +250 -0
  180. package/src/runtime/wp/Dockerfile +3 -3
  181. package/src/server/catalog.js +72 -0
  182. package/src/server/conf.js +415 -60
  183. package/src/server/runtime-status.js +252 -0
  184. package/src/server/start.js +42 -11
  185. package/src/server.js +6 -2
  186. package/test/cyberia-instance-conf-defaults.test.js +140 -0
  187. package/test/deploy-monitor.test.js +267 -0
  188. package/test/shape-generator.test.js +7 -1
  189. package/typedoc.dd-cyberia.json +3 -1
  190. package/typedoc.json +3 -1
  191. package/manifests/deployment/dd-test-development/deployment.yaml +0 -256
  192. package/manifests/deployment/dd-test-development/proxy.yaml +0 -102
  193. /package/src/client/ssr/{Render.js → RootDocument.js} +0 -0
  194. /package/src/{server → client-builder}/client-formatted.js +0 -0
@@ -10,7 +10,7 @@ The Quest System is a **chain/tree-structured progression framework** linking NP
10
10
 
11
11
  Quests are defined server-side as MongoDB documents and delivered to the client through the Engine REST API. Progress is tracked per-player in `CyberiaQuestProgress` documents.
12
12
 
13
- > **Implementation status — Pre-alpha:** The Quest and QuestProgress MongoDB schemas and Engine REST API (`src/api/cyberia-quest`, `src/api/cyberia-quest-progress`) are defined and seeded. Go server integration (quest tracking, objective evaluation, reward delivery via FCT) is planned for the **Alpha milestone**. For pre-alpha, quest progress is ephemeral: it lives in the client session only and resets on page reload.
13
+ > **Implementation status — Alpha (talk / collect / kill):** The Quest and QuestProgress MongoDB schemas and Engine REST API (`src/api/cyberia-quest`, `src/api/cyberia-quest-progress`) are defined and seeded. The Go server fetches quest definitions at instance init and evaluates **all three** objective types authoritatively: `talk` (on `dlg_complete`), `kill` (on victim death, matched by the victim's active skin), and `collect` (idempotent inventory reconcile on item/coin gain). It grants quests — gated by `prerequisiteCodes` (AND logic) — advances steps, delivers rewards via FCT, and unlocks successors on completion. Live progress is pushed to the client over the `dlg_ack` envelope outside the dialogue flow. Quest progress is authoritative **per Go session** (in-memory) and best-effort mirrored to `POST /api/cyberia-quest-progress`; it resets on reconnect. The C client surfaces it through the **Quest Journal** and the **action tab** (offer + reward item slots), populated from the engine REST metadata endpoint `GET /api/cyberia-quest/code/:code` (which falls back to the canonical defaults so the procedural fallback world is playable without a seed).
14
14
 
15
15
  ---
16
16
 
@@ -81,9 +81,9 @@ CyberiaQuestProgress {
81
81
 
82
82
  | `type` | `itemId` semantics | Completion trigger |
83
83
  | --------- | -------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
84
- | `collect` | ObjectLayer item ID that must appear in the player's inventory | Player inventory contains `>= quantity` of `itemId` |
85
- | `talk` | `CyberiaAction.provideItemId` of the NPC to interact with | Player triggers a talk action where `provideItemId === itemId` and all `questDialogueCodes` viewed |
86
- | `kill` | Skin item ID of the target entity (e.g. `"wason"`) | Player kills an entity whose active skin matches `itemId` |
84
+ | `collect` | ObjectLayer item ID that must appear in the player's inventory | Player inventory holds `>= quantity` of `itemId` (coins via the flat balance) — reconciled on every gain |
85
+ | `talk` | Active **skin** item ID of the NPC to interact with | Player completes a `dlg_complete` whose NPC active skin `=== itemId` and `dialogCode questDialogueCodes` |
86
+ | `kill` | Skin item ID of the target entity (e.g. `"scp-2040"`) | Player kills an entity whose active skin matches `itemId` |
87
87
 
88
88
  ---
89
89
 
@@ -119,7 +119,7 @@ sequenceDiagram
119
119
  participant E as Engine (Node.js)
120
120
  participant DB as MongoDB
121
121
 
122
- P->>G: Tap NPC with grantQuestCode
122
+ P->>G: Tap NPC + Take Quest (quest_accept) — quest bound to the NPC's cell
123
123
  G->>E: POST /api/cyberia-quest-progress (grant quest)
124
124
  E->>DB: Create CyberiaQuestProgress { status: 'active' }
125
125
  E-->>G: Progress document
@@ -168,6 +168,28 @@ On quest completion, the Engine grants each `rewards[].{itemId, quantity}` to th
168
168
 
169
169
  ---
170
170
 
171
+ ## Quest Journal (client)
172
+
173
+ The C client keeps a local `quest_store` (in `cyberia-client/src/ui/quest_store.c`)
174
+ populated from two server sources — **no extra REST calls**:
175
+
176
+ - `init_data.quests[]` — the player's active/completed snapshot on connect.
177
+ - `dlg_ack.quests[]` — live upserts as quests are granted or completed.
178
+
179
+ The **Quest Journal** modal (`ui/quest_journal.c`) renders this store on the
180
+ right side below the map info modal: a three-section tree (Active / Completed /
181
+ Failed), each section independently collapsible via the shared `ui_toggle`
182
+ component, each with its own 10-per-page pagination cursor. The interaction
183
+ bubble column on the left is collapsible by the same toggle pattern. Both panels
184
+ default collapsed on screens narrower than 600 px. Collapse state is not
185
+ persisted across sessions.
186
+
187
+ Each server quest snapshot entry carries `{ code, title, description, status,
188
+ activeStep, objectivesText }` so the journal can render rows and inline detail
189
+ without re-fetching the quest definition.
190
+
191
+ ---
192
+
171
193
  ## Indexes
172
194
 
173
195
  ```javascript
@@ -1,6 +1,6 @@
1
1
  # Cyberia Online — Development Roadmap
2
2
 
3
- **Current version:** 3.2.12 | **Target milestone:** Open Alpha
3
+ **Current version:** 3.2.70 | **Target milestone:** Open Alpha
4
4
 
5
5
  ---
6
6
 
@@ -18,7 +18,7 @@ _Stackable Rendering Layers as a Unified Tokenized Reality_
18
18
 
19
19
  ---
20
20
 
21
- **Version:** 3.2.12 | **Status:** Draft | **Authors:** Underpost Engineering
21
+ **Version:** 3.2.70 | **Status:** Draft | **Authors:** Underpost Engineering
22
22
 
23
23
  ---
24
24
 
@@ -0,0 +1,99 @@
1
+ import { Auth } from '../../components/core/Auth.js';
2
+ import { loggerFactory } from '../../components/core/Logger.js';
3
+ import { getApiBaseUrl, headersFactory, payloadFactory, buildQueryUrl } from '../core/core.service.js';
4
+ const logger = loggerFactory(import.meta);
5
+ logger.info('Load service');
6
+ const endpoint = 'cyberia-entity-type-default';
7
+ class CyberiaEntityTypeDefaultService {
8
+ static post = (options = { id: '', body: {} }) =>
9
+ new Promise((resolve, reject) =>
10
+ fetch(getApiBaseUrl({ id: options.id, endpoint }), {
11
+ method: 'POST',
12
+ headers: headersFactory(),
13
+ credentials: 'include',
14
+ body: payloadFactory(options.body),
15
+ })
16
+ .then(async (res) => {
17
+ return await res.json();
18
+ })
19
+ .then((res) => {
20
+ logger.info(res);
21
+ return resolve(res);
22
+ })
23
+ .catch((error) => {
24
+ logger.error(error);
25
+ return reject(error);
26
+ }),
27
+ );
28
+ static put = (options = { id: '', body: {} }) =>
29
+ new Promise((resolve, reject) =>
30
+ fetch(getApiBaseUrl({ id: options.id, endpoint }), {
31
+ method: 'PUT',
32
+ headers: headersFactory(),
33
+ credentials: 'include',
34
+ body: payloadFactory(options.body),
35
+ })
36
+ .then(async (res) => {
37
+ return await res.json();
38
+ })
39
+ .then((res) => {
40
+ logger.info(res);
41
+ return resolve(res);
42
+ })
43
+ .catch((error) => {
44
+ logger.error(error);
45
+ return reject(error);
46
+ }),
47
+ );
48
+ static get = (options = {}) => {
49
+ const { id, page, limit, filterModel, sortModel, sort, asc, order } = options;
50
+ const url = buildQueryUrl(getApiBaseUrl({ id, endpoint }), {
51
+ page,
52
+ limit,
53
+ filterModel,
54
+ sortModel,
55
+ sort,
56
+ asc,
57
+ order,
58
+ });
59
+ return new Promise((resolve, reject) =>
60
+ fetch(url.toString(), {
61
+ method: 'GET',
62
+ headers: headersFactory(),
63
+ credentials: 'include',
64
+ })
65
+ .then(async (res) => {
66
+ return await res.json();
67
+ })
68
+ .then((res) => {
69
+ logger.info(res);
70
+ return resolve(res);
71
+ })
72
+ .catch((error) => {
73
+ logger.error(error);
74
+ return reject(error);
75
+ }),
76
+ );
77
+ };
78
+ static delete = (options = { id: '', body: {} }) =>
79
+ new Promise((resolve, reject) =>
80
+ fetch(getApiBaseUrl({ id: options.id, endpoint }), {
81
+ method: 'DELETE',
82
+ headers: headersFactory(),
83
+ credentials: 'include',
84
+ body: payloadFactory(options.body),
85
+ })
86
+ .then(async (res) => {
87
+ return await res.json();
88
+ })
89
+ .then((res) => {
90
+ logger.info(res);
91
+ return resolve(res);
92
+ })
93
+ .catch((error) => {
94
+ logger.error(error);
95
+ return reject(error);
96
+ }),
97
+ );
98
+ }
99
+ export { CyberiaEntityTypeDefaultService };
@@ -1,5 +1,5 @@
1
1
  import { BtnIcon } from '../../components/core/BtnIcon.js';
2
- import { getId, commonUserGuard, commonAdminGuard } from '../../components/core/CommonJs.js';
2
+ import { getId, commonModeratorGuard, commonAdminGuard } from '../../components/core/CommonJs.js';
3
3
  import { EventsUI } from '../../components/core/EventsUI.js';
4
4
  import { NotificationManager } from '../../components/core/NotificationManager.js';
5
5
  import { s } from '../../components/core/VanillaJs.js';
@@ -118,7 +118,7 @@ class CyberiaInstanceManagement {
118
118
  entity: 'cyberia-instance',
119
119
  permissions: {
120
120
  add: false,
121
- remove: commonUserGuard(role),
121
+ remove: commonModeratorGuard(role),
122
122
  reload: true,
123
123
  },
124
124
  usePagination: true,
@@ -1,5 +1,5 @@
1
1
  import { BtnIcon } from '../../components/core/BtnIcon.js';
2
- import { getId, commonUserGuard, commonAdminGuard } from '../../components/core/CommonJs.js';
2
+ import { getId, commonModeratorGuard, commonAdminGuard } from '../../components/core/CommonJs.js';
3
3
  import { EventsUI } from '../../components/core/EventsUI.js';
4
4
  import { NotificationManager } from '../../components/core/NotificationManager.js';
5
5
  import { s } from '../../components/core/VanillaJs.js';
@@ -118,7 +118,7 @@ class CyberiaMapManagement {
118
118
  entity: 'cyberia-map',
119
119
  permissions: {
120
120
  add: false,
121
- remove: commonUserGuard(role),
121
+ remove: commonModeratorGuard(role),
122
122
  reload: true,
123
123
  },
124
124
  usePagination: true,
@@ -0,0 +1,99 @@
1
+ import { Auth } from '../../components/core/Auth.js';
2
+ import { loggerFactory } from '../../components/core/Logger.js';
3
+ import { getApiBaseUrl, headersFactory, payloadFactory, buildQueryUrl } from '../core/core.service.js';
4
+ const logger = loggerFactory(import.meta);
5
+ logger.info('Load service');
6
+ const endpoint = 'cyberia-saga';
7
+ class CyberiaSagaService {
8
+ static post = (options = { id: '', body: {} }) =>
9
+ new Promise((resolve, reject) =>
10
+ fetch(getApiBaseUrl({ id: options.id, endpoint }), {
11
+ method: 'POST',
12
+ headers: headersFactory(),
13
+ credentials: 'include',
14
+ body: payloadFactory(options.body),
15
+ })
16
+ .then(async (res) => {
17
+ return await res.json();
18
+ })
19
+ .then((res) => {
20
+ logger.info(res);
21
+ return resolve(res);
22
+ })
23
+ .catch((error) => {
24
+ logger.error(error);
25
+ return reject(error);
26
+ }),
27
+ );
28
+ static put = (options = { id: '', body: {} }) =>
29
+ new Promise((resolve, reject) =>
30
+ fetch(getApiBaseUrl({ id: options.id, endpoint }), {
31
+ method: 'PUT',
32
+ headers: headersFactory(),
33
+ credentials: 'include',
34
+ body: payloadFactory(options.body),
35
+ })
36
+ .then(async (res) => {
37
+ return await res.json();
38
+ })
39
+ .then((res) => {
40
+ logger.info(res);
41
+ return resolve(res);
42
+ })
43
+ .catch((error) => {
44
+ logger.error(error);
45
+ return reject(error);
46
+ }),
47
+ );
48
+ static get = (options = {}) => {
49
+ const { id, page, limit, filterModel, sortModel, sort, asc, order } = options;
50
+ const url = buildQueryUrl(getApiBaseUrl({ id, endpoint }), {
51
+ page,
52
+ limit,
53
+ filterModel,
54
+ sortModel,
55
+ sort,
56
+ asc,
57
+ order,
58
+ });
59
+ return new Promise((resolve, reject) =>
60
+ fetch(url.toString(), {
61
+ method: 'GET',
62
+ headers: headersFactory(),
63
+ credentials: 'include',
64
+ })
65
+ .then(async (res) => {
66
+ return await res.json();
67
+ })
68
+ .then((res) => {
69
+ logger.info(res);
70
+ return resolve(res);
71
+ })
72
+ .catch((error) => {
73
+ logger.error(error);
74
+ return reject(error);
75
+ }),
76
+ );
77
+ };
78
+ static delete = (options = { id: '', body: {} }) =>
79
+ new Promise((resolve, reject) =>
80
+ fetch(getApiBaseUrl({ id: options.id, endpoint }), {
81
+ method: 'DELETE',
82
+ headers: headersFactory(),
83
+ credentials: 'include',
84
+ body: payloadFactory(options.body),
85
+ })
86
+ .then(async (res) => {
87
+ return await res.json();
88
+ })
89
+ .then((res) => {
90
+ logger.info(res);
91
+ return resolve(res);
92
+ })
93
+ .catch((error) => {
94
+ logger.error(error);
95
+ return reject(error);
96
+ }),
97
+ );
98
+ }
99
+ export { CyberiaSagaService };
@@ -0,0 +1,99 @@
1
+ import { Auth } from '../../components/core/Auth.js';
2
+ import { loggerFactory } from '../../components/core/Logger.js';
3
+ import { getApiBaseUrl, headersFactory, payloadFactory, buildQueryUrl } from '../core/core.service.js';
4
+ const logger = loggerFactory(import.meta);
5
+ logger.info('Load service');
6
+ const endpoint = 'cyberia-skill';
7
+ class CyberiaSkillService {
8
+ static post = (options = { id: '', body: {} }) =>
9
+ new Promise((resolve, reject) =>
10
+ fetch(getApiBaseUrl({ id: options.id, endpoint }), {
11
+ method: 'POST',
12
+ headers: headersFactory(),
13
+ credentials: 'include',
14
+ body: payloadFactory(options.body),
15
+ })
16
+ .then(async (res) => {
17
+ return await res.json();
18
+ })
19
+ .then((res) => {
20
+ logger.info(res);
21
+ return resolve(res);
22
+ })
23
+ .catch((error) => {
24
+ logger.error(error);
25
+ return reject(error);
26
+ }),
27
+ );
28
+ static put = (options = { id: '', body: {} }) =>
29
+ new Promise((resolve, reject) =>
30
+ fetch(getApiBaseUrl({ id: options.id, endpoint }), {
31
+ method: 'PUT',
32
+ headers: headersFactory(),
33
+ credentials: 'include',
34
+ body: payloadFactory(options.body),
35
+ })
36
+ .then(async (res) => {
37
+ return await res.json();
38
+ })
39
+ .then((res) => {
40
+ logger.info(res);
41
+ return resolve(res);
42
+ })
43
+ .catch((error) => {
44
+ logger.error(error);
45
+ return reject(error);
46
+ }),
47
+ );
48
+ static get = (options = {}) => {
49
+ const { id, page, limit, filterModel, sortModel, sort, asc, order } = options;
50
+ const url = buildQueryUrl(getApiBaseUrl({ id, endpoint }), {
51
+ page,
52
+ limit,
53
+ filterModel,
54
+ sortModel,
55
+ sort,
56
+ asc,
57
+ order,
58
+ });
59
+ return new Promise((resolve, reject) =>
60
+ fetch(url.toString(), {
61
+ method: 'GET',
62
+ headers: headersFactory(),
63
+ credentials: 'include',
64
+ })
65
+ .then(async (res) => {
66
+ return await res.json();
67
+ })
68
+ .then((res) => {
69
+ logger.info(res);
70
+ return resolve(res);
71
+ })
72
+ .catch((error) => {
73
+ logger.error(error);
74
+ return reject(error);
75
+ }),
76
+ );
77
+ };
78
+ static delete = (options = { id: '', body: {} }) =>
79
+ new Promise((resolve, reject) =>
80
+ fetch(getApiBaseUrl({ id: options.id, endpoint }), {
81
+ method: 'DELETE',
82
+ headers: headersFactory(),
83
+ credentials: 'include',
84
+ body: payloadFactory(options.body),
85
+ })
86
+ .then(async (res) => {
87
+ return await res.json();
88
+ })
89
+ .then((res) => {
90
+ logger.info(res);
91
+ return resolve(res);
92
+ })
93
+ .catch((error) => {
94
+ logger.error(error);
95
+ return reject(error);
96
+ }),
97
+ );
98
+ }
99
+ export { CyberiaSkillService };
@@ -283,10 +283,10 @@ class ObjectLayerManagement {
283
283
  {
284
284
  field: 'data.item.id',
285
285
  headerName: 'Item ID',
286
- editable: role === 'user',
286
+ editable: commonModeratorGuard(role),
287
287
  },
288
- { field: 'data.item.type', headerName: 'Item Type', editable: role === 'user' },
289
- { field: 'data.item.description', headerName: 'Description', flex: 1, editable: role === 'user' },
288
+ { field: 'data.item.type', headerName: 'Item Type', editable: commonModeratorGuard(role) },
289
+ { field: 'data.item.description', headerName: 'Description', flex: 1, editable: commonModeratorGuard(role) },
290
290
  {
291
291
  field: 'data.ledger.type',
292
292
  headerName: 'Ledger Type',
@@ -306,7 +306,7 @@ class ObjectLayerManagement {
306
306
  },
307
307
  {
308
308
  field: 'data.render.cid',
309
- headerName: 'instance CID',
309
+ headerName: 'render CID',
310
310
  width: 160,
311
311
  cellRenderer: AtlasCidRenderer,
312
312
  editable: false,
@@ -315,7 +315,7 @@ class ObjectLayerManagement {
315
315
  },
316
316
  {
317
317
  field: 'data.render.metadataCid',
318
- headerName: 'instance Metadata CID',
318
+ headerName: 'render Metadata CID',
319
319
  width: 160,
320
320
  cellRenderer: MetadataCidRenderer,
321
321
  editable: false,
@@ -369,7 +369,7 @@ class ObjectLayerManagement {
369
369
  serviceId,
370
370
  entity: 'object-layer',
371
371
  permissions: {
372
- add: commonUserGuard(role),
372
+ add: commonModeratorGuard(role),
373
373
  remove: false,
374
374
  reload: commonUserGuard(role),
375
375
  },
@@ -2,13 +2,13 @@
2
2
 
3
3
  /**
4
4
  * Module for building project documentation (JSDoc, Swagger, Coverage).
5
- * @module src/server/client-build-docs.js
5
+ * @module src/client-builder/client-build-docs.js
6
6
  * @namespace clientBuildDocs
7
7
  */
8
8
 
9
9
  import fs from 'fs-extra';
10
- import { shellExec } from './process.js';
11
- import { loggerFactory } from './logger.js';
10
+ import { shellExec } from '../server/process.js';
11
+ import { loggerFactory } from '../server/logger.js';
12
12
  import { JSONweb } from './client-formatted.js';
13
13
  import { ssrFactory } from './ssr.js';
14
14
 
@@ -396,10 +396,20 @@ const buildCoverage = async ({ docs, docsDestination }) => {
396
396
  const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
397
397
  if (pkg.scripts && pkg.scripts.coverage) {
398
398
  logger.info('generating coverage report', coveragePath);
399
- shellExec(`cd ${coveragePath} && npm run coverage`, { silent: true });
399
+ try {
400
+ await shellExec(`cd ${coveragePath} && npm run coverage`, { silent: true });
401
+ } catch (err) {
402
+ logger.warn('coverage generation failed (non-fatal), skipping:', err.message);
403
+ return;
404
+ }
400
405
  } else if (pkg.scripts && pkg.scripts.test) {
401
406
  logger.info('generating coverage via test', coveragePath);
402
- shellExec(`cd ${coveragePath} && npm test`, { silent: true, silentOnError: true });
407
+ try {
408
+ await shellExec(`cd ${coveragePath} && npm test`, { silent: true, silentOnError: true });
409
+ } catch (err) {
410
+ logger.warn('coverage generation failed (non-fatal), skipping:', err.message);
411
+ return;
412
+ }
403
413
  }
404
414
  }
405
415
  }
@@ -1,12 +1,12 @@
1
1
  /**
2
2
  * Module for live building client-side code
3
- * @module src/server/client-build-live.js
3
+ * @module src/client-builder/client-build-live.js
4
4
  * @namespace clientLiveBuild
5
5
  */
6
6
 
7
7
  import fs from 'fs-extra';
8
- import { Config, loadConf, readConfJson } from './conf.js';
9
- import { loggerFactory } from './logger.js';
8
+ import { Config, loadConf, readConfJson } from '../server/conf.js';
9
+ import { loggerFactory } from '../server/logger.js';
10
10
  import { buildClient } from './client-build.js';
11
11
 
12
12
  const logger = loggerFactory(import.meta);
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Manages the client-side build process, including full builds and incremental builds.
3
- * @module server/client-build.js
3
+ * @module src/client-builder/client-build.js
4
4
  * @namespace clientBuild
5
5
  */
6
6
 
@@ -8,18 +8,18 @@
8
8
 
9
9
  import fs from 'fs-extra';
10
10
  import { transformClientJs, JSONweb } from './client-formatted.js';
11
- import { loggerFactory } from './logger.js';
11
+ import { loggerFactory } from '../server/logger.js';
12
12
  import {
13
13
  getCapVariableName,
14
14
  newInstance,
15
15
  orderArrayFromAttrInt,
16
16
  uniqueArray,
17
17
  } from '../client/components/core/CommonJs.js';
18
- import { readConfJson } from './conf.js';
18
+ import { readConfJson } from '../server/conf.js';
19
19
  import { minify } from 'html-minifier-terser';
20
20
  import AdmZip from 'adm-zip';
21
21
  import * as dir from 'path';
22
- import { shellExec } from './process.js';
22
+ import { shellExec } from '../server/process.js';
23
23
  import { SitemapStream, streamToPromise } from 'sitemap';
24
24
  import { Readable } from 'stream';
25
25
  import { buildIcons } from './client-icons.js';
@@ -751,8 +751,9 @@ const buildClient = async (
751
751
  )
752
752
  )
753
753
  for (const view of views) {
754
- const buildPath = `${rootClientPath[rootClientPath.length - 1] === '/' ? rootClientPath.slice(0, -1) : rootClientPath
755
- }${view.path === '/' ? view.path : `${view.path}/`}`;
754
+ const buildPath = `${
755
+ rootClientPath[rootClientPath.length - 1] === '/' ? rootClientPath.slice(0, -1) : rootClientPath
756
+ }${view.path === '/' ? view.path : `${view.path}/`}`;
756
757
 
757
758
  if (!fs.existsSync(buildPath)) fs.mkdirSync(buildPath, { recursive: true });
758
759
 
@@ -768,8 +769,9 @@ const buildClient = async (
768
769
  fs.writeFileSync(`${buildPath}${buildId}.js`, jsSrc, 'utf8');
769
770
  const title = metadata.title ? metadata.title : title;
770
771
 
771
- const canonicalURL = `https://${host}${path}${view.path === '/' ? (path === '/' ? '' : '/') : path === '/' ? `${view.path.slice(1)}/` : `${view.path}/`
772
- }`;
772
+ const canonicalURL = `https://${host}${path}${
773
+ view.path === '/' ? (path === '/' ? '' : '/') : path === '/' ? `${view.path.slice(1)}/` : `${view.path}/`
774
+ }`;
773
775
 
774
776
  let ssrHeadComponents = ``;
775
777
  let ssrBodyComponents = ``;
@@ -903,12 +905,12 @@ const buildClient = async (
903
905
  `${buildPath}index.html`,
904
906
  minifyBuild
905
907
  ? await minify(htmlSrc, {
906
- minifyCSS: true,
907
- minifyJS: true,
908
- collapseBooleanAttributes: true,
909
- collapseInlineTagWhitespace: true,
910
- collapseWhitespace: true,
911
- })
908
+ minifyCSS: true,
909
+ minifyJS: true,
910
+ collapseBooleanAttributes: true,
911
+ collapseInlineTagWhitespace: true,
912
+ collapseWhitespace: true,
913
+ })
912
914
  : htmlSrc,
913
915
  'utf8',
914
916
  );
@@ -997,8 +999,9 @@ Sitemap: ${sitemapBaseUrl}/sitemap.xml`,
997
999
  renderApi: { JSONweb },
998
1000
  });
999
1001
 
1000
- const buildPath = `${rootClientPath[rootClientPath.length - 1] === '/' ? rootClientPath.slice(0, -1) : rootClientPath
1001
- }${view.path === '/' ? view.path : `${view.path}/`}`;
1002
+ const buildPath = `${
1003
+ rootClientPath[rootClientPath.length - 1] === '/' ? rootClientPath.slice(0, -1) : rootClientPath
1004
+ }${view.path === '/' ? view.path : `${view.path}/`}`;
1002
1005
 
1003
1006
  const indexUrl = buildIndexUrl(view.path);
1004
1007
  if (view.offlineDefault) {
@@ -1018,12 +1021,12 @@ Sitemap: ${sitemapBaseUrl}/sitemap.xml`,
1018
1021
  buildHtmlPath,
1019
1022
  minifyBuild
1020
1023
  ? await minify(htmlSrc, {
1021
- minifyCSS: true,
1022
- minifyJS: true,
1023
- collapseBooleanAttributes: true,
1024
- collapseInlineTagWhitespace: true,
1025
- collapseWhitespace: true,
1026
- })
1024
+ minifyCSS: true,
1025
+ minifyJS: true,
1026
+ collapseBooleanAttributes: true,
1027
+ collapseInlineTagWhitespace: true,
1028
+ collapseWhitespace: true,
1029
+ })
1027
1030
  : htmlSrc,
1028
1031
  'utf8',
1029
1032
  );
@@ -1,13 +1,13 @@
1
1
  /**
2
2
  * Module for creating a client-side development server
3
- * @module src/server/client-dev-server.js
3
+ * @module src/client-builder/client-dev-server.js
4
4
  * @namespace clientDevServer
5
5
  */
6
6
  import fs from 'fs-extra';
7
7
  import nodemon from 'nodemon';
8
8
  import dotenv from 'dotenv';
9
- import { shellExec } from './process.js';
10
- import { loggerFactory } from './logger.js';
9
+ import { shellExec } from '../server/process.js';
10
+ import { loggerFactory } from '../server/logger.js';
11
11
  import Underpost from '../index.js';
12
12
 
13
13
  const logger = loggerFactory(import.meta);
@@ -1,10 +1,10 @@
1
1
  /**
2
2
  * Module for building client-side icons
3
- * @module src/server/client-icons.js
3
+ * @module src/client-builder/client-icons.js
4
4
  * @namespace clientIcons
5
5
  */
6
6
  import { favicons } from 'favicons';
7
- import { loggerFactory } from './logger.js';
7
+ import { loggerFactory } from '../server/logger.js';
8
8
  import fs from 'fs-extra';
9
9
  import { getCapVariableName } from '../client/components/core/CommonJs.js';
10
10