@dofe/infra-clients 0.1.38 → 0.1.40
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/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/internal/mlflow/mlflow.client.d.ts +44 -0
- package/dist/internal/mlflow/mlflow.client.d.ts.map +1 -0
- package/dist/internal/mlflow/mlflow.client.js +184 -0
- package/dist/internal/mlflow/mlflow.client.js.map +1 -0
- package/dist/internal/mlflow/mlflow.module.d.ts +3 -0
- package/dist/internal/mlflow/mlflow.module.d.ts.map +1 -0
- package/dist/internal/mlflow/mlflow.module.js +23 -0
- package/dist/internal/mlflow/mlflow.module.js.map +1 -0
- package/dist/internal/model-research-proxy/anthropic-proxy-research.client.d.ts +52 -0
- package/dist/internal/model-research-proxy/anthropic-proxy-research.client.d.ts.map +1 -0
- package/dist/internal/model-research-proxy/anthropic-proxy-research.client.js +174 -0
- package/dist/internal/model-research-proxy/anthropic-proxy-research.client.js.map +1 -0
- package/dist/internal/model-research-proxy/anthropic-proxy-research.module.d.ts +3 -0
- package/dist/internal/model-research-proxy/anthropic-proxy-research.module.d.ts.map +1 -0
- package/dist/internal/model-research-proxy/anthropic-proxy-research.module.js +30 -0
- package/dist/internal/model-research-proxy/anthropic-proxy-research.module.js.map +1 -0
- package/dist/internal/model-research-proxy/index.d.ts +6 -0
- package/dist/internal/model-research-proxy/index.d.ts.map +1 -0
- package/dist/internal/model-research-proxy/index.js +24 -0
- package/dist/internal/model-research-proxy/index.js.map +1 -0
- package/dist/internal/model-verify/index.d.ts +4 -0
- package/dist/internal/model-verify/index.d.ts.map +1 -0
- package/dist/internal/model-verify/index.js +26 -0
- package/dist/internal/model-verify/index.js.map +1 -0
- package/dist/internal/model-verify/model-verify.client.d.ts +77 -0
- package/dist/internal/model-verify/model-verify.client.d.ts.map +1 -0
- package/dist/internal/model-verify/model-verify.client.js +324 -0
- package/dist/internal/model-verify/model-verify.client.js.map +1 -0
- package/dist/internal/openclaw/docker-exec.service.d.ts +132 -0
- package/dist/internal/openclaw/docker-exec.service.d.ts.map +1 -0
- package/dist/internal/openclaw/docker-exec.service.js +544 -0
- package/dist/internal/openclaw/docker-exec.service.js.map +1 -0
- package/dist/internal/openclaw/index.d.ts +14 -0
- package/dist/internal/openclaw/index.d.ts.map +1 -0
- package/dist/internal/openclaw/index.js +32 -0
- package/dist/internal/openclaw/index.js.map +1 -0
- package/dist/internal/openclaw/openclaw-agent-coordination.client.d.ts +73 -0
- package/dist/internal/openclaw/openclaw-agent-coordination.client.d.ts.map +1 -0
- package/dist/internal/openclaw/openclaw-agent-coordination.client.js +249 -0
- package/dist/internal/openclaw/openclaw-agent-coordination.client.js.map +1 -0
- package/dist/internal/openclaw/openclaw-context-status.client.d.ts +66 -0
- package/dist/internal/openclaw/openclaw-context-status.client.d.ts.map +1 -0
- package/dist/internal/openclaw/openclaw-context-status.client.js +164 -0
- package/dist/internal/openclaw/openclaw-context-status.client.js.map +1 -0
- package/dist/internal/openclaw/openclaw-cron.client.d.ts +61 -0
- package/dist/internal/openclaw/openclaw-cron.client.d.ts.map +1 -0
- package/dist/internal/openclaw/openclaw-cron.client.js +416 -0
- package/dist/internal/openclaw/openclaw-cron.client.js.map +1 -0
- package/dist/internal/openclaw/openclaw-gateway.client.d.ts +41 -0
- package/dist/internal/openclaw/openclaw-gateway.client.d.ts.map +1 -0
- package/dist/internal/openclaw/openclaw-gateway.client.js +175 -0
- package/dist/internal/openclaw/openclaw-gateway.client.js.map +1 -0
- package/dist/internal/openclaw/openclaw-skill-sync.client.d.ts +222 -0
- package/dist/internal/openclaw/openclaw-skill-sync.client.d.ts.map +1 -0
- package/dist/internal/openclaw/openclaw-skill-sync.client.js +720 -0
- package/dist/internal/openclaw/openclaw-skill-sync.client.js.map +1 -0
- package/dist/internal/openclaw/openclaw.client.d.ts +602 -0
- package/dist/internal/openclaw/openclaw.client.d.ts.map +1 -0
- package/dist/internal/openclaw/openclaw.client.js +3062 -0
- package/dist/internal/openclaw/openclaw.client.js.map +1 -0
- package/dist/internal/openclaw/openclaw.module.d.ts +3 -0
- package/dist/internal/openclaw/openclaw.module.d.ts.map +1 -0
- package/dist/internal/openclaw/openclaw.module.js +62 -0
- package/dist/internal/openclaw/openclaw.module.js.map +1 -0
- package/dist/internal/openclaw/skill-translation.service.d.ts +39 -0
- package/dist/internal/openclaw/skill-translation.service.d.ts.map +1 -0
- package/dist/internal/openclaw/skill-translation.service.js +217 -0
- package/dist/internal/openclaw/skill-translation.service.js.map +1 -0
- package/dist/internal/openclaw/types/cron.types.d.ts +112 -0
- package/dist/internal/openclaw/types/cron.types.d.ts.map +1 -0
- package/dist/internal/openclaw/types/cron.types.js +9 -0
- package/dist/internal/openclaw/types/cron.types.js.map +1 -0
- package/dist/internal/provider-verify/index.d.ts +6 -0
- package/dist/internal/provider-verify/index.d.ts.map +1 -0
- package/dist/internal/provider-verify/index.js +24 -0
- package/dist/internal/provider-verify/index.js.map +1 -0
- package/dist/internal/provider-verify/provider-verify.client.d.ts +55 -0
- package/dist/internal/provider-verify/provider-verify.client.d.ts.map +1 -0
- package/dist/internal/provider-verify/provider-verify.client.js +284 -0
- package/dist/internal/provider-verify/provider-verify.client.js.map +1 -0
- package/dist/internal/provider-verify/provider-verify.module.d.ts +3 -0
- package/dist/internal/provider-verify/provider-verify.module.d.ts.map +1 -0
- package/dist/internal/provider-verify/provider-verify.module.js +28 -0
- package/dist/internal/provider-verify/provider-verify.module.js.map +1 -0
- package/dist/internal/sso/index.d.ts +5 -0
- package/dist/internal/sso/index.d.ts.map +1 -0
- package/dist/internal/sso/index.js +12 -0
- package/dist/internal/sso/index.js.map +1 -0
- package/dist/internal/sso/sso-auth.client.d.ts +33 -0
- package/dist/internal/sso/sso-auth.client.d.ts.map +1 -0
- package/dist/internal/sso/sso-auth.client.js +89 -0
- package/dist/internal/sso/sso-auth.client.js.map +1 -0
- package/dist/internal/sso/sso-message-proxy.service.d.ts +11 -0
- package/dist/internal/sso/sso-message-proxy.service.d.ts.map +1 -0
- package/dist/internal/sso/sso-message-proxy.service.js +51 -0
- package/dist/internal/sso/sso-message-proxy.service.js.map +1 -0
- package/dist/internal/sso/sso-message.client.d.ts +12 -0
- package/dist/internal/sso/sso-message.client.d.ts.map +1 -0
- package/dist/internal/sso/sso-message.client.js +62 -0
- package/dist/internal/sso/sso-message.client.js.map +1 -0
- package/dist/internal/sso/sso.module.d.ts +3 -0
- package/dist/internal/sso/sso.module.d.ts.map +1 -0
- package/dist/internal/sso/sso.module.js +26 -0
- package/dist/internal/sso/sso.module.js.map +1 -0
- package/package.json +110 -6
|
@@ -0,0 +1,544 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
42
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
43
|
+
};
|
|
44
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
45
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
46
|
+
};
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
exports.DockerExecService = void 0;
|
|
49
|
+
/**
|
|
50
|
+
* Docker Exec 服务
|
|
51
|
+
*
|
|
52
|
+
* 提供统一的 Docker 容器命令执行接口
|
|
53
|
+
* 使用 Dockerode API 替代 CLI 命令,避免环境变量配置问题
|
|
54
|
+
*/
|
|
55
|
+
const common_1 = require("@nestjs/common");
|
|
56
|
+
const axios_1 = require("@nestjs/axios");
|
|
57
|
+
const nest_winston_1 = require("nest-winston");
|
|
58
|
+
const winston_1 = require("winston");
|
|
59
|
+
const rxjs_1 = require("rxjs");
|
|
60
|
+
const fs = __importStar(require("fs/promises"));
|
|
61
|
+
const path = __importStar(require("path"));
|
|
62
|
+
const infra_docker_1 = require("@dofe/infra-docker");
|
|
63
|
+
let DockerExecService = class DockerExecService {
|
|
64
|
+
logger;
|
|
65
|
+
httpService;
|
|
66
|
+
dockerService;
|
|
67
|
+
defaultTimeout = 15000;
|
|
68
|
+
dockerSocketPath = '/var/run/docker.sock';
|
|
69
|
+
constructor(logger, httpService, dockerService) {
|
|
70
|
+
this.logger = logger;
|
|
71
|
+
this.httpService = httpService;
|
|
72
|
+
this.dockerService = dockerService;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 等待容器进入运行状态
|
|
76
|
+
* 解决 HTTP 409 错误:容器停止或重启时无法执行 exec
|
|
77
|
+
*
|
|
78
|
+
* @param containerId 容器 ID
|
|
79
|
+
* @param maxWaitMs 最大等待时间(毫秒)
|
|
80
|
+
* @param pollIntervalMs 轮询间隔(毫秒)
|
|
81
|
+
*/
|
|
82
|
+
async waitForContainerRunning(containerId, maxWaitMs = 30000, pollIntervalMs = 1000) {
|
|
83
|
+
const startTime = Date.now();
|
|
84
|
+
while (Date.now() - startTime < maxWaitMs) {
|
|
85
|
+
try {
|
|
86
|
+
const inspectUrl = `http://localhost/containers/${containerId}/json`;
|
|
87
|
+
const response = await (0, rxjs_1.firstValueFrom)(this.httpService
|
|
88
|
+
.get(inspectUrl, {
|
|
89
|
+
socketPath: this.dockerSocketPath,
|
|
90
|
+
timeout: 5000,
|
|
91
|
+
})
|
|
92
|
+
.pipe((0, rxjs_1.timeout)(5000), (0, rxjs_1.catchError)((error) => {
|
|
93
|
+
throw error;
|
|
94
|
+
})));
|
|
95
|
+
const state = response.data?.State;
|
|
96
|
+
if (state?.Status === 'running') {
|
|
97
|
+
this.logger.debug('DockerExecService: Container is running', {
|
|
98
|
+
containerId: containerId.substring(0, 12),
|
|
99
|
+
});
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
this.logger.debug('DockerExecService: Container not running, waiting...', {
|
|
103
|
+
containerId: containerId.substring(0, 12),
|
|
104
|
+
status: state?.Status,
|
|
105
|
+
});
|
|
106
|
+
await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
110
|
+
// 容器不存在(404)时立即返回,不再等待
|
|
111
|
+
if (errorMessage.includes('404') ||
|
|
112
|
+
errorMessage.includes('no such container')) {
|
|
113
|
+
this.logger.warn('DockerExecService: Container does not exist, stopping wait', {
|
|
114
|
+
containerId: containerId.substring(0, 12),
|
|
115
|
+
error: errorMessage,
|
|
116
|
+
});
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
this.logger.warn('DockerExecService: Failed to check container status', {
|
|
120
|
+
containerId: containerId.substring(0, 12),
|
|
121
|
+
error: errorMessage,
|
|
122
|
+
});
|
|
123
|
+
await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
this.logger.error('DockerExecService: Timeout waiting for container to be running', {
|
|
127
|
+
containerId: containerId.substring(0, 12),
|
|
128
|
+
maxWaitMs,
|
|
129
|
+
});
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* 在容器内执行命令
|
|
134
|
+
*
|
|
135
|
+
* @param containerId 容器 ID
|
|
136
|
+
* @param cmd 命令数组,如 ['node', '-e', script]
|
|
137
|
+
* @param options 执行选项
|
|
138
|
+
* @returns 执行结果
|
|
139
|
+
*/
|
|
140
|
+
async executeCommand(containerId, cmd, options) {
|
|
141
|
+
const { timeout: execTimeout = this.defaultTimeout, user, throwOnError = false, waitForReady = false, maxWaitMs = 30000, } = options ?? {};
|
|
142
|
+
const startTime = Date.now();
|
|
143
|
+
const maxRetries = 3; // 409 错误最大重试次数
|
|
144
|
+
const retryDelayMs = 1000; // 重试间隔
|
|
145
|
+
let lastError = null;
|
|
146
|
+
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
147
|
+
try {
|
|
148
|
+
// 如果需要等待容器就绪,先检查容器状态
|
|
149
|
+
if (waitForReady || attempt > 0) {
|
|
150
|
+
const isReady = await this.waitForContainerRunning(containerId, maxWaitMs);
|
|
151
|
+
if (!isReady) {
|
|
152
|
+
return {
|
|
153
|
+
stdout: '',
|
|
154
|
+
stderr: 'Container is not running after waiting',
|
|
155
|
+
success: false,
|
|
156
|
+
durationMs: Date.now() - startTime,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// Step 1: 创建 exec 实例
|
|
161
|
+
const execId = await this.createExec(containerId, cmd, {
|
|
162
|
+
user,
|
|
163
|
+
timeout: execTimeout,
|
|
164
|
+
});
|
|
165
|
+
// Step 2: 启动 exec 并获取输出
|
|
166
|
+
const rawOutput = await this.startExec(execId, execTimeout);
|
|
167
|
+
// Step 3: 解析输出
|
|
168
|
+
const { stdout, stderr } = this.parseOutput(rawOutput);
|
|
169
|
+
this.logger.debug('DockerExecService: 命令执行成功', {
|
|
170
|
+
containerId,
|
|
171
|
+
cmd: cmd.join(' ').substring(0, 100),
|
|
172
|
+
durationMs: Date.now() - startTime,
|
|
173
|
+
stdoutLength: stdout.length,
|
|
174
|
+
attempt: attempt + 1,
|
|
175
|
+
});
|
|
176
|
+
return {
|
|
177
|
+
stdout,
|
|
178
|
+
stderr,
|
|
179
|
+
success: true,
|
|
180
|
+
durationMs: Date.now() - startTime,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
lastError = error instanceof Error ? error : new Error('Unknown error');
|
|
185
|
+
const errorMessage = lastError.message;
|
|
186
|
+
// 检查是否是 409 冲突错误(容器正在重启或状态不一致)
|
|
187
|
+
if (errorMessage.includes('409') || errorMessage.includes('Conflict')) {
|
|
188
|
+
this.logger.warn('DockerExecService: 容器状态冲突,等待重试', {
|
|
189
|
+
containerId,
|
|
190
|
+
attempt: attempt + 1,
|
|
191
|
+
maxRetries,
|
|
192
|
+
error: errorMessage,
|
|
193
|
+
});
|
|
194
|
+
// 如果还有重试机会,等待后重试
|
|
195
|
+
if (attempt < maxRetries - 1) {
|
|
196
|
+
await new Promise((resolve) => setTimeout(resolve, retryDelayMs));
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// 非 409 错误或重试次数用尽,记录错误
|
|
201
|
+
this.logger.error('DockerExecService: 命令执行失败', {
|
|
202
|
+
containerId,
|
|
203
|
+
cmd: cmd.join(' ').substring(0, 100),
|
|
204
|
+
error: errorMessage,
|
|
205
|
+
durationMs: Date.now() - startTime,
|
|
206
|
+
attempts: attempt + 1,
|
|
207
|
+
});
|
|
208
|
+
if (throwOnError) {
|
|
209
|
+
throw error;
|
|
210
|
+
}
|
|
211
|
+
return {
|
|
212
|
+
stdout: '',
|
|
213
|
+
stderr: errorMessage,
|
|
214
|
+
success: false,
|
|
215
|
+
durationMs: Date.now() - startTime,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
// 所有重试都失败
|
|
220
|
+
return {
|
|
221
|
+
stdout: '',
|
|
222
|
+
stderr: lastError?.message || 'Max retries exceeded',
|
|
223
|
+
success: false,
|
|
224
|
+
durationMs: Date.now() - startTime,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* 执行 Node.js 脚本
|
|
229
|
+
*
|
|
230
|
+
* @param containerId 容器 ID
|
|
231
|
+
* @param script Node.js 脚本内容
|
|
232
|
+
* @param options 执行选项
|
|
233
|
+
*/
|
|
234
|
+
async executeNodeScript(containerId, script, options) {
|
|
235
|
+
return this.executeCommand(containerId, ['node', '-e', script], options);
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* 执行 Shell 命令
|
|
239
|
+
*
|
|
240
|
+
* @param containerId 容器 ID
|
|
241
|
+
* @param command Shell 命令
|
|
242
|
+
* @param options 执行选项
|
|
243
|
+
*/
|
|
244
|
+
async executeShellCommand(containerId, command, options) {
|
|
245
|
+
return this.executeCommand(containerId, ['sh', '-c', command], options);
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* 验证名称是否安全(防止注入)
|
|
249
|
+
*
|
|
250
|
+
* @param name 要验证的名称
|
|
251
|
+
* @returns 是否安全
|
|
252
|
+
*/
|
|
253
|
+
isValidName(name) {
|
|
254
|
+
const safeNamePattern = /^[a-zA-Z0-9_\-.]+$/;
|
|
255
|
+
return safeNamePattern.test(name);
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* 复制文件到容器
|
|
259
|
+
* 使用 Dockerode putArchive API 替代 docker cp CLI
|
|
260
|
+
* 写入后自动修复文件权限为 node:node(OpenClaw 运行用户)
|
|
261
|
+
*
|
|
262
|
+
* @param containerId 容器 ID
|
|
263
|
+
* @param sourcePath 宿主机文件路径
|
|
264
|
+
* @param destPath 容器内目标路径(文件完整路径)
|
|
265
|
+
* @param owner 文件所有者(默认 'node:node',OpenClaw 运行用户)
|
|
266
|
+
*/
|
|
267
|
+
async copyFileToContainer(containerId, sourcePath, destPath, owner = 'node:node') {
|
|
268
|
+
try {
|
|
269
|
+
// 读取源文件内容
|
|
270
|
+
const fileContent = await fs.readFile(sourcePath);
|
|
271
|
+
const fileName = path.basename(destPath);
|
|
272
|
+
const destDir = path.dirname(destPath);
|
|
273
|
+
// 创建 tar 包(Dockerode putArchive 需要 tar 格式)
|
|
274
|
+
const tarBuffer = await this.createTarBuffer(fileName, fileContent);
|
|
275
|
+
// 使用 Dockerode putArchive API
|
|
276
|
+
// 注意:putArchive 的 path 参数是容器内的目录,不是完整文件路径
|
|
277
|
+
await this.dockerService.putArchive(containerId, tarBuffer, destDir);
|
|
278
|
+
// 修复文件权限:putArchive 写入的文件默认归 root 所有
|
|
279
|
+
// OpenClaw 以 node 用户运行,需要 node:node 权限才能读取配置
|
|
280
|
+
await this.executeCommand(containerId, ['chown', owner, destPath]);
|
|
281
|
+
this.logger.info('DockerExecService: File copied to container with correct permissions', {
|
|
282
|
+
containerId: containerId.substring(0, 12),
|
|
283
|
+
sourcePath,
|
|
284
|
+
destPath,
|
|
285
|
+
owner,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
catch (error) {
|
|
289
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
290
|
+
this.logger.error('DockerExecService: Failed to copy file to container', {
|
|
291
|
+
containerId: containerId.substring(0, 12),
|
|
292
|
+
sourcePath,
|
|
293
|
+
destPath,
|
|
294
|
+
error: errorMessage,
|
|
295
|
+
});
|
|
296
|
+
throw new Error(`Failed to copy file to container: ${errorMessage}`);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* 复制目录到容器
|
|
301
|
+
* 使用 Dockerode putArchive API
|
|
302
|
+
*
|
|
303
|
+
* @param containerId 容器 ID
|
|
304
|
+
* @param sourceDir 宿主机目录路径
|
|
305
|
+
* @param destDir 容器内目标目录路径
|
|
306
|
+
*/
|
|
307
|
+
async copyDirectoryToContainer(containerId, sourceDir, destDir) {
|
|
308
|
+
try {
|
|
309
|
+
// 获取源目录名,用于 tar 包中的路径前缀
|
|
310
|
+
const dirName = path.basename(sourceDir);
|
|
311
|
+
// 验证源目录存在
|
|
312
|
+
const stat = await fs.stat(sourceDir);
|
|
313
|
+
if (!stat.isDirectory()) {
|
|
314
|
+
throw new Error(`Source path is not a directory: ${sourceDir}`);
|
|
315
|
+
}
|
|
316
|
+
// 创建目录的 tar 包(包含目录名前缀)
|
|
317
|
+
const tarBuffer = await this.createTarBufferFromDirectory(sourceDir, dirName);
|
|
318
|
+
this.logger.info('DockerExecService: Created tar archive for directory', {
|
|
319
|
+
containerId: containerId.substring(0, 12),
|
|
320
|
+
sourceDir,
|
|
321
|
+
dirName,
|
|
322
|
+
tarBufferSize: tarBuffer.length,
|
|
323
|
+
});
|
|
324
|
+
// 使用 Dockerode putArchive API
|
|
325
|
+
await this.dockerService.putArchive(containerId, tarBuffer, destDir);
|
|
326
|
+
this.logger.info('DockerExecService: Directory copied to container via Dockerode', {
|
|
327
|
+
containerId: containerId.substring(0, 12),
|
|
328
|
+
sourceDir,
|
|
329
|
+
destDir,
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
catch (error) {
|
|
333
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
334
|
+
this.logger.error('DockerExecService: Failed to copy directory to container', {
|
|
335
|
+
containerId: containerId.substring(0, 12),
|
|
336
|
+
sourceDir,
|
|
337
|
+
destDir,
|
|
338
|
+
error: errorMessage,
|
|
339
|
+
});
|
|
340
|
+
throw new Error(`Failed to copy directory to container: ${errorMessage}`);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* 创建单个文件的 tar 包 Buffer
|
|
345
|
+
* tar 格式:512 字节 header + 文件内容(填充到 512 字节对齐)+ 两个 512 字节的空 block 作为结束
|
|
346
|
+
*/
|
|
347
|
+
async createTarBuffer(fileName, content) {
|
|
348
|
+
// tar header (512 bytes)
|
|
349
|
+
const header = Buffer.alloc(512);
|
|
350
|
+
// 文件名 (0-99)
|
|
351
|
+
Buffer.from(fileName).copy(header, 0);
|
|
352
|
+
// 文件模式 (100-107) - "0000644\0"
|
|
353
|
+
Buffer.from('0000644\0').copy(header, 100);
|
|
354
|
+
// UID (108-115) - "0000000\0"
|
|
355
|
+
Buffer.from('0000000\0').copy(header, 108);
|
|
356
|
+
// GID (116-123) - "0000000\0"
|
|
357
|
+
Buffer.from('0000000\0').copy(header, 116);
|
|
358
|
+
// 文件大小 (124-135) - 8 字节 octal
|
|
359
|
+
const sizeStr = content.length.toString(8).padStart(11, '0') + '\0';
|
|
360
|
+
Buffer.from(sizeStr).copy(header, 124);
|
|
361
|
+
// mtime (136-147) - "00000000000\0"
|
|
362
|
+
Buffer.from('00000000000\0').copy(header, 136);
|
|
363
|
+
// checksum 占位 (148-155) - " " (8 spaces)
|
|
364
|
+
Buffer.from(' ').copy(header, 148);
|
|
365
|
+
// type flag (156) - '0' for regular file
|
|
366
|
+
header[156] = 0x30; // '0'
|
|
367
|
+
// link name (157-256) - 空
|
|
368
|
+
// magic (257-262) - "ustar\0"
|
|
369
|
+
Buffer.from('ustar\0').copy(header, 257);
|
|
370
|
+
// version (263-264) - "00"
|
|
371
|
+
Buffer.from('00').copy(header, 263);
|
|
372
|
+
// uname (265-296) - "root\0"
|
|
373
|
+
Buffer.from('root\0').copy(header, 265);
|
|
374
|
+
// gname (297-328) - "root\0"
|
|
375
|
+
Buffer.from('root\0').copy(header, 297);
|
|
376
|
+
// 计算 checksum
|
|
377
|
+
let checksum = 0;
|
|
378
|
+
for (let i = 0; i < 512; i++) {
|
|
379
|
+
checksum += header[i];
|
|
380
|
+
}
|
|
381
|
+
// checksum 字段本身在计算时视为空格 (8 个空格 = 8 * 32 = 256)
|
|
382
|
+
const checksumStr = checksum.toString(8).padStart(6, '0') + '\0 ';
|
|
383
|
+
Buffer.from(checksumStr).copy(header, 148);
|
|
384
|
+
// 文件内容填充到 512 字节对齐
|
|
385
|
+
const paddedContent = this.padTo512(content);
|
|
386
|
+
return Buffer.concat([header, paddedContent]);
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* 创建目录的 tar 包 Buffer
|
|
390
|
+
*
|
|
391
|
+
* @param sourceDir 源目录路径
|
|
392
|
+
* @param dirPrefix tar 包中的目录前缀(可选,用于保留目录名)
|
|
393
|
+
*/
|
|
394
|
+
async createTarBufferFromDirectory(sourceDir, dirPrefix) {
|
|
395
|
+
const parts = [];
|
|
396
|
+
const files = await this.listFilesRecursively(sourceDir);
|
|
397
|
+
this.logger.info('DockerExecService: Creating tar archive from directory', {
|
|
398
|
+
sourceDir,
|
|
399
|
+
dirPrefix,
|
|
400
|
+
fileCount: files.length,
|
|
401
|
+
files: files.slice(0, 10).map((f) => path.relative(sourceDir, f)),
|
|
402
|
+
});
|
|
403
|
+
for (const file of files) {
|
|
404
|
+
let relativePath = path.relative(sourceDir, file);
|
|
405
|
+
// 如果有目录前缀,添加到路径前面
|
|
406
|
+
if (dirPrefix) {
|
|
407
|
+
relativePath = path.join(dirPrefix, relativePath);
|
|
408
|
+
}
|
|
409
|
+
// 关键修复:确保 tar 包内使用 POSIX 路径格式(使用 / 而非 \)
|
|
410
|
+
// 否则在 Windows 上创建的 tar 包在 Linux 容器中解压会失败
|
|
411
|
+
relativePath = relativePath.split(path.sep).join('/');
|
|
412
|
+
const content = await fs.readFile(file);
|
|
413
|
+
const tarEntry = await this.createTarBuffer(relativePath, content);
|
|
414
|
+
parts.push(tarEntry);
|
|
415
|
+
}
|
|
416
|
+
// 结束标记
|
|
417
|
+
parts.push(Buffer.alloc(1024));
|
|
418
|
+
return Buffer.concat(parts);
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* 递归列出目录下所有文件
|
|
422
|
+
* 忽略以 . 开头的文件和 node_modules 目录
|
|
423
|
+
*/
|
|
424
|
+
async listFilesRecursively(dir) {
|
|
425
|
+
const files = [];
|
|
426
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
427
|
+
for (const entry of entries) {
|
|
428
|
+
// 忽略以 . 开头的文件/目录(如 .DS_Store, .git)
|
|
429
|
+
if (entry.name.startsWith('.')) {
|
|
430
|
+
continue;
|
|
431
|
+
}
|
|
432
|
+
// 忽略 node_modules 目录
|
|
433
|
+
if (entry.name === 'node_modules') {
|
|
434
|
+
continue;
|
|
435
|
+
}
|
|
436
|
+
const fullPath = path.join(dir, entry.name);
|
|
437
|
+
if (entry.isDirectory()) {
|
|
438
|
+
const subFiles = await this.listFilesRecursively(fullPath);
|
|
439
|
+
files.push(...subFiles);
|
|
440
|
+
}
|
|
441
|
+
else if (entry.isFile()) {
|
|
442
|
+
files.push(fullPath);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
return files;
|
|
446
|
+
}
|
|
447
|
+
/**
|
|
448
|
+
* 将 Buffer 填充到 512 字节对齐
|
|
449
|
+
*/
|
|
450
|
+
padTo512(buffer) {
|
|
451
|
+
const remainder = buffer.length % 512;
|
|
452
|
+
if (remainder === 0)
|
|
453
|
+
return buffer;
|
|
454
|
+
const padding = Buffer.alloc(512 - remainder);
|
|
455
|
+
return Buffer.concat([buffer, padding]);
|
|
456
|
+
}
|
|
457
|
+
// --- 私有方法 ---
|
|
458
|
+
async createExec(containerId, cmd, options) {
|
|
459
|
+
const execCreateUrl = `http://localhost/containers/${containerId}/exec`;
|
|
460
|
+
const execCreateBody = {
|
|
461
|
+
AttachStdout: true,
|
|
462
|
+
AttachStderr: true,
|
|
463
|
+
Cmd: cmd,
|
|
464
|
+
};
|
|
465
|
+
if (options.user) {
|
|
466
|
+
execCreateBody.User = options.user;
|
|
467
|
+
}
|
|
468
|
+
const response = await (0, rxjs_1.firstValueFrom)(this.httpService
|
|
469
|
+
.post(execCreateUrl, execCreateBody, {
|
|
470
|
+
socketPath: this.dockerSocketPath,
|
|
471
|
+
timeout: options.timeout,
|
|
472
|
+
})
|
|
473
|
+
.pipe((0, rxjs_1.timeout)(options.timeout), (0, rxjs_1.catchError)((error) => {
|
|
474
|
+
this.logger.error('DockerExecService: 创建 exec 失败', {
|
|
475
|
+
containerId,
|
|
476
|
+
cmd: cmd.join(' ').substring(0, 100),
|
|
477
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
478
|
+
});
|
|
479
|
+
throw error;
|
|
480
|
+
})));
|
|
481
|
+
const execId = response.data?.Id;
|
|
482
|
+
if (!execId) {
|
|
483
|
+
throw new Error('Failed to create exec instance: no exec ID returned');
|
|
484
|
+
}
|
|
485
|
+
return execId;
|
|
486
|
+
}
|
|
487
|
+
async startExec(execId, timeoutMs) {
|
|
488
|
+
const execStartUrl = `http://localhost/exec/${execId}/start`;
|
|
489
|
+
const response = await (0, rxjs_1.firstValueFrom)(this.httpService
|
|
490
|
+
.post(execStartUrl, { Detach: false, Tty: false }, {
|
|
491
|
+
socketPath: this.dockerSocketPath,
|
|
492
|
+
timeout: timeoutMs,
|
|
493
|
+
responseType: 'arraybuffer',
|
|
494
|
+
})
|
|
495
|
+
.pipe((0, rxjs_1.timeout)(timeoutMs), (0, rxjs_1.catchError)((error) => {
|
|
496
|
+
this.logger.error('DockerExecService: 启动 exec 失败', {
|
|
497
|
+
execId,
|
|
498
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
499
|
+
});
|
|
500
|
+
throw error;
|
|
501
|
+
})));
|
|
502
|
+
return response.data;
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* 解析 Docker exec 多路复用流输出
|
|
506
|
+
* Docker exec 输出格式:每帧 8 字节头 + payload
|
|
507
|
+
* 头部:[stream_type(1), 0, 0, 0, size(4 bytes big-endian)]
|
|
508
|
+
*/
|
|
509
|
+
parseOutput(data) {
|
|
510
|
+
const buffer = Buffer.from(data);
|
|
511
|
+
let stdout = '';
|
|
512
|
+
let stderr = '';
|
|
513
|
+
let offset = 0;
|
|
514
|
+
while (offset + 8 <= buffer.length) {
|
|
515
|
+
const streamType = buffer[offset];
|
|
516
|
+
const size = buffer.readUInt32BE(offset + 4);
|
|
517
|
+
offset += 8;
|
|
518
|
+
if (offset + size > buffer.length)
|
|
519
|
+
break;
|
|
520
|
+
const content = buffer.subarray(offset, offset + size).toString('utf-8');
|
|
521
|
+
if (streamType === 1) {
|
|
522
|
+
stdout += content;
|
|
523
|
+
}
|
|
524
|
+
else if (streamType === 2) {
|
|
525
|
+
stderr += content;
|
|
526
|
+
}
|
|
527
|
+
offset += size;
|
|
528
|
+
}
|
|
529
|
+
// 如果解析失败(非多路复用格式),返回原始字符串作为 stdout
|
|
530
|
+
if (!stdout && !stderr && buffer.length > 0) {
|
|
531
|
+
stdout = buffer.toString('utf-8');
|
|
532
|
+
}
|
|
533
|
+
return { stdout: stdout.trim(), stderr: stderr.trim() };
|
|
534
|
+
}
|
|
535
|
+
};
|
|
536
|
+
exports.DockerExecService = DockerExecService;
|
|
537
|
+
exports.DockerExecService = DockerExecService = __decorate([
|
|
538
|
+
(0, common_1.Injectable)(),
|
|
539
|
+
__param(0, (0, common_1.Inject)(nest_winston_1.WINSTON_MODULE_PROVIDER)),
|
|
540
|
+
__metadata("design:paramtypes", [winston_1.Logger,
|
|
541
|
+
axios_1.HttpService,
|
|
542
|
+
infra_docker_1.DockerService])
|
|
543
|
+
], DockerExecService);
|
|
544
|
+
//# sourceMappingURL=docker-exec.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-exec.service.js","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/openclaw/docker-exec.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw 客户端导出
|
|
3
|
+
*/
|
|
4
|
+
export * from './docker-exec.service';
|
|
5
|
+
export * from './openclaw.client';
|
|
6
|
+
export * from './openclaw-gateway.client';
|
|
7
|
+
export * from './openclaw-cron.client';
|
|
8
|
+
export * from './openclaw-agent-coordination.client';
|
|
9
|
+
export * from './openclaw-skill-sync.client';
|
|
10
|
+
export * from './openclaw-context-status.client';
|
|
11
|
+
export * from './skill-translation.service';
|
|
12
|
+
export { OpenClawModule } from './openclaw.module';
|
|
13
|
+
export * from './types/cron.types';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/openclaw/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,sCAAsC,CAAC;AACrD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.OpenClawModule = void 0;
|
|
18
|
+
/**
|
|
19
|
+
* OpenClaw 客户端导出
|
|
20
|
+
*/
|
|
21
|
+
__exportStar(require("./docker-exec.service"), exports);
|
|
22
|
+
__exportStar(require("./openclaw.client"), exports);
|
|
23
|
+
__exportStar(require("./openclaw-gateway.client"), exports);
|
|
24
|
+
__exportStar(require("./openclaw-cron.client"), exports);
|
|
25
|
+
__exportStar(require("./openclaw-agent-coordination.client"), exports);
|
|
26
|
+
__exportStar(require("./openclaw-skill-sync.client"), exports);
|
|
27
|
+
__exportStar(require("./openclaw-context-status.client"), exports);
|
|
28
|
+
__exportStar(require("./skill-translation.service"), exports);
|
|
29
|
+
var openclaw_module_1 = require("./openclaw.module");
|
|
30
|
+
Object.defineProperty(exports, "OpenClawModule", { enumerable: true, get: function () { return openclaw_module_1.OpenClawModule; } });
|
|
31
|
+
__exportStar(require("./types/cron.types"), exports);
|
|
32
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/openclaw/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;;GAEG;AACH,wDAAsC;AACtC,oDAAkC;AAClC,4DAA0C;AAC1C,yDAAuC;AACvC,uEAAqD;AACrD,+DAA6C;AAC7C,mEAAiD;AACjD,8DAA4C;AAC5C,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AACvB,qDAAmC"}
|