cyberia 3.2.22 → 3.2.70
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +127 -68
- package/.github/workflows/cyberia-client.cd.yml +40 -0
- package/.github/workflows/cyberia-server.cd.yml +40 -0
- package/.github/workflows/docker-image.cyberia-client.ci.yml +49 -0
- package/.github/workflows/docker-image.cyberia-client.dev.ci.yml +48 -0
- package/.github/workflows/docker-image.cyberia-server.ci.yml +69 -0
- package/.github/workflows/docker-image.cyberia-server.dev.ci.yml +69 -0
- package/.github/workflows/docker-image.engine-cyberia.ci.yml +52 -0
- package/.github/workflows/docker-image.engine-cyberia.dev.ci.yml +52 -0
- package/.github/workflows/engine-cyberia.cd.yml +33 -24
- package/.github/workflows/engine-cyberia.ci.yml +13 -3
- package/.github/workflows/ghpkg.ci.yml +88 -1
- package/.github/workflows/gitlab.ci.yml +1 -1
- package/.github/workflows/hardhat.ci.yml +1 -1
- package/.github/workflows/npmpkg.ci.yml +10 -7
- package/.github/workflows/publish.ci.yml +2 -2
- package/.github/workflows/publish.cyberia.ci.yml +5 -16
- package/.github/workflows/pwa-microservices-template-page.cd.yml +1 -8
- package/.github/workflows/pwa-microservices-template-test.ci.yml +1 -1
- package/CHANGELOG.md +301 -1
- package/CLI-HELP.md +71 -6
- package/Dockerfile +141 -43
- package/Dockerfile.dev +143 -0
- package/Dockerfile.test +165 -0
- package/README.md +1 -1
- package/baremetal/commission-workflows.json +1 -0
- package/bin/build.js +31 -0
- package/bin/cyberia.js +1080 -184
- package/bin/deploy.js +2 -2
- package/bin/index.js +1080 -184
- package/bump.config.js +1 -0
- package/compose.env +131 -0
- package/conf.js +18 -1
- package/deployment.yaml +2 -2
- package/docker-compose.yml +316 -0
- package/hardhat/hardhat.config.js +2 -2
- package/hardhat/package-lock.json +620 -2041
- package/hardhat/package.json +7 -5
- package/hardhat/scripts/deployObjectLayerToken.js +18 -18
- package/hardhat/test/ObjectLayerToken.js +378 -274
- package/ipfs/configure-ipfs.sh +13 -0
- package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +1 -1
- package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +1 -1
- package/manifests/deployment/dd-cyberia-development/deployment.yaml +2 -2
- package/manifests/deployment/dd-cyberia-development/grpc-service.yaml +17 -0
- package/manifests/deployment/dd-cyberia-development/pv-pvc.yaml +32 -0
- package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
- package/mongodb/entrypoint.sh +76 -0
- package/nginx.conf +87 -0
- package/package.json +31 -19
- package/pv-pvc.yaml +32 -0
- package/scripts/disk-clean.sh +85 -60
- package/scripts/kubeadm-node-setup.sh +317 -0
- package/scripts/rocky-kickstart.sh +877 -185
- package/scripts/rpmfusion-ffmpeg-setup.sh +26 -50
- package/scripts/test-monitor.sh +3 -5
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +43 -7
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +17 -25
- package/src/api/cyberia-action/cyberia-action.controller.js +19 -0
- package/src/api/cyberia-action/cyberia-action.model.js +21 -29
- package/src/api/cyberia-action/cyberia-action.router.js +42 -7
- package/src/api/cyberia-action/cyberia-action.service.js +20 -4
- package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +58 -57
- package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +37 -6
- package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +8 -2
- package/src/api/cyberia-entity/cyberia-entity.router.js +39 -7
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +74 -0
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.model.js +67 -0
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +63 -0
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +46 -0
- package/src/api/cyberia-instance/cyberia-fallback-world.js +62 -10
- package/src/api/cyberia-instance/cyberia-instance.model.js +32 -2
- package/src/api/cyberia-instance/cyberia-instance.router.js +6 -6
- package/src/api/cyberia-instance/cyberia-world-generator.js +116 -3
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +3 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +39 -7
- package/src/api/cyberia-map/cyberia-map.router.js +21 -6
- package/src/api/cyberia-quest/cyberia-quest.controller.js +38 -0
- package/src/api/cyberia-quest/cyberia-quest.router.js +47 -7
- package/src/api/cyberia-quest/cyberia-quest.service.js +59 -4
- package/src/api/cyberia-saga/cyberia-saga.controller.js +74 -0
- package/src/api/cyberia-saga/cyberia-saga.model.js +59 -0
- package/src/api/cyberia-saga/cyberia-saga.router.js +63 -0
- package/src/api/cyberia-saga/cyberia-saga.service.js +42 -0
- package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +551 -129
- package/src/api/cyberia-skill/cyberia-skill.controller.js +74 -0
- package/src/api/cyberia-skill/cyberia-skill.model.js +50 -0
- package/src/api/cyberia-skill/cyberia-skill.router.js +63 -0
- package/src/api/cyberia-skill/cyberia-skill.service.js +42 -0
- package/src/api/ipfs/ipfs.service.js +28 -15
- package/src/api/object-layer/object-layer.router.js +25 -15
- package/src/api/object-layer/object-layer.service.js +15 -20
- package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +39 -7
- package/src/cli/baremetal.js +717 -16
- package/src/cli/cluster.js +80 -5
- package/src/cli/deploy.js +127 -11
- package/src/cli/docker-compose.js +648 -0
- package/src/cli/env.js +11 -2
- package/src/cli/fs.js +75 -30
- package/src/cli/image.js +129 -51
- package/src/cli/index.js +110 -6
- package/src/cli/kickstart.js +142 -20
- package/src/cli/release.js +46 -4
- package/src/cli/repository.js +238 -33
- package/src/cli/run.js +520 -114
- package/src/cli/secrets.js +82 -48
- package/src/cli/ssh.js +234 -0
- package/src/cli/static.js +2 -2
- package/src/client/components/cyberia/ActionEngineCyberia.js +1867 -0
- package/src/client/components/cyberia/EntityEngineCyberia.js +585 -0
- package/src/client/components/cyberia/InstanceEngineCyberia.js +219 -13
- package/src/client/components/cyberia/MapEngineCyberia.js +154 -71
- package/src/client/components/cyberia/ObjectLayerEngineModal.js +40 -63
- package/src/client/components/cyberia/ObjectLayerEngineViewer.js +34 -20
- package/src/client/components/cyberia/SharedDefaultsCyberia.js +195 -4
- package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +66 -0
- package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +8 -0
- package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +8 -0
- package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +45 -27
- package/src/client/public/cyberia-docs/CYBERIA-CLI.md +3 -3
- package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +39 -22
- package/src/client/public/cyberia-docs/CYBERIA-LORE.md +88 -0
- package/src/client/public/cyberia-docs/CYBERIA-SAGA.md +394 -0
- package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +8 -1
- package/src/client/public/cyberia-docs/CYBERIA.md +1 -1
- package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +5 -5
- package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
- package/src/client/public/cyberia-docs/WHITE-PAPER.md +1 -1
- package/src/client/services/cyberia-entity-type-default/cyberia-entity-type-default.service.js +99 -0
- package/src/client/services/cyberia-instance/cyberia-instance.management.js +2 -2
- package/src/client/services/cyberia-map/cyberia-map.management.js +2 -2
- package/src/client/services/cyberia-saga/cyberia-saga.service.js +99 -0
- package/src/client/services/cyberia-skill/cyberia-skill.service.js +99 -0
- package/src/client/services/object-layer/object-layer.management.js +6 -6
- package/src/{server → client-builder}/client-build-docs.js +15 -5
- package/src/{server → client-builder}/client-build-live.js +3 -3
- package/src/{server → client-builder}/client-build.js +25 -22
- package/src/{server → client-builder}/client-dev-server.js +3 -3
- package/src/{server → client-builder}/client-icons.js +2 -2
- package/src/{server → client-builder}/ssr.js +5 -5
- package/src/client.build.js +1 -3
- package/src/client.dev.js +1 -1
- package/src/db/mongo/MongoBootstrap.js +12 -12
- package/src/grpc/cyberia/grpc-server.js +255 -70
- package/src/index.js +12 -1
- package/src/mailer/EmailRender.js +1 -1
- package/src/{server → projects/cyberia}/atlas-sprite-sheet-generator.js +2 -2
- package/src/{server → projects/cyberia}/besu-genesis-generator.js +3 -3
- package/src/projects/cyberia/catalog-cyberia.js +81 -0
- package/src/projects/cyberia/gemini-client.js +175 -0
- package/src/projects/cyberia/generate-saga.js +2107 -0
- package/src/{server → projects/cyberia}/ipfs-client.js +2 -2
- package/src/{server → projects/cyberia}/object-layer.js +12 -108
- package/src/{server → projects/cyberia}/semantic-layer-generator-floor.js +1 -1
- package/src/{server → projects/cyberia}/semantic-layer-generator-resource.js +1 -1
- package/src/{server → projects/cyberia}/semantic-layer-generator-skin.js +1 -1
- package/src/{server → projects/cyberia}/semantic-layer-generator.js +2 -2
- package/src/{server → projects/cyberia}/shape-generator.js +2 -2
- package/src/{server → projects/underpost}/catalog-underpost.js +1 -2
- package/src/runtime/cyberia-client/Dockerfile +27 -61
- package/src/runtime/cyberia-client/Dockerfile.dev +20 -12
- package/src/runtime/cyberia-server/Dockerfile +21 -20
- package/src/runtime/cyberia-server/Dockerfile.dev +17 -8
- package/src/runtime/engine-cyberia/Dockerfile +143 -0
- package/src/runtime/engine-cyberia/Dockerfile.dev +143 -0
- package/src/runtime/engine-cyberia/Dockerfile.test +165 -0
- package/src/runtime/engine-cyberia/compose.env +131 -0
- package/src/runtime/engine-cyberia/docker-compose.yml +316 -0
- package/src/runtime/engine-cyberia/ipfs/configure-ipfs.sh +13 -0
- package/src/runtime/engine-cyberia/mongodb/entrypoint.sh +76 -0
- package/src/runtime/engine-cyberia/nginx.conf +87 -0
- package/src/runtime/express/Express.js +2 -2
- package/src/runtime/nginx/Nginx.js +250 -0
- package/src/server/catalog.js +9 -14
- package/src/server/conf.js +3 -6
- package/src/server/runtime-status.js +18 -1
- package/src/server/start.js +12 -2
- package/src/server.js +6 -2
- package/test/cyberia-instance-conf-defaults.test.js +140 -0
- package/test/deploy-monitor.test.js +26 -10
- package/test/shape-generator.test.js +7 -1
- package/typedoc.dd-cyberia.json +3 -1
- package/typedoc.json +3 -1
- /package/src/client/ssr/{Render.js → RootDocument.js} +0 -0
- /package/src/{server → client-builder}/client-formatted.js +0 -0
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal Google Gemini (Generative Language API) chat client.
|
|
3
|
+
*
|
|
4
|
+
* Kept intentionally thin: a single text/JSON completion helper used by the
|
|
5
|
+
* Top-Down PCG saga generator. No streaming, no tool-calls — the saga
|
|
6
|
+
* orchestration only needs one structured JSON payload per request.
|
|
7
|
+
*
|
|
8
|
+
* General purpose, but for now only the `:generateContent` endpoint is wired,
|
|
9
|
+
* matching the Gemma model family (e.g. `gemma-4-26b-a4b-it`). Authentication
|
|
10
|
+
* uses the `x-goog-api-key` header sourced from `GEMINI_API_KEY`.
|
|
11
|
+
*
|
|
12
|
+
* @module src/projects/cyberia/gemini-client.js
|
|
13
|
+
* @namespace GeminiClient
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import axios from 'axios';
|
|
17
|
+
import { loggerFactory } from '../../server/logger.js';
|
|
18
|
+
|
|
19
|
+
const logger = loggerFactory(import.meta);
|
|
20
|
+
|
|
21
|
+
/** Generative Language API model base. The model id + `:generateContent` is appended. */
|
|
22
|
+
const GEMINI_API_BASE = 'https://generativelanguage.googleapis.com/v1beta/models';
|
|
23
|
+
|
|
24
|
+
/** Default model id (Gemma instruction-tuned model). */
|
|
25
|
+
const GEMINI_DEFAULT_MODEL = 'gemma-4-26b-a4b-it';
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Best-effort extraction of a single JSON object from a model text response.
|
|
29
|
+
* Tolerates markdown fences and leading/trailing prose.
|
|
30
|
+
*
|
|
31
|
+
* @param {string} text
|
|
32
|
+
* @returns {Object}
|
|
33
|
+
*/
|
|
34
|
+
function parseJsonLoose(text) {
|
|
35
|
+
let candidate = String(text || '').trim();
|
|
36
|
+
|
|
37
|
+
// Strip a ```json ... ``` (or bare ``` ... ```) fence if present.
|
|
38
|
+
const fence = candidate.match(/```(?:json)?\s*([\s\S]*?)```/i);
|
|
39
|
+
if (fence) candidate = fence[1].trim();
|
|
40
|
+
|
|
41
|
+
try {
|
|
42
|
+
return JSON.parse(candidate);
|
|
43
|
+
} catch {
|
|
44
|
+
// Fall back to the widest {...} span.
|
|
45
|
+
const start = candidate.indexOf('{');
|
|
46
|
+
const end = candidate.lastIndexOf('}');
|
|
47
|
+
if (start !== -1 && end > start) {
|
|
48
|
+
return JSON.parse(candidate.slice(start, end + 1));
|
|
49
|
+
}
|
|
50
|
+
throw new Error('Failed to parse JSON from Gemini response.');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
class GeminiClient {
|
|
55
|
+
/**
|
|
56
|
+
* @param {Object} [options]
|
|
57
|
+
* @param {string} [options.apiKey] - Gemini API key. Falls back to `process.env.GEMINI_API_KEY`.
|
|
58
|
+
* @param {string} [options.model] - Model id (default: `gemma-4-26b-a4b-it`).
|
|
59
|
+
* @param {string} [options.baseURL] - Override the model base URL.
|
|
60
|
+
* @param {number} [options.timeout] - Request timeout in ms (default: 300000).
|
|
61
|
+
* @param {number} [options.maxRetries] - Retry attempts on transient failure (default: 2).
|
|
62
|
+
*/
|
|
63
|
+
constructor({
|
|
64
|
+
apiKey,
|
|
65
|
+
model = GEMINI_DEFAULT_MODEL,
|
|
66
|
+
baseURL = GEMINI_API_BASE,
|
|
67
|
+
timeout = 300000,
|
|
68
|
+
maxRetries = 2,
|
|
69
|
+
} = {}) {
|
|
70
|
+
this.apiKey = apiKey || process.env.GEMINI_API_KEY;
|
|
71
|
+
this.model = model;
|
|
72
|
+
this.baseURL = baseURL;
|
|
73
|
+
this.timeout = timeout;
|
|
74
|
+
this.maxRetries = maxRetries;
|
|
75
|
+
if (!this.apiKey) {
|
|
76
|
+
throw new Error('GEMINI_API_KEY is not set. Export it or add it to your --env-path file.');
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Run a single `:generateContent` request and return the answer text,
|
|
82
|
+
* skipping any thinking parts the model emits.
|
|
83
|
+
*
|
|
84
|
+
* @async
|
|
85
|
+
* @param {Object} params
|
|
86
|
+
* @param {string} params.prompt - Full prompt text (system + user merged).
|
|
87
|
+
* @param {Object} [params.generationConfig] - Passed through to the API.
|
|
88
|
+
* @returns {Promise<string>} The concatenated answer text.
|
|
89
|
+
*/
|
|
90
|
+
async generateContent({ prompt, generationConfig = {} }) {
|
|
91
|
+
const url = `${this.baseURL}/${this.model}:generateContent`;
|
|
92
|
+
logger.info(`Gemini request → model=${this.model}`);
|
|
93
|
+
|
|
94
|
+
const { data } = await axios.post(
|
|
95
|
+
url,
|
|
96
|
+
{
|
|
97
|
+
contents: [{ parts: [{ text: prompt }] }],
|
|
98
|
+
generationConfig,
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
headers: { 'x-goog-api-key': this.apiKey, 'Content-Type': 'application/json' },
|
|
102
|
+
timeout: this.timeout,
|
|
103
|
+
},
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
const parts = data?.candidates?.[0]?.content?.parts || [];
|
|
107
|
+
const text = parts
|
|
108
|
+
.filter((p) => p && typeof p.text === 'string' && !p.thought)
|
|
109
|
+
.map((p) => p.text)
|
|
110
|
+
.join('');
|
|
111
|
+
|
|
112
|
+
if (!text) throw new Error('Gemini returned an empty completion.');
|
|
113
|
+
|
|
114
|
+
const usage = data?.usageMetadata;
|
|
115
|
+
if (usage) {
|
|
116
|
+
logger.info(
|
|
117
|
+
`Gemini usage → prompt=${usage.promptTokenCount} candidates=${usage.candidatesTokenCount} ` +
|
|
118
|
+
`total=${usage.totalTokenCount}`,
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return text;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Run a single completion and parse the answer as JSON.
|
|
127
|
+
*
|
|
128
|
+
* Gemma models do not support a dedicated JSON response mode, so the schema
|
|
129
|
+
* is requested in-prompt and the response is parsed leniently.
|
|
130
|
+
*
|
|
131
|
+
* @async
|
|
132
|
+
* @param {Object} params
|
|
133
|
+
* @param {string} params.system - System prompt (defines the output ontology / schema).
|
|
134
|
+
* @param {string} params.user - User prompt (the high-level theme seed).
|
|
135
|
+
* @param {string} [params.thinkingLevel='high'] - Gemini thinking level.
|
|
136
|
+
* @param {number} [params.temperature] - Sampling temperature (higher = more varied).
|
|
137
|
+
* @returns {Promise<Object>} Parsed JSON object from the model response.
|
|
138
|
+
*/
|
|
139
|
+
async chatJson({ system, user, thinkingLevel = 'high', temperature }) {
|
|
140
|
+
const prompt = [
|
|
141
|
+
system,
|
|
142
|
+
'',
|
|
143
|
+
user,
|
|
144
|
+
'',
|
|
145
|
+
'Respond with ONLY a single valid JSON object. Do not wrap it in markdown fences and do not add any prose.',
|
|
146
|
+
].join('\n');
|
|
147
|
+
|
|
148
|
+
const generationConfig = { thinkingConfig: { thinkingLevel } };
|
|
149
|
+
if (typeof temperature === 'number') generationConfig.temperature = temperature;
|
|
150
|
+
|
|
151
|
+
// Retry on transient failures (timeouts, 5xx, empty/invalid JSON) which the
|
|
152
|
+
// generateContent endpoint surfaces intermittently under load.
|
|
153
|
+
let lastError;
|
|
154
|
+
for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
|
|
155
|
+
try {
|
|
156
|
+
const text = await this.generateContent({ prompt, generationConfig });
|
|
157
|
+
return parseJsonLoose(text);
|
|
158
|
+
} catch (error) {
|
|
159
|
+
console.error(error);
|
|
160
|
+
lastError = error;
|
|
161
|
+
if (attempt < this.maxRetries) {
|
|
162
|
+
const backoffMs = 1000 * (attempt + 1);
|
|
163
|
+
logger.warn(
|
|
164
|
+
`Gemini attempt ${attempt + 1}/${this.maxRetries + 1} failed (${error.message}); ` +
|
|
165
|
+
`retrying in ${backoffMs}ms`,
|
|
166
|
+
);
|
|
167
|
+
await new Promise((resolve) => setTimeout(resolve, backoffMs));
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
throw lastError;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export { GeminiClient, GEMINI_API_BASE, GEMINI_DEFAULT_MODEL, parseJsonLoose };
|