@yorha2b-lab/autodev 6.1.2 → 7.1.0
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/README.md +18 -10
- package/README_EN.md +18 -10
- package/bin/bunker.js +21 -3
- package/package.json +1 -1
- package/src/awakening/index.js +4 -2
- package/src/dialogues/EN-US.js +5 -2
- package/src/dialogues/FR-FR.js +5 -2
- package/src/dialogues/JA-JP.js +6 -3
- package/src/dialogues/RU-RU.js +5 -2
- package/src/dialogues/ZH-CN.js +5 -2
- package/src/gateway/index.js +1 -1
- package/src/headquarters/commander.js +37 -0
- package/src/headquarters/designer.js +2 -2
- package/src/headquarters/dispatcher.js +2 -2
- package/src/headquarters/observer.js +9 -18
- package/src/headquarters/quartermaster.js +7 -7
- package/src/headquarters/reconciler.js +82 -0
- package/src/headquarters/recruiter.js +0 -10
- package/src/labs/council.js +6 -6
- package/src/labs/scout.js +5 -5
- package/src/labs/tower.js +7 -19
- package/src/logistics/supporter.js +0 -22
- package/src/units/raider.js +16 -11
- package/src/units/striker.js +20 -14
- package/src/workshop/react/briefings/raider.js +1 -1
- package/src/workshop/react/briefings/striker.js +4 -1
- package/src/workshop/react/briefings/visionType.js +59 -0
- package/src/workshop/react/builder/index.js +6 -6
- package/src/dialogues/DE-DE.js +0 -66
- package/src/dialogues/ES-ES.js +0 -65
- package/src/dialogues/ID-ID.js +0 -66
- package/src/dialogues/IT-IT.js +0 -66
- package/src/dialogues/KO-KR.js +0 -66
- package/src/dialogues/PT-BR.js +0 -66
- package/src/dialogues/TR-TR.js +0 -66
- package/src/dialogues/ZH-TW.js +0 -66
- package/src/headquarters/engineer.js +0 -19
- package/src/units/reconciler.js +0 -98
- /package/src/logistics/{builder.js → formater.js} +0 -0
package/src/labs/council.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
const fs = require('fs')
|
|
2
|
-
const path = require('path')
|
|
3
|
-
|
|
4
1
|
module.exports = async ({ llm, yorha, dialog, logistics }) => {
|
|
5
2
|
|
|
3
|
+
const fs = require('fs')
|
|
4
|
+
const path = require('path')
|
|
5
|
+
|
|
6
6
|
const { apiParser } = llm
|
|
7
7
|
const { pod153, commander } = yorha
|
|
8
|
-
const { contextStringify } = logistics.
|
|
8
|
+
const { contextStringify } = logistics.formater
|
|
9
9
|
const { apiDoc, pagesDir } = logistics.supporter.getConfig()
|
|
10
10
|
const { getLocalScore, getSemanticKeywords } = logistics.analyzer
|
|
11
11
|
|
|
@@ -59,7 +59,7 @@ module.exports = async ({ llm, yorha, dialog, logistics }) => {
|
|
|
59
59
|
.slice(0, 20) // 💡 拓宽至前 20 名,给 AI 更多的判别空间
|
|
60
60
|
|
|
61
61
|
const finalCandidates = candidates.map(item => `${item.method} ${item.path} ${item.desc}`).join('\n')
|
|
62
|
-
pod153.
|
|
62
|
+
const spinner = pod153.start(dialog.pod153.inactiveModule(fileName), 'yellow')
|
|
63
63
|
// 3. 驱动 9S 最终裁决
|
|
64
64
|
const result = await apiParser({ bunkerAnchors, realApis: finalCandidates })
|
|
65
65
|
|
|
@@ -98,7 +98,7 @@ module.exports = async ({ llm, yorha, dialog, logistics }) => {
|
|
|
98
98
|
})
|
|
99
99
|
|
|
100
100
|
fs.writeFileSync(indexPath, indexCode)
|
|
101
|
-
pod153.
|
|
101
|
+
pod153.success(spinner, dialog.pod153.signalSynchronized(Object.keys(result).length))
|
|
102
102
|
// 💡 战术免责补丁:采用橙黄色高亮,提醒指挥官保持警惕
|
|
103
103
|
commander.report(dialog.bunker.disclaimer, 'yellow')
|
|
104
104
|
}
|
package/src/labs/scout.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
const fs = require('fs')
|
|
2
|
-
const path = require('path')
|
|
3
|
-
|
|
4
1
|
let globalBrowser = null
|
|
5
2
|
|
|
6
3
|
module.exports = ({ yorha, dialog }) => {
|
|
7
4
|
|
|
5
|
+
const fs = require('fs')
|
|
6
|
+
const path = require('path')
|
|
7
|
+
|
|
8
8
|
const { pod042 } = yorha
|
|
9
9
|
|
|
10
10
|
const isHttpURL = str => {
|
|
@@ -35,7 +35,7 @@ module.exports = ({ yorha, dialog }) => {
|
|
|
35
35
|
pod042.report(dialog.pod042.startScout, 'green')
|
|
36
36
|
|
|
37
37
|
const puppeteer = require('puppeteer')
|
|
38
|
-
const
|
|
38
|
+
const missionDir = path.join(process.cwd(), 'bunker', 'mission')
|
|
39
39
|
const sessionDir = path.join(process.cwd(), 'bunker', '.chrome_session')
|
|
40
40
|
|
|
41
41
|
let isBrowserAlive = false
|
|
@@ -73,7 +73,7 @@ module.exports = ({ yorha, dialog }) => {
|
|
|
73
73
|
await page.exposeFunction('nodeTakeScreenshot', async () => {
|
|
74
74
|
const currentUrl = await page.url()
|
|
75
75
|
const pageName = derivePageNameFromUrl(currentUrl)
|
|
76
|
-
const savePath = path.join(
|
|
76
|
+
const savePath = path.join(missionDir, `${pageName}.png`)
|
|
77
77
|
await page.screenshot({ path: savePath, fullPage: true })
|
|
78
78
|
pod042.report(dialog.pod042.capturedPage(pageName), 'green')
|
|
79
79
|
})
|
package/src/labs/tower.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
module.exports = ({ units, yorha, dialog, logistics }) => {
|
|
1
|
+
module.exports = ({ units, yorha, dialog, logistics, headquarters }) => {
|
|
2
2
|
|
|
3
3
|
const http = require('http')
|
|
4
4
|
const zlib = require('zlib')
|
|
@@ -12,13 +12,11 @@ module.exports = ({ units, yorha, dialog, logistics }) => {
|
|
|
12
12
|
const hackedRegistry = new Map()
|
|
13
13
|
const proxy = httpProxy.createProxyServer({})
|
|
14
14
|
|
|
15
|
-
// 简单的辅助函数:提取 JSON 的所有 Key 作为“指纹”
|
|
16
15
|
const getJsonFingerprint = obj => {
|
|
17
16
|
if (!obj || typeof obj !== 'object') return ''
|
|
18
17
|
return Object.keys(Array.isArray(obj) ? (obj[0] || {}) : obj).sort().join(',')
|
|
19
18
|
}
|
|
20
19
|
|
|
21
|
-
// 💡 物理监控:劫持响应流
|
|
22
20
|
proxy.on('proxyRes', function (proxyRes, req, res) {
|
|
23
21
|
let body = []
|
|
24
22
|
proxyRes.on('data', chunk => body.push(chunk))
|
|
@@ -28,28 +26,20 @@ module.exports = ({ units, yorha, dialog, logistics }) => {
|
|
|
28
26
|
try {
|
|
29
27
|
const rawBody = encoding === 'gzip' ? zlib.gunzipSync(buffer) : buffer
|
|
30
28
|
const json = JSON.parse(rawBody.toString())
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
// 💡 这一步就是地堡的“火控系统”
|
|
35
|
-
if (!isQuerySignal(req, json, coreData)) {
|
|
36
|
-
return // 增删改信号,直接丢弃,保持静默
|
|
29
|
+
const coreData = unwrapSignal(json)
|
|
30
|
+
if (!isQuerySignal(req, json, coreData) || coreData?.length === 0) {
|
|
31
|
+
return
|
|
37
32
|
}
|
|
38
|
-
|
|
39
|
-
const referer = req.headers.referer || ''
|
|
33
|
+
const referer = req.headers.referer || '/'
|
|
40
34
|
const urlPath = new URL(referer).pathname
|
|
41
35
|
const fileName = routeMap?.[urlPath] ?? urlPath.split('/').filter(Boolean).at(-1)
|
|
42
|
-
|
|
43
|
-
const fingerprint = getJsonFingerprint(coreData) // 获取数据指纹
|
|
36
|
+
const fingerprint = getJsonFingerprint(coreData)
|
|
44
37
|
const lastFingerprint = hackedRegistry.get(fileName)
|
|
45
|
-
|
|
46
|
-
// 如果指纹没变,说明字段结构是一样的,无需再次骇入
|
|
47
38
|
if (lastFingerprint === fingerprint) {
|
|
48
39
|
return
|
|
49
40
|
}
|
|
50
|
-
|
|
51
41
|
pod153.report(dialog.pod153.capturedRuntimeSignal(fileName))
|
|
52
|
-
await
|
|
42
|
+
await headquarters.reconciler({ fileName, data: [coreData[0]] })
|
|
53
43
|
hackedRegistry.set(fileName, fingerprint)
|
|
54
44
|
} catch (e) {
|
|
55
45
|
// 非 JSON 信号,保持静默
|
|
@@ -59,10 +49,8 @@ module.exports = ({ units, yorha, dialog, logistics }) => {
|
|
|
59
49
|
|
|
60
50
|
const server = http.createServer((req, res) => {
|
|
61
51
|
if (!proxyTarget) {
|
|
62
|
-
// 静默模式:如果不配置 proxyTarget,拦截塔只转发不处理(或报错提示)
|
|
63
52
|
return
|
|
64
53
|
}
|
|
65
|
-
// 转发至真实后端
|
|
66
54
|
proxy.web(req, res, { target: proxyTarget, changeOrigin: true })
|
|
67
55
|
})
|
|
68
56
|
|
|
@@ -12,12 +12,6 @@ const getConfig = () => {
|
|
|
12
12
|
return config
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
const findUnit = (units, filePath) => {
|
|
16
|
-
const relative = path.relative(path.resolve('bunker'), path.resolve(filePath))
|
|
17
|
-
const root = relative.split(path.sep)[0]
|
|
18
|
-
return units.find(unit => root === unit.station)
|
|
19
|
-
}
|
|
20
|
-
|
|
21
15
|
const getExistingMenus = (dir = 'src/pages') => {
|
|
22
16
|
const pagesDir = path.join(process.cwd(), dir)
|
|
23
17
|
if (!fs.existsSync(pagesDir)) return []
|
|
@@ -26,23 +20,7 @@ const getExistingMenus = (dir = 'src/pages') => {
|
|
|
26
20
|
.map(file => ({ label: file, key: file }))
|
|
27
21
|
}
|
|
28
22
|
|
|
29
|
-
const copyTemplateDir = (template, templateSubDir, targetSubDir) => {
|
|
30
|
-
const targetDir = path.join(process.cwd(), targetSubDir)
|
|
31
|
-
const sourceDir = path.join(__dirname, `../workshop/${template}/${templateSubDir}`)
|
|
32
|
-
if (!fs.existsSync(sourceDir)) return
|
|
33
|
-
fs.mkdirSync(targetDir, { recursive: true })
|
|
34
|
-
fs.readdirSync(sourceDir).forEach(file => {
|
|
35
|
-
const src = path.join(sourceDir, file)
|
|
36
|
-
const dest = path.join(targetDir, file)
|
|
37
|
-
if (!fs.existsSync(dest)) {
|
|
38
|
-
fs.cpSync(src, dest, { recursive: true })
|
|
39
|
-
}
|
|
40
|
-
})
|
|
41
|
-
}
|
|
42
|
-
|
|
43
23
|
module.exports = {
|
|
44
|
-
findUnit,
|
|
45
24
|
getConfig,
|
|
46
|
-
copyTemplateDir,
|
|
47
25
|
getExistingMenus,
|
|
48
26
|
}
|
package/src/units/raider.js
CHANGED
|
@@ -1,17 +1,22 @@
|
|
|
1
|
-
const fs = require('fs')
|
|
2
|
-
|
|
3
1
|
module.exports = {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
meta: {
|
|
3
|
+
name: 'raider',
|
|
4
|
+
inputs: ['image'],
|
|
5
|
+
outputs: ['component-config'],
|
|
6
|
+
description: 'extract reusable UI component from visual input',
|
|
7
|
+
capabilities: ['vision', 'component-analysis', 'component-generation'],
|
|
8
|
+
},
|
|
9
|
+
execute: async ({ acp, mission }) => {
|
|
10
|
+
|
|
11
|
+
const fs = require('fs')
|
|
7
12
|
const chalk = require('chalk')
|
|
8
|
-
const { llm, yorha, dialog, builder, logistics, briefings } =
|
|
13
|
+
const { llm, yorha, dialog, builder, logistics, briefings } = acp
|
|
9
14
|
|
|
10
15
|
const { pod042 } = yorha
|
|
11
16
|
const { raider } = briefings
|
|
12
17
|
const { recognizePage } = llm
|
|
13
18
|
const { formatFormItemAndColumns } = builder
|
|
14
|
-
const { cleanCode, contextStringify } = logistics.
|
|
19
|
+
const { cleanCode, contextStringify } = logistics.formater
|
|
15
20
|
|
|
16
21
|
const startTime = Date.now()
|
|
17
22
|
|
|
@@ -20,7 +25,7 @@ module.exports = {
|
|
|
20
25
|
try {
|
|
21
26
|
pod042.update(spinner, dialog.pod042.extractingUiMetadata)
|
|
22
27
|
|
|
23
|
-
const pageConfig = await recognizePage({ prompt: raider, filePath })
|
|
28
|
+
const pageConfig = await recognizePage({ prompt: raider, filePath: mission.input })
|
|
24
29
|
|
|
25
30
|
const { formItems, dictBlocks, processedColumns } = formatFormItemAndColumns({ pageConfig })
|
|
26
31
|
|
|
@@ -39,15 +44,15 @@ module.exports = {
|
|
|
39
44
|
const endTime = Date.now()
|
|
40
45
|
spinner.stop()
|
|
41
46
|
console.log(chalk.magenta(`\n┌────────────────── [ YoRHa Construction Output ] ─────────────────┐`))
|
|
42
|
-
console.log(chalk.magenta(`│ Source: ${
|
|
47
|
+
console.log(chalk.magenta(`│ Source: ${mission.input}`))
|
|
43
48
|
console.log(chalk.magenta(`│ Protocol: Partial UI Fragment | Status: SUCCESS`))
|
|
44
49
|
console.log(chalk.magenta(`├──────────────────────────────────────────────────────────────────┘`))
|
|
45
50
|
console.log(chalk.white(finalResult))
|
|
46
51
|
pod042.success(spinner, dialog.pod042.partialConstruction((endTime - startTime) / 1000))
|
|
47
52
|
pod042.success(spinner, dialog.pod042.partialRecommendation)
|
|
48
53
|
|
|
49
|
-
if (fs.existsSync(
|
|
50
|
-
fs.unlinkSync(
|
|
54
|
+
if (fs.existsSync(mission.input)) {
|
|
55
|
+
fs.unlinkSync(mission.input)
|
|
51
56
|
}
|
|
52
57
|
|
|
53
58
|
} catch (error) {
|
package/src/units/striker.js
CHANGED
|
@@ -1,22 +1,28 @@
|
|
|
1
|
-
const fs = require('fs')
|
|
2
|
-
const path = require('path')
|
|
3
|
-
|
|
4
1
|
module.exports = {
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
meta: {
|
|
3
|
+
name: 'striker',
|
|
4
|
+
inputs: ['image'],
|
|
5
|
+
outputs: ['page-config', 'artifacts'],
|
|
6
|
+
description: 'reconstruct full UI from visual input',
|
|
7
|
+
capabilities: ['vision', 'page-analysis', 'page-generation'],
|
|
8
|
+
},
|
|
9
|
+
execute: async ({ acp, mission }) => {
|
|
10
|
+
|
|
11
|
+
const fs = require('fs')
|
|
12
|
+
const path = require('path')
|
|
7
13
|
|
|
8
|
-
const { llm, yorha, dialog, builder, template, logistics, briefings } =
|
|
14
|
+
const { llm, yorha, dialog, builder, template, logistics, briefings } = acp
|
|
9
15
|
|
|
10
16
|
const { striker } = briefings
|
|
11
17
|
const { nineS, pod042 } = yorha
|
|
12
18
|
const { index, resource } = builder
|
|
13
|
-
const { contextStringify } = logistics.
|
|
19
|
+
const { contextStringify } = logistics.formater
|
|
14
20
|
const { generateMock, recognizePage, nameSimilarity } = llm
|
|
15
21
|
const { useDemo, pagesDir, utilsDir, needMock } = logistics.supporter.getConfig()
|
|
16
22
|
|
|
17
23
|
|
|
18
24
|
const startTime = Date.now()
|
|
19
|
-
let fileName = path.basename(
|
|
25
|
+
let fileName = path.basename(mission.input, path.extname(mission.input))
|
|
20
26
|
let targetDir = path.join(process.cwd(), pagesDir, fileName)
|
|
21
27
|
|
|
22
28
|
const spinner = pod042.start(dialog.pod042.visualCaptured(fileName))
|
|
@@ -33,13 +39,13 @@ module.exports = {
|
|
|
33
39
|
pageConfig = require('../../example/example.json')
|
|
34
40
|
} else {
|
|
35
41
|
pod042.update(spinner, dialog.pod042.uploadVisualMetadata)
|
|
36
|
-
pageConfig = await recognizePage({ prompt: striker, filePath, schema: require(`../workshop/${template}/protocols/striker.json`) })
|
|
42
|
+
pageConfig = await recognizePage({ prompt: striker, filePath: mission.input, schema: require(`../workshop/${template}/protocols/striker.json`) })
|
|
37
43
|
}
|
|
38
44
|
|
|
39
|
-
const { similarity } = await nameSimilarity({ fileName, english: pageConfig.title
|
|
45
|
+
const { similarity } = await nameSimilarity({ fileName, english: pageConfig.title?.english })
|
|
40
46
|
if (similarity === 0) {
|
|
41
|
-
fileName = pageConfig.title
|
|
42
|
-
targetDir = path.join(process.cwd(), pagesDir, pageConfig.title
|
|
47
|
+
fileName = pageConfig.title?.english
|
|
48
|
+
targetDir = path.join(process.cwd(), pagesDir, pageConfig.title?.english)
|
|
43
49
|
if (fs.existsSync(targetDir)) {
|
|
44
50
|
targetDir = `${targetDir}_temp`
|
|
45
51
|
}
|
|
@@ -61,8 +67,8 @@ module.exports = {
|
|
|
61
67
|
const endTime = Date.now()
|
|
62
68
|
pod042.success(spinner, dialog.pod042.assemblyComplete(fileName, (endTime - startTime) / 1000))
|
|
63
69
|
|
|
64
|
-
if (fs.existsSync(
|
|
65
|
-
fs.unlinkSync(
|
|
70
|
+
if (fs.existsSync(mission.input)) {
|
|
71
|
+
fs.unlinkSync(mission.input)
|
|
66
72
|
const cwdUtilsDir = path.join(process.cwd(), utilsDir)
|
|
67
73
|
if (!fs.existsSync(cwdUtilsDir)) fs.mkdirSync(cwdUtilsDir, { recursive: true })
|
|
68
74
|
fs.writeFileSync(path.join(cwdUtilsDir, 'menus.js'), `export const menus = ${contextStringify({ context: logistics.supporter.getExistingMenus(pagesDir), maxLength: 50 })}`)
|
|
@@ -9,6 +9,9 @@ module.exports = `
|
|
|
9
9
|
- **严禁中文**: 绝对禁止在变量名、键名中使用中文字符。
|
|
10
10
|
- **屏蔽关键字**: 禁止使用 JS 保留字 (export, delete, const, let, class, default 等)。
|
|
11
11
|
|
|
12
|
+
## 页面标题 (title)
|
|
13
|
+
- **格式**: {title:{english:'页面标题[英文]',chinese:'页面标题[中文]'}}
|
|
14
|
+
|
|
12
15
|
## 零部件构筑规范 (Component Specifications)
|
|
13
16
|
|
|
14
17
|
## 标签页 (tabs)
|
|
@@ -55,4 +58,4 @@ module.exports = `
|
|
|
55
58
|
- **格式**:[{ name: '字段英文名Options', options:[{ label, value}]}]。
|
|
56
59
|
- **注释**:label:选项文本,value:文本英文。
|
|
57
60
|
- **数据源**:根据对应列的内容去重,生成选项数组。
|
|
58
|
-
`.trim()
|
|
61
|
+
`.trim()
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
module.exports = `
|
|
2
|
+
# Mission Classification
|
|
3
|
+
|
|
4
|
+
分析输入图片,判断它属于以下哪一种任务类型:
|
|
5
|
+
|
|
6
|
+
## Full CRUD Page
|
|
7
|
+
|
|
8
|
+
完整的 CRUD 页面。
|
|
9
|
+
|
|
10
|
+
满足以下特征中的大部分:
|
|
11
|
+
- 页面结构完整
|
|
12
|
+
- 包含页面级功能区域
|
|
13
|
+
- 包含查询表单或筛选区域
|
|
14
|
+
- 包含表格主体
|
|
15
|
+
- 包含行操作
|
|
16
|
+
- 包含新增、编辑、删除等功能按钮
|
|
17
|
+
- 可能包含统计区域、导出按钮等页面级功能
|
|
18
|
+
|
|
19
|
+
返回:
|
|
20
|
+
|
|
21
|
+
{
|
|
22
|
+
"capabilities": [
|
|
23
|
+
"vision",
|
|
24
|
+
"page-analysis",
|
|
25
|
+
"page-generation"
|
|
26
|
+
]
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
## Partial CRUD Page
|
|
30
|
+
|
|
31
|
+
局部 CRUD 页面或 UI 碎片。
|
|
32
|
+
|
|
33
|
+
例如:
|
|
34
|
+
- 仅包含表格
|
|
35
|
+
- 仅包含表单
|
|
36
|
+
- 仅包含筛选区域
|
|
37
|
+
- 仅包含某个 CRUD 功能区域
|
|
38
|
+
- 页面结构明显不完整
|
|
39
|
+
|
|
40
|
+
返回:
|
|
41
|
+
|
|
42
|
+
{
|
|
43
|
+
"capabilities": [
|
|
44
|
+
"vision",
|
|
45
|
+
"component-analysis",
|
|
46
|
+
"component-generation"
|
|
47
|
+
]
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
## Result
|
|
51
|
+
|
|
52
|
+
只允许返回 JSON:
|
|
53
|
+
|
|
54
|
+
{
|
|
55
|
+
"capabilities": []
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
不要返回任何额外文字。
|
|
59
|
+
`.trim()
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
module.exports = ({
|
|
1
|
+
module.exports = ({ template, logistics, headquarters }) => {
|
|
2
2
|
|
|
3
|
-
const {
|
|
4
|
-
const { wrapCode, cleanCode, contextStringify } = logistics.builder
|
|
3
|
+
const { wrapCode, cleanCode, contextStringify } = logistics.formater
|
|
5
4
|
const { needMock, responseSuccess } = logistics.supporter.getConfig()
|
|
5
|
+
const { indexTpl, resourceTpl } = headquarters.designer({ template, logistics })
|
|
6
6
|
|
|
7
7
|
const formatFormItemAndColumns = ({ pageConfig }) => {
|
|
8
8
|
|
|
@@ -87,7 +87,7 @@ module.exports = ({ designer, logistics }) => {
|
|
|
87
87
|
|
|
88
88
|
const hasTabs = pageConfig.tabs?.length > 0
|
|
89
89
|
const hasFormItems = pageConfig.formItems?.length > 0
|
|
90
|
-
const tabKeys = pageConfig.tabs?.map(tab => tab.key).sort((a, b) => a.length - b.length)
|
|
90
|
+
const tabKeys = pageConfig.tabs?.map(tab => tab.key).sort((a, b) => a.length - b.length) ?? []
|
|
91
91
|
const optionDict = pageConfig.optionList?.reduce((acc, item) => ({ ...acc, [item.name]: item.options }), {})
|
|
92
92
|
|
|
93
93
|
const columnsData = processedColumns.filter(item => !['操作', 'operation'].includes(item.title?.toLowerCase()))?.map(item => {
|
|
@@ -101,10 +101,10 @@ module.exports = ({ designer, logistics }) => {
|
|
|
101
101
|
hasFormItems,
|
|
102
102
|
tabs: pageConfig.tabs,
|
|
103
103
|
dictBlocks: dictBlocks.map(item => ({ name: item, data: optionDict[item] ?? [] })),
|
|
104
|
-
tabColumns: contextStringify({ context: Object.fromEntries(tabKeys
|
|
104
|
+
tabColumns: contextStringify({ context: Object.fromEntries(tabKeys?.map(tab => [tab, wrapCode('commonColumns')])), maxLength: 100 }),
|
|
105
105
|
formItemsData: !hasTabs ?
|
|
106
106
|
`export const formItems = ${contextStringify({ context: formItems, maxLength: 120 })}` :
|
|
107
|
-
`const searchItems = ${contextStringify({ context: formItems, maxLength: 120 })}\n\nexport const formItems = ${contextStringify({ context: Object.fromEntries(tabKeys
|
|
107
|
+
`const searchItems = ${contextStringify({ context: formItems, maxLength: 120 })}\n\nexport const formItems = ${contextStringify({ context: Object.fromEntries(tabKeys?.map(tab => [tab, wrapCode('searchItems')])), maxLength: 100 })}`,
|
|
108
108
|
}
|
|
109
109
|
|
|
110
110
|
const bodyCode = resourceTpl(viewData)
|
package/src/dialogues/DE-DE.js
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
module.exports = {
|
|
2
|
-
nineS: {
|
|
3
|
-
dataCamouflageComplete: 'Mock-Datengenerierung abgeschlossen',
|
|
4
|
-
scanningField: 'Analyse der Feldabweichungen zwischen Frontend und Backend läuft... Semantische Brücke wird aktiviert',
|
|
5
|
-
dataCamouflage: fileName => `Ziel-Firewall wird durchbrochen... Datenverschleierungsprotokoll wird ausgeführt [${fileName}]`,
|
|
6
|
-
},
|
|
7
|
-
pod042: {
|
|
8
|
-
capturedToast: 'Visuelle Daten erfasst. Übertragung wird gestartet...',
|
|
9
|
-
startScout: 'Aktivieren des [Taktischen Rechtsklick-Schnappschuss]-Modus...',
|
|
10
|
-
partialConstruction: time => `Bericht: Teilkonstruktion abgeschlossen. Dauer: ${time}s`,
|
|
11
|
-
extractingUiMetadata: 'UI-Metadaten werden aus dem neuronalen Cloud-Netzwerk extrahiert...',
|
|
12
|
-
simulate: 'Echte Anfrage erkannt. Standard-Simulationspaket example.json wird bereitgestellt',
|
|
13
|
-
partialRecommendation: '│ Empfehlung: Den obigen Codeblock manuell in die Zieldatei integrieren',
|
|
14
|
-
capturedPage: pageName => `Seite erfasst [${pageName}] -> In das Verzeichnis screenShot übertragen`,
|
|
15
|
-
visualPartCaptured: 'Lokales visuelles Fragment erkannt. „Fragment-Konstruktionsprotokoll“ wird gestartet',
|
|
16
|
-
uploadVisualMetadata: 'Visuelle Metadaten werden an die Zentrale übertragen. Semantische Analyse wird gestartet...',
|
|
17
|
-
partialConstructionAborted: virus => `[Warnung] Fragment-Konstruktion fehlgeschlagen. Logische Störung erkannt: ${virus}`,
|
|
18
|
-
constructionAborted: virus => `Konstruktion abgebrochen. Logischer Virus oder Verbindungszeitüberschreitung erkannt: ${virus}`,
|
|
19
|
-
scoutReady: '[Rechtsklick-Schnappschuss Bereit] Klicken Sie mit der rechten Maustaste auf eine beliebige Stelle der Webseite.',
|
|
20
|
-
intercept: fileName => `Modul [${fileName}] befindet sich bereits in der Bunker-Datenbank. Überschreiben zum Schutz der Daten verhindert`,
|
|
21
|
-
visualCaptured: fileName => `Visuelle Erfassung abgeschlossen: [${fileName}]. Bunker-Ressourcen werden geladen und physische Konstruktion gestartet`,
|
|
22
|
-
assemblyComplete: (fileName, time) => `Konstruktionsprotokoll abgeschlossen. Modul [${fileName}] erfolgreich implementiert. Dauer: ${time}s, Menü-Routenkonfiguration wird mit Bunker synchronisiert`,
|
|
23
|
-
},
|
|
24
|
-
pod153: {
|
|
25
|
-
signalLinkFault: virus => `Signalverbindungsfehler: ${virus}`,
|
|
26
|
-
signalSynchronized: count => `${count} Knoten synchronisiert. Energieversorgung bestätigt`,
|
|
27
|
-
formatError: 'Nicht standardisiertes JSON-Format erkannt. Synchronisation mit Rohdaten wird versucht',
|
|
28
|
-
autonomousAddressing: '„Vollkanal-Autoadressierungsprotokoll [Semantische Analyseversion]“ wird aktiviert...',
|
|
29
|
-
inactiveModule: fileName => `Nicht aktiviertes Modul [${fileName}] erkannt. Hochpräzise Analyse durch 9S angefordert`,
|
|
30
|
-
alignmentFailed: virus => `Signalsynchronisierung fehlgeschlagen. API-Daten durch starke Firewall blockiert: ${virus}`,
|
|
31
|
-
reconEncryptedData: fileName => `Verschlüsselte Datenquelle [${fileName}] erkannt. Semantische Synchronisierung wird versucht`,
|
|
32
|
-
bridgeProtocolComplete: (count, time) => `Semantische Brücke abgeschlossen. ${count} Feldabweichungen korrigiert. Dauer: ${time}s`,
|
|
33
|
-
capturedRuntimeSignal: fileName => `Laufzeitsignal [${fileName}] abgefangen. Automatisches Synchronisationsprotokoll wird gestartet`,
|
|
34
|
-
unknownModule: fileName => `Keine Ressourcendaten für Modul [${fileName}] in der Bunker-Datenbank gefunden. Bitte zuerst visuelle Konstruktion ausführen`,
|
|
35
|
-
},
|
|
36
|
-
bunker: {
|
|
37
|
-
exit: 'Systemsignal verloren...',
|
|
38
|
-
envCopy: '.env-Speicherung abgeschlossen',
|
|
39
|
-
argDesc: 'Frontend-Framework-Template auswählen',
|
|
40
|
-
configCopy: 'config.js-Speicherung abgeschlossen',
|
|
41
|
-
desc: 'KI-gesteuertes Frontend-CRUD-Codegenerierungssystem',
|
|
42
|
-
systemStandby: 'System befindet sich im Bereitschaftsmodus...',
|
|
43
|
-
envCheck: 'Vorhandene .env-Datei erkannt. Erstellung übersprungen',
|
|
44
|
-
towerOnline: port => `Signal-Abfangturm online [Frequenz: ${port}]`,
|
|
45
|
-
configCheck: 'Vorhandene config.js-Datei erkannt. Erstellung übersprungen',
|
|
46
|
-
copyTemplateError: virus => `Template-Konstruktion fehlgeschlagen: ${virus}`,
|
|
47
|
-
initDesc: 'Bunker-Konstruktionsumgebung im aktuellen Verzeichnis initialisieren',
|
|
48
|
-
linkSevered: 'Verbindung getrennt: Netzwerkstatus oder Blackbox-Resonanz prüfen',
|
|
49
|
-
towerConnected: port => `Befehl: Proxy-Ziel auf http://localhost:${port} setzen`,
|
|
50
|
-
bootDesc: 'Überwachung aller Kanäle starten: Page/Part/API-Konstruktion unterstützt',
|
|
51
|
-
accessDenied: 'Zentralzugriff verweigert: API-Key ungültig oder Kontingent erschöpft',
|
|
52
|
-
dataSynced: 'Alle Konstruktionsdaten wurden mit dem Bunker-Speicherknoten synchronisiert',
|
|
53
|
-
systemOffline: 'Neuronale Cloud-Verbindung wird getrennt. Daten werden physisch versiegelt...',
|
|
54
|
-
star: 'Wenn dieses System Ihnen Zeit spart, geben Sie dem Projekt bitte einen Stern auf GitHub ⭐',
|
|
55
|
-
frameworkNotSupported: template => `[${template}] Framework wird derzeit nicht unterstützt. Pull Requests willkommen`,
|
|
56
|
-
networkInstability: count => `Neuronale Cloud-Verbindung instabil. Wiederverbindung wird versucht... (Versuch ${count})`,
|
|
57
|
-
disclaimer: 'Analyseergebnis dient nur als Referenz. Die endgültige Entscheidung muss durch die jeweiligen Einheiten getroffen werden',
|
|
58
|
-
copyEnum: '│ Backend-Geninformationen (Enum) erkannt\n│ Empfehlung: Den folgenden Codeblock manuell in das Ressourcenmodul integrieren',
|
|
59
|
-
strategicThreshold: (target, current) => `Physische Klonanzahl hat strategischen Schwellenwert ${target} überschritten! Aktuelle Stärke: ${current}`,
|
|
60
|
-
initComplete: cmd => `Bunker-Bereitstellung abgeschlossen. Für schnelleren Einsatz bitte [manuell installieren]: ${cmd} zu package.json scripts hinzufügen`,
|
|
61
|
-
isLegendary: (unlockAchievement, current, target) => unlockAchievement ? 'Glückwunsch, Kommandant. Ihr Konstruktionsprotokoll ist nun Teil des Ruhms der Menschheit' : `Aktuelle Konstruktionsanzahl: ${current}. Noch ${target - current} Einheiten bis zur Auszeichnung`,
|
|
62
|
-
},
|
|
63
|
-
operator6O: {
|
|
64
|
-
call2B: 'An 2B: Bunker-weite Kanalüberwachung ist aktiviert!',
|
|
65
|
-
}
|
|
66
|
-
}
|
package/src/dialogues/ES-ES.js
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
module.exports = {
|
|
2
|
-
nineS: {
|
|
3
|
-
dataCamouflageComplete: 'Generación de datos Mock completada',
|
|
4
|
-
scanningField: 'Analizando diferencias entre campos Frontend/Backend... Ejecutando puente semántico',
|
|
5
|
-
dataCamouflage: fileName => `Atravesando el firewall del objetivo... Ejecutando protocolo de camuflaje de datos [${fileName}]`,
|
|
6
|
-
},
|
|
7
|
-
pod042: {
|
|
8
|
-
startScout: 'Activando el modo [Captura Táctica por Clic Derecho]...',
|
|
9
|
-
capturedToast: 'Inteligencia visual capturada. Iniciando transmisión...',
|
|
10
|
-
extractingUiMetadata: 'Extrayendo metadatos de UI desde la red neuronal en la nube...',
|
|
11
|
-
partialConstruction: time => `Informe: construcción parcial completada. Tiempo: ${time}s`,
|
|
12
|
-
simulate: 'Solicitud real interceptada. Desplegando paquete simulado estándar: example.json',
|
|
13
|
-
capturedPage: pageName => `Página capturada [${pageName}] -> Transmitida al directorio screenShot`,
|
|
14
|
-
uploadVisualMetadata: 'Subiendo metadatos visuales al centro de comando para análisis semántico...',
|
|
15
|
-
visualPartCaptured: 'Fragmento visual detectado. Ejecutando protocolo de construcción fragmentada...',
|
|
16
|
-
constructionAborted: virus => `Construcción abortada. Virus lógico o tiempo de conexión agotado: ${virus}`,
|
|
17
|
-
scoutReady: '[Captura por Clic Derecho Lista] Haga clic derecho en cualquier lugar de la página para capturar.',
|
|
18
|
-
partialRecommendation: '│ Recomendación: ensamble manualmente el bloque de código anterior en el archivo objetivo',
|
|
19
|
-
partialConstructionAborted: virus => `[Advertencia] Fallo en construcción fragmentada. Interferencia lógica detectada: ${virus}`,
|
|
20
|
-
visualCaptured: fileName => `Captura visual completada: [${fileName}]. Asignando recursos del Bunker para construcción física...`,
|
|
21
|
-
intercept: fileName => `El módulo [${fileName}] ya existe en la base de datos del Bunker. Protocolo omitido para evitar sobrescritura`,
|
|
22
|
-
assemblyComplete: (fileName, time) => `Protocolo de construcción finalizado. Módulo [${fileName}] ensamblado físicamente. Tiempo: ${time}s, Sincronizando configuración de rutas Menu con Bunker...`,
|
|
23
|
-
},
|
|
24
|
-
pod153: {
|
|
25
|
-
signalLinkFault: virus => `Fallo en enlace de señal: ${virus}`,
|
|
26
|
-
signalSynchronized: count => `Sincronización completada. ${count} nodos activados`,
|
|
27
|
-
formatError: 'Formato JSON no estándar detectado. Intentando alineación de datos originales',
|
|
28
|
-
alignmentFailed: virus => `Fallo de alineación. Los datos de interfaz encontraron un firewall: ${virus}`,
|
|
29
|
-
autonomousAddressing: 'Iniciando protocolo de direccionamiento autónomo multicanal [versión semántica]...',
|
|
30
|
-
inactiveModule: fileName => `Módulo sin energía detectado [${fileName}]. Solicitando análisis de precisión a 9S`,
|
|
31
|
-
capturedRuntimeSignal: fileName => `Señal en ejecución capturada [${fileName}]. Ejecutando alineación automática...`,
|
|
32
|
-
reconEncryptedData: fileName => `Fuente de datos cifrada detectada [${fileName}]. Intentando alineación semántica...`,
|
|
33
|
-
unknownModule: fileName => `No se encontró recurso del módulo [${fileName}] en Bunker. Ejecute primero la construcción visual`,
|
|
34
|
-
bridgeProtocolComplete: (count, time) => `Protocolo puente semántico completado. ${count} diferencias corregidas. Tiempo: ${time}s`,
|
|
35
|
-
},
|
|
36
|
-
|
|
37
|
-
bunker: {
|
|
38
|
-
exit: 'Señal del sistema perdida...',
|
|
39
|
-
systemStandby: 'Sistema en espera...',
|
|
40
|
-
envCopy: 'Archivo .env almacenado correctamente',
|
|
41
|
-
argDesc: 'Especificar plantilla del framework frontend',
|
|
42
|
-
configCopy: 'Archivo config.js almacenado correctamente',
|
|
43
|
-
desc: 'Generador de código CRUD frontend impulsado por IA',
|
|
44
|
-
envCheck: 'Archivo .env existente detectado. Saltando creación',
|
|
45
|
-
star: 'Si este proyecto te ayuda, deja una estrella en GitHub ⭐',
|
|
46
|
-
accessDenied: 'Acceso denegado: API Key inválida o límite agotado',
|
|
47
|
-
configCheck: 'Archivo config.js existente detectado. Saltando creación',
|
|
48
|
-
copyTemplateError: virus => `Fallo en construcción de plantilla: ${virus}`,
|
|
49
|
-
linkSevered: 'Conexión perdida: revise la red o la resonancia de Black Box',
|
|
50
|
-
initDesc: 'Inicializar entorno de construcción Bunker en el directorio actual',
|
|
51
|
-
dataSynced: 'Todos los datos de construcción sincronizados con el nodo Bunker',
|
|
52
|
-
towerConnected: port => `Comando: apunta tu proxy hacia http://localhost:${port}`,
|
|
53
|
-
bootDesc: 'Iniciar monitorización completa: construcción coordinada Page/Part/API',
|
|
54
|
-
towerOnline: port => `Torre de interceptación de señales activa [Frecuencia: ${port}]`,
|
|
55
|
-
systemOffline: 'Desconectando enlace neural en la nube. Ejecutando sellado físico de datos...',
|
|
56
|
-
disclaimer: 'Los resultados son referencias. Cada unidad debe ajustar según la situación real',
|
|
57
|
-
networkInstability: count => `Inestabilidad de red neuronal. Reintentando conexión... (${count})`,
|
|
58
|
-
initComplete: cmd => `Despliegue del Bunker completado. Añade ${cmd} a package.json scripts`,
|
|
59
|
-
frameworkNotSupported: template => `Framework [${template}] no soportado. Pull Requests son bienvenidos`,
|
|
60
|
-
isLegendary: (unlockAchievement, current, target) => unlockAchievement ? '¡Enhorabuena, Comandante! Su protocolo de construcción se ha convertido en parte de la gloria de la humanidad.' : `Construcciones totales actuales: ${current}. Faltan ${target - current} para la insignia de ${target}.`
|
|
61
|
-
},
|
|
62
|
-
operator6O: {
|
|
63
|
-
call2B: 'Llamando a 2B. Monitorización global del Bunker lista!',
|
|
64
|
-
}
|
|
65
|
-
}
|
package/src/dialogues/ID-ID.js
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
module.exports = {
|
|
2
|
-
nineS: {
|
|
3
|
-
dataCamouflageComplete: 'Pembuatan data Mock berhasil',
|
|
4
|
-
scanningField: 'Memindai perbedaan field Frontend/Backend... Menjalankan protokol jembatan semantik',
|
|
5
|
-
dataCamouflage: fileName => `Menembus firewall target... Menjalankan protokol penyamaran data [${fileName}]`,
|
|
6
|
-
},
|
|
7
|
-
pod042: {
|
|
8
|
-
startScout: 'Mengaktifkan mode [Jepretan Taktis Klik-Kanan]...',
|
|
9
|
-
capturedToast: 'Intelijen visual ditangkap. Memulai transmisi...',
|
|
10
|
-
extractingUiMetadata: 'Mengekstrak metadata UI dari jaringan saraf cloud...',
|
|
11
|
-
partialConstruction: time => `Laporan: konstruksi parsial selesai. Waktu: ${time}s`,
|
|
12
|
-
simulate: 'Permintaan nyata terdeteksi. Menurunkan paket simulasi standar: example.json',
|
|
13
|
-
visualPartCaptured: 'Sampel visual terdeteksi. Menjalankan protokol konstruksi fragmen...',
|
|
14
|
-
uploadVisualMetadata: 'Mengirim metadata visual ke pusat komando untuk analisis semantik...',
|
|
15
|
-
partialRecommendation: '│ Rekomendasi: Pasang blok kode di atas secara manual ke file target',
|
|
16
|
-
capturedPage: pageName => `Halaman ditangkap [${pageName}] -> Ditransmisikan ke direktori screenShot`,
|
|
17
|
-
scoutReady: '[Mode Jepretan Klik-Kanan Siap] Klik kanan di mana saja pada halaman web untuk mengambil gambar.',
|
|
18
|
-
constructionAborted: virus => `Konstruksi dihentikan. Virus logika atau batas waktu koneksi terdeteksi: ${virus}`,
|
|
19
|
-
partialConstructionAborted: virus => `[Peringatan] Konstruksi fragmen gagal. Gangguan logika terdeteksi: ${virus}`,
|
|
20
|
-
intercept: fileName => `Modul [${fileName}] sudah ada dalam database Bunker. Protokol dilewati untuk mencegah penimpaan`,
|
|
21
|
-
visualCaptured: fileName => `Penangkapan visual selesai: [${fileName}]. Menyiapkan sumber daya Bunker untuk konstruksi fisik...`,
|
|
22
|
-
assemblyComplete: (fileName, time) => `Protokol konstruksi selesai. Modul [${fileName}] berhasil dirakit secara fisik. Waktu: ${time}s, Sinkronisasi konfigurasi Menu dengan Bunker...`,
|
|
23
|
-
},
|
|
24
|
-
pod153: {
|
|
25
|
-
signalLinkFault: virus => `Gangguan koneksi sinyal: ${virus}`,
|
|
26
|
-
formatError: 'Format JSON tidak standar. Mencoba penyelarasan data mentah',
|
|
27
|
-
signalSynchronized: count => `Sinkronisasi sinyal selesai. ${count} node telah diaktifkan`,
|
|
28
|
-
alignmentFailed: virus => `Penyelarasan sinyal gagal. Data API menghadapi firewall: ${virus}`,
|
|
29
|
-
autonomousAddressing: 'Memulai protokol pengalamatan otomatis multi-kanal [versi semantik]...',
|
|
30
|
-
inactiveModule: fileName => `Modul tidak aktif ditemukan [${fileName}]. Meminta analisis presisi tinggi dari 9S`,
|
|
31
|
-
capturedRuntimeSignal: fileName => `Sinyal runtime tertangkap [${fileName}]. Menjalankan penyelarasan otomatis...`,
|
|
32
|
-
reconEncryptedData: fileName => `Sumber data terenkripsi ditemukan [${fileName}]. Mencoba protokol penyelarasan semantik...`,
|
|
33
|
-
bridgeProtocolComplete: (count, time) => `Protokol jembatan semantik selesai. ${count} perbedaan field telah diperbaiki. Waktu: ${time}s`,
|
|
34
|
-
unknownModule: fileName => `Resource modul [${fileName}] tidak ditemukan dalam database Bunker. Jalankan konstruksi visual terlebih dahulu`,
|
|
35
|
-
},
|
|
36
|
-
bunker: {
|
|
37
|
-
exit: 'Sinyal sistem telah hilang...',
|
|
38
|
-
envCopy: 'File .env berhasil disimpan',
|
|
39
|
-
systemStandby: 'Sistem dalam mode standby...',
|
|
40
|
-
configCopy: 'File config.js berhasil disimpan',
|
|
41
|
-
desc: 'Generator kode CRUD frontend berbasis AI',
|
|
42
|
-
argDesc: 'Menentukan template framework frontend',
|
|
43
|
-
envCheck: 'File .env sudah tersedia. Pembuatan dilewati',
|
|
44
|
-
configCheck: 'File config.js sudah tersedia. Pembuatan dilewati',
|
|
45
|
-
copyTemplateError: virus => `Konstruksi template gagal: ${virus}`,
|
|
46
|
-
linkSevered: 'Koneksi terputus: periksa jaringan atau resonansi Black Box',
|
|
47
|
-
towerOnline: port => `Menara intersepsi sinyal aktif [Frekuensi: ${port}]`,
|
|
48
|
-
initDesc: 'Menginisialisasi lingkungan konstruksi Bunker di direktori saat ini',
|
|
49
|
-
accessDenied: 'Akses ditolak pusat komando: API Key tidak valid atau kuota habis',
|
|
50
|
-
bootDesc: 'Mengaktifkan pemantauan multi-kanal: konstruksi Page/Part/API terpadu',
|
|
51
|
-
star: 'Jika proyek ini membantu menghemat waktu Anda, berikan bintang di GitHub ⭐',
|
|
52
|
-
systemOffline: 'Memutus koneksi neural cloud. Menjalankan penyegelan fisik data...',
|
|
53
|
-
dataSynced: 'Seluruh data konstruksi telah disinkronkan dengan node penyimpanan Bunker',
|
|
54
|
-
towerConnected: port => `Perintah: arahkan target proxy Anda ke http://localhost:${port}`,
|
|
55
|
-
frameworkNotSupported: template => `Framework [${template}] belum didukung. Pull Request sangat diterima`,
|
|
56
|
-
disclaimer: 'Hasil pencocokan hanya sebagai referensi. Setiap unit harus menyesuaikan dengan kondisi nyata',
|
|
57
|
-
initComplete: cmd => `Deploy Bunker selesai. Tambahkan ${cmd} ke scripts package.json untuk akses lebih cepat`,
|
|
58
|
-
networkInstability: count => `Jaringan neural cloud tidak stabil. Mencoba koneksi ulang... (percobaan ${count})`,
|
|
59
|
-
copyEnum: '│ Kode genetik backend asli (Enum) terdeteksi\n│ Rekomendasi: pasang potongan kode berikut ke pusat resource modul',
|
|
60
|
-
strategicThreshold: (target, current) => `Jumlah konstruksi telah melewati ambang strategis ${target}! Kekuatan saat ini: ${current}`,
|
|
61
|
-
isLegendary: (unlockAchievement, current, target) => unlockAchievement ? 'Selamat komandan. Protokol konstruksi Anda telah menjadi bagian dari kejayaan umat manusia' : `Jumlah konstruksi saat ini: ${current}. Tersisa ${target - current} operasi menuju medali`,
|
|
62
|
-
},
|
|
63
|
-
operator6O: {
|
|
64
|
-
call2B: 'Memanggil 2B. Sistem pemantauan seluruh kanal Bunker siap!',
|
|
65
|
-
}
|
|
66
|
-
}
|