openxiangda-devkit-core 2.0.0-alpha.12 → 2.0.0-alpha.121
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 +3 -8
- package/dist/app-spec.d.ts +228 -0
- package/dist/app-spec.d.ts.map +1 -0
- package/dist/app-spec.js +1443 -0
- package/dist/app-spec.js.map +1 -0
- package/dist/application-services.d.ts +996 -49
- package/dist/application-services.d.ts.map +1 -1
- package/dist/application-services.js +1348 -197
- package/dist/application-services.js.map +1 -1
- package/dist/application-ui-contract.d.ts +5 -0
- package/dist/application-ui-contract.d.ts.map +1 -0
- package/dist/application-ui-contract.js +149 -0
- package/dist/application-ui-contract.js.map +1 -0
- package/dist/backend-image-build.d.ts +23 -0
- package/dist/backend-image-build.d.ts.map +1 -0
- package/dist/backend-image-build.js +204 -0
- package/dist/backend-image-build.js.map +1 -0
- package/dist/command-process.d.ts +14 -0
- package/dist/command-process.d.ts.map +1 -0
- package/dist/command-process.js +51 -0
- package/dist/command-process.js.map +1 -0
- package/dist/command-registry.d.ts +123 -366
- package/dist/command-registry.d.ts.map +1 -1
- package/dist/command-registry.js +26 -266
- package/dist/command-registry.js.map +1 -1
- package/dist/compiler/ai-catalog.d.ts +4 -0
- package/dist/compiler/ai-catalog.d.ts.map +1 -0
- package/dist/compiler/ai-catalog.js +354 -0
- package/dist/compiler/ai-catalog.js.map +1 -0
- package/dist/compiler/application-model.d.ts +60 -0
- package/dist/compiler/application-model.d.ts.map +1 -0
- package/dist/compiler/application-model.js +141 -0
- package/dist/compiler/application-model.js.map +1 -0
- package/dist/compiler/authorization-transition.d.ts +7 -0
- package/dist/compiler/authorization-transition.d.ts.map +1 -0
- package/dist/compiler/authorization-transition.js +27 -0
- package/dist/compiler/authorization-transition.js.map +1 -0
- package/dist/compiler/bundle.d.ts +34 -0
- package/dist/compiler/bundle.d.ts.map +1 -0
- package/dist/compiler/bundle.js +1910 -0
- package/dist/compiler/bundle.js.map +1 -0
- package/dist/compiler/config.d.ts +882 -0
- package/dist/compiler/config.d.ts.map +1 -0
- package/dist/compiler/config.js +4118 -0
- package/dist/compiler/config.js.map +1 -0
- package/dist/compiler/data-policy-expression.d.ts +12 -0
- package/dist/compiler/data-policy-expression.d.ts.map +1 -0
- package/dist/compiler/data-policy-expression.js +43 -0
- package/dist/compiler/data-policy-expression.js.map +1 -0
- package/dist/compiler/field-codec.d.ts +14 -0
- package/dist/compiler/field-codec.d.ts.map +1 -0
- package/dist/compiler/field-codec.js +131 -0
- package/dist/compiler/field-codec.js.map +1 -0
- package/dist/compiler/field-physical-plan.d.ts +10 -0
- package/dist/compiler/field-physical-plan.d.ts.map +1 -0
- package/dist/compiler/field-physical-plan.js +66 -0
- package/dist/compiler/field-physical-plan.js.map +1 -0
- package/dist/compiler/field-policy-path.d.ts +10 -0
- package/dist/compiler/field-policy-path.d.ts.map +1 -0
- package/dist/compiler/field-policy-path.js +283 -0
- package/dist/compiler/field-policy-path.js.map +1 -0
- package/dist/compiler/field-query-plan.d.ts +13 -0
- package/dist/compiler/field-query-plan.d.ts.map +1 -0
- package/dist/compiler/field-query-plan.js +122 -0
- package/dist/compiler/field-query-plan.js.map +1 -0
- package/dist/compiler/field-surface.d.ts +15 -0
- package/dist/compiler/field-surface.d.ts.map +1 -0
- package/dist/compiler/field-surface.js +51 -0
- package/dist/compiler/field-surface.js.map +1 -0
- package/dist/compiler/index.d.ts +6 -0
- package/dist/compiler/index.d.ts.map +1 -0
- package/dist/compiler/index.js +6 -0
- package/dist/compiler/index.js.map +1 -0
- package/dist/compiler/package-compiler.d.ts +22 -0
- package/dist/compiler/package-compiler.d.ts.map +1 -0
- package/dist/compiler/package-compiler.js +257 -0
- package/dist/compiler/package-compiler.js.map +1 -0
- package/dist/compiler/permission-review.d.ts +139 -0
- package/dist/compiler/permission-review.d.ts.map +1 -0
- package/dist/compiler/permission-review.js +131 -0
- package/dist/compiler/permission-review.js.map +1 -0
- package/dist/compiler/schema-composition.d.ts +21 -0
- package/dist/compiler/schema-composition.d.ts.map +1 -0
- package/dist/compiler/schema-composition.js +193 -0
- package/dist/compiler/schema-composition.js.map +1 -0
- package/dist/config.d.ts +1 -1
- package/dist/config.js +1 -1
- package/dist/configuration-preflight.d.ts +7 -0
- package/dist/configuration-preflight.d.ts.map +1 -0
- package/dist/configuration-preflight.js +13 -0
- package/dist/configuration-preflight.js.map +1 -0
- package/dist/connected-development.d.ts +62 -0
- package/dist/connected-development.d.ts.map +1 -0
- package/dist/connected-development.js +393 -0
- package/dist/connected-development.js.map +1 -0
- package/dist/control-plane-client.d.ts +353 -123
- package/dist/control-plane-client.d.ts.map +1 -1
- package/dist/control-plane-client.js +420 -141
- package/dist/control-plane-client.js.map +1 -1
- package/dist/delivery-cache.d.ts +34 -0
- package/dist/delivery-cache.d.ts.map +1 -0
- package/dist/delivery-cache.js +186 -0
- package/dist/delivery-cache.js.map +1 -0
- package/dist/delivery-source.d.ts +17 -0
- package/dist/delivery-source.d.ts.map +1 -0
- package/dist/delivery-source.js +85 -0
- package/dist/delivery-source.js.map +1 -0
- package/dist/deployment-observer.d.ts +14 -0
- package/dist/deployment-observer.d.ts.map +1 -0
- package/dist/deployment-observer.js +68 -0
- package/dist/deployment-observer.js.map +1 -0
- package/dist/deployment.d.ts +55 -3
- package/dist/deployment.d.ts.map +1 -1
- package/dist/deployment.js +182 -21
- package/dist/deployment.js.map +1 -1
- package/dist/design-readiness.d.ts +24 -0
- package/dist/design-readiness.d.ts.map +1 -0
- package/dist/design-readiness.js +102 -0
- package/dist/design-readiness.js.map +1 -0
- package/dist/developer-errors.d.ts +11 -0
- package/dist/developer-errors.d.ts.map +1 -0
- package/dist/developer-errors.js +16 -0
- package/dist/developer-errors.js.map +1 -0
- package/dist/developer-operations.d.ts +188 -0
- package/dist/developer-operations.d.ts.map +1 -0
- package/dist/developer-operations.js +58 -0
- package/dist/developer-operations.js.map +1 -0
- package/dist/development-lifecycle.d.ts +75 -0
- package/dist/development-lifecycle.d.ts.map +1 -0
- package/dist/development-lifecycle.js +189 -0
- package/dist/development-lifecycle.js.map +1 -0
- package/dist/documentation.d.ts +111 -0
- package/dist/documentation.d.ts.map +1 -0
- package/dist/documentation.js +112 -0
- package/dist/documentation.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -1
- package/dist/internal/workflow.d.ts +83 -0
- package/dist/internal/workflow.d.ts.map +1 -0
- package/dist/internal/workflow.js +419 -0
- package/dist/internal/workflow.js.map +1 -0
- package/dist/nest-injection-contract.d.ts +4 -0
- package/dist/nest-injection-contract.d.ts.map +1 -0
- package/dist/nest-injection-contract.js +116 -0
- package/dist/nest-injection-contract.js.map +1 -0
- package/dist/operation-progress.d.ts +26 -0
- package/dist/operation-progress.d.ts.map +1 -0
- package/dist/operation-progress.js +92 -0
- package/dist/operation-progress.js.map +1 -0
- package/dist/optional-backend.d.ts +14 -0
- package/dist/optional-backend.d.ts.map +1 -0
- package/dist/optional-backend.js +145 -0
- package/dist/optional-backend.js.map +1 -0
- package/dist/package-compiler.d.ts +1 -1
- package/dist/package-compiler.d.ts.map +1 -1
- package/dist/package-compiler.js +1 -1
- package/dist/package-compiler.js.map +1 -1
- package/dist/session.d.ts +149 -4
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +362 -23
- package/dist/session.js.map +1 -1
- package/dist/testing.d.ts +77 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +213 -0
- package/dist/testing.js.map +1 -0
- package/dist/toolchain-capsule.d.ts +45 -0
- package/dist/toolchain-capsule.d.ts.map +1 -0
- package/dist/toolchain-capsule.js +165 -0
- package/dist/toolchain-capsule.js.map +1 -0
- package/dist/workspace-loader.d.ts +1 -1
- package/dist/workspace-loader.d.ts.map +1 -1
- package/dist/workspace-loader.js +35 -3
- package/dist/workspace-loader.js.map +1 -1
- package/dist/workspace-operation.d.ts +3 -0
- package/dist/workspace-operation.d.ts.map +1 -0
- package/dist/workspace-operation.js +45 -0
- package/dist/workspace-operation.js.map +1 -0
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +37 -1
- package/dist/workspace.js.map +1 -1
- package/package.json +16 -4
- package/templates/backend/Dockerfile +20 -0
- package/templates/backend/package.json +27 -0
- package/templates/backend/src/app.module.ts +23 -0
- package/templates/backend/src/main.ts +5 -0
- package/templates/backend/tsconfig.json +9 -0
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { runCommandProcess } from './command-process.js';
|
|
2
|
+
import { existsSync, mkdtempSync, readFileSync, rmSync, } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { isAbsolute, join, relative, resolve } from "node:path";
|
|
5
|
+
import { randomUUID } from "node:crypto";
|
|
6
|
+
import { isIP } from "node:net";
|
|
7
|
+
const MAX_REPOSITORY_PREFIX_LENGTH = 200;
|
|
8
|
+
const MAX_REPOSITORY_PREFIX_SEGMENTS = 32;
|
|
9
|
+
const BACKEND_IMAGE_NETWORK_ATTEMPTS = 3;
|
|
10
|
+
const BACKEND_IMAGE_NETWORK_RETRY_DELAYS_MS = [250, 750];
|
|
11
|
+
const REPOSITORY_COMPONENT = /^[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*$/;
|
|
12
|
+
const DOMAIN_COMPONENT = /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/;
|
|
13
|
+
const SHA256_DIGEST = /^sha256:[a-f0-9]{64}$/;
|
|
14
|
+
export class BackendImageBuildError extends Error {
|
|
15
|
+
code;
|
|
16
|
+
retryable;
|
|
17
|
+
constructor(code, message, retryable = false) {
|
|
18
|
+
super(`${code}: ${message}`);
|
|
19
|
+
this.code = code;
|
|
20
|
+
this.retryable = retryable;
|
|
21
|
+
this.name = "BackendImageBuildError";
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function backendImageBuildTarget(capabilities, appCode) {
|
|
25
|
+
const build = capabilities.deployment?.backendImageBuild;
|
|
26
|
+
if (!build ||
|
|
27
|
+
build.owner !== "developer-cli" ||
|
|
28
|
+
typeof build.available !== "boolean" ||
|
|
29
|
+
build.platform !== "linux/amd64") {
|
|
30
|
+
throw new BackendImageBuildError("OPENXIANGDA_BACKEND_IMAGE_BUILD_CONFIG_INVALID", "平台返回了不受支持的后端镜像构建合同");
|
|
31
|
+
}
|
|
32
|
+
if (!build.available) {
|
|
33
|
+
throw new BackendImageBuildError("OPENXIANGDA_BACKEND_IMAGE_BUILD_UNAVAILABLE", "平台尚未配置可运行的应用后端镜像环境,请联系平台管理员配置后重试");
|
|
34
|
+
}
|
|
35
|
+
const prefix = build.repositoryPrefix;
|
|
36
|
+
if (typeof prefix !== "string" ||
|
|
37
|
+
prefix.trim() !== prefix ||
|
|
38
|
+
!validOciRepositoryPrefix(prefix)) {
|
|
39
|
+
throw new BackendImageBuildError("OPENXIANGDA_BACKEND_IMAGE_REPOSITORY_INVALID", "平台返回的后端镜像 repositoryPrefix 不是安全的 OCI repository 前缀");
|
|
40
|
+
}
|
|
41
|
+
if (!/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/.test(appCode)) {
|
|
42
|
+
throw new BackendImageBuildError("OPENXIANGDA_BACKEND_IMAGE_APP_CODE_INVALID", "应用代码不能用于后端镜像仓库");
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
repository: `${prefix}/${appCode}-server`,
|
|
46
|
+
platform: build.platform,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function validOciRepositoryPrefix(value) {
|
|
50
|
+
if (!value ||
|
|
51
|
+
value.length > MAX_REPOSITORY_PREFIX_LENGTH ||
|
|
52
|
+
value !== value.toLowerCase() ||
|
|
53
|
+
value.includes("://") ||
|
|
54
|
+
/[@?#%\\\s]/.test(value)) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
const segments = value.split("/");
|
|
58
|
+
if (segments.length > MAX_REPOSITORY_PREFIX_SEGMENTS ||
|
|
59
|
+
segments.some(segment => !segment || segment === "." || segment === "..")) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
const [first, ...remaining] = segments;
|
|
63
|
+
if (!first)
|
|
64
|
+
return false;
|
|
65
|
+
const explicitRegistry = first === "localhost" ||
|
|
66
|
+
first.includes(".") ||
|
|
67
|
+
first.includes(":") ||
|
|
68
|
+
first.startsWith("[");
|
|
69
|
+
if (explicitRegistry && !validRegistry(first))
|
|
70
|
+
return false;
|
|
71
|
+
const repositorySegments = explicitRegistry ? remaining : segments;
|
|
72
|
+
return repositorySegments.every(segment => REPOSITORY_COMPONENT.test(segment) && !segment.includes(":"));
|
|
73
|
+
}
|
|
74
|
+
function validRegistry(value) {
|
|
75
|
+
if (value.startsWith("[")) {
|
|
76
|
+
const match = /^\[([^\]]+)\](?::([0-9]{1,5}))?$/.exec(value);
|
|
77
|
+
return Boolean(match && isIP(match[1]) === 6 && validPort(match[2]));
|
|
78
|
+
}
|
|
79
|
+
const match = /^([^:]+)(?::([0-9]{1,5}))?$/.exec(value);
|
|
80
|
+
if (!match || !validPort(match[2]))
|
|
81
|
+
return false;
|
|
82
|
+
const host = match[1];
|
|
83
|
+
if (isIP(host) === 4)
|
|
84
|
+
return true;
|
|
85
|
+
return host.split(".").every(component => DOMAIN_COMPONENT.test(component));
|
|
86
|
+
}
|
|
87
|
+
function validPort(value) {
|
|
88
|
+
if (value === undefined)
|
|
89
|
+
return true;
|
|
90
|
+
const port = Number(value);
|
|
91
|
+
return Number.isSafeInteger(port) && port >= 1 && port <= 65535;
|
|
92
|
+
}
|
|
93
|
+
export async function publishBackendImage(input) {
|
|
94
|
+
const root = resolve(input.root);
|
|
95
|
+
const dockerfile = resolve(root, input.backendRoot, "Dockerfile");
|
|
96
|
+
const relativeDockerfile = relative(root, dockerfile);
|
|
97
|
+
if (!relativeDockerfile ||
|
|
98
|
+
relativeDockerfile.startsWith("..") ||
|
|
99
|
+
isAbsolute(relativeDockerfile)) {
|
|
100
|
+
throw new BackendImageBuildError("OPENXIANGDA_BACKEND_DOCKERFILE_OUTSIDE_WORKSPACE", "后端 Dockerfile 必须位于应用工作区内");
|
|
101
|
+
}
|
|
102
|
+
if (!existsSync(dockerfile)) {
|
|
103
|
+
throw new BackendImageBuildError("OPENXIANGDA_BACKEND_DOCKERFILE_MISSING", `官方后端 Dockerfile 不存在: ${relativeDockerfile}`);
|
|
104
|
+
}
|
|
105
|
+
if (!existsSync(join(root, ".dockerignore"))) {
|
|
106
|
+
throw new BackendImageBuildError("OPENXIANGDA_DOCKERIGNORE_MISSING", "工作区缺少模板 .dockerignore,拒绝上传未受约束的构建上下文");
|
|
107
|
+
}
|
|
108
|
+
const docker = input.dockerExecutable || "docker";
|
|
109
|
+
const version = await runDocker(docker, ["buildx", "version"], root);
|
|
110
|
+
if (version.error?.code === "ENOENT") {
|
|
111
|
+
throw new BackendImageBuildError("OPENXIANGDA_DOCKER_REQUIRED", "未找到 Docker CLI,请安装并启动 Docker Desktop");
|
|
112
|
+
}
|
|
113
|
+
if (version.error || version.status !== 0) {
|
|
114
|
+
throw new BackendImageBuildError("OPENXIANGDA_DOCKER_BUILDX_REQUIRED", "当前 Docker CLI 未提供可用的 Buildx");
|
|
115
|
+
}
|
|
116
|
+
const scratch = mkdtempSync(join(tmpdir(), "openxiangda-buildx-"));
|
|
117
|
+
const metadataFile = join(scratch, "metadata.json");
|
|
118
|
+
const revision = String(input.sourceRevision || "").toLowerCase();
|
|
119
|
+
const sourceKey = /^[a-f0-9]{7,64}$/.test(revision)
|
|
120
|
+
? revision.slice(0, 12)
|
|
121
|
+
: "local";
|
|
122
|
+
const tag = `ox2-${sourceKey}-${randomUUID().slice(0, 8)}`;
|
|
123
|
+
try {
|
|
124
|
+
for (let attempt = 1; attempt <= BACKEND_IMAGE_NETWORK_ATTEMPTS; attempt += 1) {
|
|
125
|
+
rmSync(metadataFile, { force: true });
|
|
126
|
+
const built = await runDocker(docker, [
|
|
127
|
+
"buildx",
|
|
128
|
+
"build",
|
|
129
|
+
"--file",
|
|
130
|
+
dockerfile,
|
|
131
|
+
"--platform",
|
|
132
|
+
input.target.platform,
|
|
133
|
+
"--provenance=false",
|
|
134
|
+
"--tag",
|
|
135
|
+
`${input.target.repository}:${tag}`,
|
|
136
|
+
"--metadata-file",
|
|
137
|
+
metadataFile,
|
|
138
|
+
"--push",
|
|
139
|
+
root,
|
|
140
|
+
], root);
|
|
141
|
+
if (built.error?.code === "ENOENT") {
|
|
142
|
+
throw new BackendImageBuildError("OPENXIANGDA_DOCKER_REQUIRED", "未找到 Docker CLI,请安装并启动 Docker Desktop");
|
|
143
|
+
}
|
|
144
|
+
if (!built.error && built.status === 0)
|
|
145
|
+
break;
|
|
146
|
+
const failure = buildFailure(built.output);
|
|
147
|
+
if (failure.code !== "OPENXIANGDA_BACKEND_IMAGE_PUSH_FAILED" ||
|
|
148
|
+
attempt === BACKEND_IMAGE_NETWORK_ATTEMPTS) {
|
|
149
|
+
if (failure.code === "OPENXIANGDA_BACKEND_IMAGE_PUSH_FAILED" &&
|
|
150
|
+
attempt === BACKEND_IMAGE_NETWORK_ATTEMPTS) {
|
|
151
|
+
throw new BackendImageBuildError(failure.code, `后端镜像构建或推送连续 ${BACKEND_IMAGE_NETWORK_ATTEMPTS} 次遇到临时网络故障`, true);
|
|
152
|
+
}
|
|
153
|
+
throw failure;
|
|
154
|
+
}
|
|
155
|
+
await wait(BACKEND_IMAGE_NETWORK_RETRY_DELAYS_MS[attempt - 1] || 0);
|
|
156
|
+
}
|
|
157
|
+
let metadata;
|
|
158
|
+
try {
|
|
159
|
+
metadata = JSON.parse(readFileSync(metadataFile, "utf8"));
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
throw new BackendImageBuildError("OPENXIANGDA_BACKEND_IMAGE_DIGEST_MISSING", "Buildx 没有返回可解析的镜像 metadata digest");
|
|
163
|
+
}
|
|
164
|
+
const digest = String(metadata["containerimage.digest"] || "").toLowerCase();
|
|
165
|
+
if (!SHA256_DIGEST.test(digest)) {
|
|
166
|
+
throw new BackendImageBuildError("OPENXIANGDA_BACKEND_IMAGE_DIGEST_MISSING", "Buildx metadata 没有返回合法 sha256 镜像摘要");
|
|
167
|
+
}
|
|
168
|
+
return {
|
|
169
|
+
...input.target,
|
|
170
|
+
digest,
|
|
171
|
+
reference: `${input.target.repository}@${digest}`,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
finally {
|
|
175
|
+
rmSync(scratch, { recursive: true, force: true });
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
async function runDocker(executable, args, cwd) {
|
|
179
|
+
const environment = { ...process.env };
|
|
180
|
+
delete environment.OPENXIANGDA_TOKEN;
|
|
181
|
+
delete environment.OPENXIANGDA_BACKEND_IMAGE;
|
|
182
|
+
const result = await runCommandProcess(executable, args, { cwd, env: environment });
|
|
183
|
+
return {
|
|
184
|
+
status: result.status,
|
|
185
|
+
error: result.error,
|
|
186
|
+
output: result.output,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
function wait(delayMs) {
|
|
190
|
+
return new Promise(resolve => setTimeout(resolve, delayMs));
|
|
191
|
+
}
|
|
192
|
+
function buildFailure(output) {
|
|
193
|
+
if (/cannot connect|daemon is not running|is the docker daemon running/i.test(output)) {
|
|
194
|
+
return new BackendImageBuildError("OPENXIANGDA_DOCKER_DAEMON_UNAVAILABLE", "Docker daemon 不可用,请启动 Docker Desktop 后重试", true);
|
|
195
|
+
}
|
|
196
|
+
if (/unauthorized|authentication required|requested access.*denied|denied:/i.test(output)) {
|
|
197
|
+
return new BackendImageBuildError("OPENXIANGDA_REGISTRY_AUTH_REQUIRED", "镜像仓库拒绝推送,请先在本机 Docker credential store 完成登录");
|
|
198
|
+
}
|
|
199
|
+
if (/timeout|temporary failure|connection reset|econnreset|fetch failed|network is unreachable|unexpected eof|socket disconnected before secure tls|socket hang up|etimedout/i.test(output)) {
|
|
200
|
+
return new BackendImageBuildError("OPENXIANGDA_BACKEND_IMAGE_PUSH_FAILED", "后端镜像构建或推送遇到临时网络故障", true);
|
|
201
|
+
}
|
|
202
|
+
return new BackendImageBuildError("OPENXIANGDA_BACKEND_IMAGE_BUILD_FAILED", "后端镜像构建或推送失败;请检查官方 Dockerfile 与本机 Docker 状态");
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=backend-image-build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend-image-build.js","sourceRoot":"","sources":["../src/backend-image-build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** 异步收集有界输出,让阶段心跳与 MCP 通知在检查、测试和 Docker 构建期间持续执行。 */
|
|
2
|
+
export declare function runCommandProcess(command: string, args: string[], options: {
|
|
3
|
+
cwd: string;
|
|
4
|
+
env?: NodeJS.ProcessEnv;
|
|
5
|
+
timeoutMs?: number;
|
|
6
|
+
maximumOutputBytes?: number;
|
|
7
|
+
}): Promise<{
|
|
8
|
+
ok: boolean;
|
|
9
|
+
status: number | null;
|
|
10
|
+
output: string;
|
|
11
|
+
outputTruncated: boolean;
|
|
12
|
+
error?: NodeJS.ErrnoException;
|
|
13
|
+
}>;
|
|
14
|
+
//# sourceMappingURL=command-process.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-process.d.ts","sourceRoot":"","sources":["../src/command-process.ts"],"names":[],"mappings":"AAEA,qDAAqD;AACrD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE;IAC1E,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;QAC0B,OAAO;YAAU,MAAM,GAAG,IAAI;YAAU,MAAM;qBAAmB,OAAO;YAAU,MAAM,CAAC,cAAc;GAsCjI"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
/** 异步收集有界输出,让阶段心跳与 MCP 通知在检查、测试和 Docker 构建期间持续执行。 */
|
|
3
|
+
export function runCommandProcess(command, args, options) {
|
|
4
|
+
return new Promise(resolve => {
|
|
5
|
+
const limit = Math.max(1, options.maximumOutputBytes ?? 4 * 1024 * 1024);
|
|
6
|
+
const chunks = [];
|
|
7
|
+
let outputBytes = 0;
|
|
8
|
+
let outputTruncated = false;
|
|
9
|
+
let processError;
|
|
10
|
+
const child = spawn(command, args, { cwd: options.cwd, env: options.env || process.env, stdio: ['ignore', 'pipe', 'pipe'] });
|
|
11
|
+
const collect = (chunk) => {
|
|
12
|
+
chunks.push(chunk);
|
|
13
|
+
outputBytes += chunk.length;
|
|
14
|
+
while (outputBytes > limit) {
|
|
15
|
+
outputTruncated = true;
|
|
16
|
+
const first = chunks[0];
|
|
17
|
+
const excess = outputBytes - limit;
|
|
18
|
+
if (first.length <= excess) {
|
|
19
|
+
chunks.shift();
|
|
20
|
+
outputBytes -= first.length;
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
chunks[0] = first.subarray(excess);
|
|
24
|
+
outputBytes -= excess;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
child.stdout.on('data', collect);
|
|
29
|
+
child.stderr.on('data', collect);
|
|
30
|
+
let killTimer;
|
|
31
|
+
const timer = setTimeout(() => {
|
|
32
|
+
processError = Object.assign(new Error('子进程超过运行时限'), { code: 'ETIMEDOUT' });
|
|
33
|
+
child.kill('SIGTERM');
|
|
34
|
+
killTimer = setTimeout(() => child.kill('SIGKILL'), 5_000);
|
|
35
|
+
killTimer.unref();
|
|
36
|
+
}, options.timeoutMs ?? 30 * 60_000);
|
|
37
|
+
timer.unref();
|
|
38
|
+
child.on('error', error => { processError = error; });
|
|
39
|
+
child.on('close', status => {
|
|
40
|
+
clearTimeout(timer);
|
|
41
|
+
if (killTimer)
|
|
42
|
+
clearTimeout(killTimer);
|
|
43
|
+
resolve({
|
|
44
|
+
ok: status === 0 && !processError, status,
|
|
45
|
+
output: `${outputTruncated ? '[前段日志超过输出预算,已省略]\n' : ''}${Buffer.concat(chunks, outputBytes).toString('utf8')}`,
|
|
46
|
+
outputTruncated, ...(processError ? { error: processError } : {}),
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=command-process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-process.js","sourceRoot":"","sources":["../src/command-process.ts"],"names":[],"mappings":"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"}
|