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.
Files changed (188) hide show
  1. package/README.md +3 -8
  2. package/dist/app-spec.d.ts +228 -0
  3. package/dist/app-spec.d.ts.map +1 -0
  4. package/dist/app-spec.js +1443 -0
  5. package/dist/app-spec.js.map +1 -0
  6. package/dist/application-services.d.ts +996 -49
  7. package/dist/application-services.d.ts.map +1 -1
  8. package/dist/application-services.js +1348 -197
  9. package/dist/application-services.js.map +1 -1
  10. package/dist/application-ui-contract.d.ts +5 -0
  11. package/dist/application-ui-contract.d.ts.map +1 -0
  12. package/dist/application-ui-contract.js +149 -0
  13. package/dist/application-ui-contract.js.map +1 -0
  14. package/dist/backend-image-build.d.ts +23 -0
  15. package/dist/backend-image-build.d.ts.map +1 -0
  16. package/dist/backend-image-build.js +204 -0
  17. package/dist/backend-image-build.js.map +1 -0
  18. package/dist/command-process.d.ts +14 -0
  19. package/dist/command-process.d.ts.map +1 -0
  20. package/dist/command-process.js +51 -0
  21. package/dist/command-process.js.map +1 -0
  22. package/dist/command-registry.d.ts +123 -366
  23. package/dist/command-registry.d.ts.map +1 -1
  24. package/dist/command-registry.js +26 -266
  25. package/dist/command-registry.js.map +1 -1
  26. package/dist/compiler/ai-catalog.d.ts +4 -0
  27. package/dist/compiler/ai-catalog.d.ts.map +1 -0
  28. package/dist/compiler/ai-catalog.js +354 -0
  29. package/dist/compiler/ai-catalog.js.map +1 -0
  30. package/dist/compiler/application-model.d.ts +60 -0
  31. package/dist/compiler/application-model.d.ts.map +1 -0
  32. package/dist/compiler/application-model.js +141 -0
  33. package/dist/compiler/application-model.js.map +1 -0
  34. package/dist/compiler/authorization-transition.d.ts +7 -0
  35. package/dist/compiler/authorization-transition.d.ts.map +1 -0
  36. package/dist/compiler/authorization-transition.js +27 -0
  37. package/dist/compiler/authorization-transition.js.map +1 -0
  38. package/dist/compiler/bundle.d.ts +34 -0
  39. package/dist/compiler/bundle.d.ts.map +1 -0
  40. package/dist/compiler/bundle.js +1910 -0
  41. package/dist/compiler/bundle.js.map +1 -0
  42. package/dist/compiler/config.d.ts +882 -0
  43. package/dist/compiler/config.d.ts.map +1 -0
  44. package/dist/compiler/config.js +4118 -0
  45. package/dist/compiler/config.js.map +1 -0
  46. package/dist/compiler/data-policy-expression.d.ts +12 -0
  47. package/dist/compiler/data-policy-expression.d.ts.map +1 -0
  48. package/dist/compiler/data-policy-expression.js +43 -0
  49. package/dist/compiler/data-policy-expression.js.map +1 -0
  50. package/dist/compiler/field-codec.d.ts +14 -0
  51. package/dist/compiler/field-codec.d.ts.map +1 -0
  52. package/dist/compiler/field-codec.js +131 -0
  53. package/dist/compiler/field-codec.js.map +1 -0
  54. package/dist/compiler/field-physical-plan.d.ts +10 -0
  55. package/dist/compiler/field-physical-plan.d.ts.map +1 -0
  56. package/dist/compiler/field-physical-plan.js +66 -0
  57. package/dist/compiler/field-physical-plan.js.map +1 -0
  58. package/dist/compiler/field-policy-path.d.ts +10 -0
  59. package/dist/compiler/field-policy-path.d.ts.map +1 -0
  60. package/dist/compiler/field-policy-path.js +283 -0
  61. package/dist/compiler/field-policy-path.js.map +1 -0
  62. package/dist/compiler/field-query-plan.d.ts +13 -0
  63. package/dist/compiler/field-query-plan.d.ts.map +1 -0
  64. package/dist/compiler/field-query-plan.js +122 -0
  65. package/dist/compiler/field-query-plan.js.map +1 -0
  66. package/dist/compiler/field-surface.d.ts +15 -0
  67. package/dist/compiler/field-surface.d.ts.map +1 -0
  68. package/dist/compiler/field-surface.js +51 -0
  69. package/dist/compiler/field-surface.js.map +1 -0
  70. package/dist/compiler/index.d.ts +6 -0
  71. package/dist/compiler/index.d.ts.map +1 -0
  72. package/dist/compiler/index.js +6 -0
  73. package/dist/compiler/index.js.map +1 -0
  74. package/dist/compiler/package-compiler.d.ts +22 -0
  75. package/dist/compiler/package-compiler.d.ts.map +1 -0
  76. package/dist/compiler/package-compiler.js +257 -0
  77. package/dist/compiler/package-compiler.js.map +1 -0
  78. package/dist/compiler/permission-review.d.ts +139 -0
  79. package/dist/compiler/permission-review.d.ts.map +1 -0
  80. package/dist/compiler/permission-review.js +131 -0
  81. package/dist/compiler/permission-review.js.map +1 -0
  82. package/dist/compiler/schema-composition.d.ts +21 -0
  83. package/dist/compiler/schema-composition.d.ts.map +1 -0
  84. package/dist/compiler/schema-composition.js +193 -0
  85. package/dist/compiler/schema-composition.js.map +1 -0
  86. package/dist/config.d.ts +1 -1
  87. package/dist/config.js +1 -1
  88. package/dist/configuration-preflight.d.ts +7 -0
  89. package/dist/configuration-preflight.d.ts.map +1 -0
  90. package/dist/configuration-preflight.js +13 -0
  91. package/dist/configuration-preflight.js.map +1 -0
  92. package/dist/connected-development.d.ts +62 -0
  93. package/dist/connected-development.d.ts.map +1 -0
  94. package/dist/connected-development.js +393 -0
  95. package/dist/connected-development.js.map +1 -0
  96. package/dist/control-plane-client.d.ts +353 -123
  97. package/dist/control-plane-client.d.ts.map +1 -1
  98. package/dist/control-plane-client.js +420 -141
  99. package/dist/control-plane-client.js.map +1 -1
  100. package/dist/delivery-cache.d.ts +34 -0
  101. package/dist/delivery-cache.d.ts.map +1 -0
  102. package/dist/delivery-cache.js +186 -0
  103. package/dist/delivery-cache.js.map +1 -0
  104. package/dist/delivery-source.d.ts +17 -0
  105. package/dist/delivery-source.d.ts.map +1 -0
  106. package/dist/delivery-source.js +85 -0
  107. package/dist/delivery-source.js.map +1 -0
  108. package/dist/deployment-observer.d.ts +14 -0
  109. package/dist/deployment-observer.d.ts.map +1 -0
  110. package/dist/deployment-observer.js +68 -0
  111. package/dist/deployment-observer.js.map +1 -0
  112. package/dist/deployment.d.ts +55 -3
  113. package/dist/deployment.d.ts.map +1 -1
  114. package/dist/deployment.js +182 -21
  115. package/dist/deployment.js.map +1 -1
  116. package/dist/design-readiness.d.ts +24 -0
  117. package/dist/design-readiness.d.ts.map +1 -0
  118. package/dist/design-readiness.js +102 -0
  119. package/dist/design-readiness.js.map +1 -0
  120. package/dist/developer-errors.d.ts +11 -0
  121. package/dist/developer-errors.d.ts.map +1 -0
  122. package/dist/developer-errors.js +16 -0
  123. package/dist/developer-errors.js.map +1 -0
  124. package/dist/developer-operations.d.ts +188 -0
  125. package/dist/developer-operations.d.ts.map +1 -0
  126. package/dist/developer-operations.js +58 -0
  127. package/dist/developer-operations.js.map +1 -0
  128. package/dist/development-lifecycle.d.ts +75 -0
  129. package/dist/development-lifecycle.d.ts.map +1 -0
  130. package/dist/development-lifecycle.js +189 -0
  131. package/dist/development-lifecycle.js.map +1 -0
  132. package/dist/documentation.d.ts +111 -0
  133. package/dist/documentation.d.ts.map +1 -0
  134. package/dist/documentation.js +112 -0
  135. package/dist/documentation.js.map +1 -0
  136. package/dist/index.d.ts +16 -0
  137. package/dist/index.d.ts.map +1 -1
  138. package/dist/index.js +16 -0
  139. package/dist/index.js.map +1 -1
  140. package/dist/internal/workflow.d.ts +83 -0
  141. package/dist/internal/workflow.d.ts.map +1 -0
  142. package/dist/internal/workflow.js +419 -0
  143. package/dist/internal/workflow.js.map +1 -0
  144. package/dist/nest-injection-contract.d.ts +4 -0
  145. package/dist/nest-injection-contract.d.ts.map +1 -0
  146. package/dist/nest-injection-contract.js +116 -0
  147. package/dist/nest-injection-contract.js.map +1 -0
  148. package/dist/operation-progress.d.ts +26 -0
  149. package/dist/operation-progress.d.ts.map +1 -0
  150. package/dist/operation-progress.js +92 -0
  151. package/dist/operation-progress.js.map +1 -0
  152. package/dist/optional-backend.d.ts +14 -0
  153. package/dist/optional-backend.d.ts.map +1 -0
  154. package/dist/optional-backend.js +145 -0
  155. package/dist/optional-backend.js.map +1 -0
  156. package/dist/package-compiler.d.ts +1 -1
  157. package/dist/package-compiler.d.ts.map +1 -1
  158. package/dist/package-compiler.js +1 -1
  159. package/dist/package-compiler.js.map +1 -1
  160. package/dist/session.d.ts +149 -4
  161. package/dist/session.d.ts.map +1 -1
  162. package/dist/session.js +362 -23
  163. package/dist/session.js.map +1 -1
  164. package/dist/testing.d.ts +77 -0
  165. package/dist/testing.d.ts.map +1 -0
  166. package/dist/testing.js +213 -0
  167. package/dist/testing.js.map +1 -0
  168. package/dist/toolchain-capsule.d.ts +45 -0
  169. package/dist/toolchain-capsule.d.ts.map +1 -0
  170. package/dist/toolchain-capsule.js +165 -0
  171. package/dist/toolchain-capsule.js.map +1 -0
  172. package/dist/workspace-loader.d.ts +1 -1
  173. package/dist/workspace-loader.d.ts.map +1 -1
  174. package/dist/workspace-loader.js +35 -3
  175. package/dist/workspace-loader.js.map +1 -1
  176. package/dist/workspace-operation.d.ts +3 -0
  177. package/dist/workspace-operation.d.ts.map +1 -0
  178. package/dist/workspace-operation.js +45 -0
  179. package/dist/workspace-operation.js.map +1 -0
  180. package/dist/workspace.d.ts.map +1 -1
  181. package/dist/workspace.js +37 -1
  182. package/dist/workspace.js.map +1 -1
  183. package/package.json +16 -4
  184. package/templates/backend/Dockerfile +20 -0
  185. package/templates/backend/package.json +27 -0
  186. package/templates/backend/src/app.module.ts +23 -0
  187. package/templates/backend/src/main.ts +5 -0
  188. 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":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,qDAAqD;AACrD,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,IAAc,EAAE,OAKlE;IACC,OAAO,IAAI,OAAO,CAAkH,OAAO,CAAC,EAAE;QAC5I,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,kBAAkB,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;QACzE,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,eAAe,GAAG,KAAK,CAAC;QAC5B,IAAI,YAA+C,CAAC;QACpD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7H,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,EAAE;YAChC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAAC,WAAW,IAAI,KAAK,CAAC,MAAM,CAAC;YAChD,OAAO,WAAW,GAAG,KAAK,EAAE,CAAC;gBAC3B,eAAe,GAAG,IAAI,CAAC;gBACvB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;gBACzB,MAAM,MAAM,GAAG,WAAW,GAAG,KAAK,CAAC;gBACnC,IAAI,KAAK,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC;oBAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBAAC,WAAW,IAAI,KAAK,CAAC,MAAM,CAAC;gBAAC,CAAC;qBACvE,CAAC;oBAAC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;oBAAC,WAAW,IAAI,MAAM,CAAC;gBAAC,CAAC;YACrE,CAAC;QACH,CAAC,CAAC;QACF,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjC,IAAI,SAAoD,CAAC;QACzD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;YAC5E,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtB,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;YAC3D,SAAS,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE,GAAG,MAAM,CAAC,CAAC;QACrC,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,GAAG,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE;YACzB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,SAAS;gBAAE,YAAY,CAAC,SAAS,CAAC,CAAC;YACvC,OAAO,CAAC;gBACN,EAAE,EAAE,MAAM,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM;gBACzC,MAAM,EAAE,GAAG,eAAe,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;gBAC9G,eAAe,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAClE,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}