intention-coding 0.4.0 → 0.4.3
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/package.json +2 -3
- package/dist/db/file-storage.js +0 -638
- package/dist/index.js +0 -26
- package/dist/server/index.js +0 -88
- package/dist/services/bug-fix-agent/index.js +0 -320
- package/dist/services/change-summarizer/index.js +0 -123
- package/dist/services/change-summarizer/prompt/change-analysis.js +0 -56
- package/dist/services/code-generator/index.js +0 -403
- package/dist/services/code-generator/stages/execution-stage.js +0 -549
- package/dist/services/code-generator/stages/ideation-stage.js +0 -267
- package/dist/services/code-generator/stages/optimization-stage.js +0 -334
- package/dist/services/code-generator/stages/planning-stage.js +0 -295
- package/dist/services/code-generator/stages/research-stage.js +0 -283
- package/dist/services/code-generator/stages/review-stage.js +0 -270
- package/dist/services/code-generator/types.js +0 -37
- package/dist/services/code-generator/utils/instruction-executor.js +0 -207
- package/dist/services/code-generator/workflow-manager.js +0 -252
- package/dist/services/image-analysis/analyzer.js +0 -530
- package/dist/services/image-analysis/index.js +0 -406
- package/dist/services/image-analysis/types.js +0 -46
- package/dist/services/image-converter/converter.js +0 -310
- package/dist/services/image-converter/index.js +0 -262
- package/dist/services/image-converter/types.js +0 -31
- package/dist/services/integrated-generator/index.js +0 -1297
- package/dist/services/pdf2md/index.js +0 -180
- package/dist/services/project-template/index.js +0 -83
- package/dist/services/project-template/prompt/project-rules.js +0 -98
- package/dist/services/requirement-analyzer/chunk-reader.js +0 -218
- package/dist/services/requirement-analyzer/core/document-generator.js +0 -254
- package/dist/services/requirement-analyzer/core/intelligent-analyzer.js +0 -169
- package/dist/services/requirement-analyzer/core/project-analyzer.js +0 -199
- package/dist/services/requirement-analyzer/core/requirement-analyzer-service.js +0 -191
- package/dist/services/requirement-analyzer/core/template-selector.js +0 -124
- package/dist/services/requirement-analyzer/core/types.js +0 -23
- package/dist/services/requirement-analyzer/index.js +0 -177
- package/dist/services/requirement-analyzer/prompt/api-template.js +0 -302
- package/dist/services/requirement-analyzer/prompt/app-template.js +0 -455
- package/dist/services/requirement-analyzer/prompt/intelligent-requirement-analysis.js +0 -92
- package/dist/services/requirement-analyzer/prompt/pc-page-template.js +0 -582
- package/dist/services/requirement-analyzer/prompt/requirement-analysis.js +0 -664
- package/dist/services/requirement-analyzer/prompt/sdk-template.js +0 -582
- package/dist/services/requirement-analyzer/utils/file-reader.js +0 -169
- package/dist/services/world2md/index.js +0 -157
- package/dist/types/index.js +0 -2
- package/dist/utils/common.js +0 -72
- package/dist/utils/config.js +0 -163
- package/dist/utils/context-manager.js +0 -114
- package/dist/utils/dify.js +0 -243
- package/dist/utils/logger.js +0 -129
- package/dist/utils/openai.js +0 -225
- package/dist/utils/pack.js +0 -75
|
@@ -1,310 +0,0 @@
|
|
|
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 __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
36
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
37
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
38
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
39
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
40
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
41
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
42
|
-
});
|
|
43
|
-
};
|
|
44
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
45
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
46
|
-
};
|
|
47
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
-
exports.ImageConverter = void 0;
|
|
49
|
-
const fs = __importStar(require("fs/promises"));
|
|
50
|
-
const path = __importStar(require("path"));
|
|
51
|
-
const sharp_1 = __importDefault(require("sharp"));
|
|
52
|
-
const logger_1 = require("../../utils/logger");
|
|
53
|
-
const types_1 = require("./types");
|
|
54
|
-
/**
|
|
55
|
-
* 图片格式转换核心服务
|
|
56
|
-
* 职责:处理单张和批量图片的格式转换
|
|
57
|
-
*/
|
|
58
|
-
class ImageConverter {
|
|
59
|
-
/**
|
|
60
|
-
* 转换图片(支持单张和批量)
|
|
61
|
-
*/
|
|
62
|
-
convertImages(params) {
|
|
63
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
64
|
-
const startTime = Date.now();
|
|
65
|
-
try {
|
|
66
|
-
// 验证参数
|
|
67
|
-
this.validateParams(params);
|
|
68
|
-
// 标准化输入路径
|
|
69
|
-
const inputPaths = Array.isArray(params.input_paths)
|
|
70
|
-
? params.input_paths
|
|
71
|
-
: [params.input_paths];
|
|
72
|
-
logger_1.logger.info('开始图片转换', {
|
|
73
|
-
inputCount: inputPaths.length,
|
|
74
|
-
outputFormat: params.output_format,
|
|
75
|
-
isBatch: inputPaths.length > 1
|
|
76
|
-
});
|
|
77
|
-
// 并行处理所有图片
|
|
78
|
-
const results = yield Promise.all(inputPaths.map(inputPath => this.convertSingleImage(inputPath, params)));
|
|
79
|
-
// 统计结果
|
|
80
|
-
const successful = results.filter(r => r.success).length;
|
|
81
|
-
const failed = results.length - successful;
|
|
82
|
-
const processingTime = Date.now() - startTime;
|
|
83
|
-
const batchResult = {
|
|
84
|
-
results,
|
|
85
|
-
summary: {
|
|
86
|
-
total: results.length,
|
|
87
|
-
successful,
|
|
88
|
-
failed,
|
|
89
|
-
processing_time_ms: processingTime
|
|
90
|
-
}
|
|
91
|
-
};
|
|
92
|
-
logger_1.logger.info('图片转换完成', {
|
|
93
|
-
total: results.length,
|
|
94
|
-
successful,
|
|
95
|
-
failed,
|
|
96
|
-
processingTimeMs: processingTime
|
|
97
|
-
});
|
|
98
|
-
return batchResult;
|
|
99
|
-
}
|
|
100
|
-
catch (error) {
|
|
101
|
-
logger_1.logger.error('图片转换失败', { error, params });
|
|
102
|
-
throw error;
|
|
103
|
-
}
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* 转换单张图片
|
|
108
|
-
*/
|
|
109
|
-
convertSingleImage(inputPath, params) {
|
|
110
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
111
|
-
try {
|
|
112
|
-
// 验证输入文件
|
|
113
|
-
yield this.validateInputFile(inputPath);
|
|
114
|
-
// 生成输出路径
|
|
115
|
-
const outputPath = this.generateOutputPath(inputPath, params);
|
|
116
|
-
// 确保输出目录存在
|
|
117
|
-
yield this.ensureOutputDirectory(outputPath);
|
|
118
|
-
// 获取图片元数据
|
|
119
|
-
const metadata = yield this.getImageMetadata(inputPath);
|
|
120
|
-
// 执行转换
|
|
121
|
-
const result = yield this.performConversion(inputPath, outputPath, params, metadata);
|
|
122
|
-
logger_1.logger.info('单张图片转换成功', {
|
|
123
|
-
inputPath,
|
|
124
|
-
outputPath,
|
|
125
|
-
format: params.output_format
|
|
126
|
-
});
|
|
127
|
-
return result;
|
|
128
|
-
}
|
|
129
|
-
catch (error) {
|
|
130
|
-
logger_1.logger.error('单张图片转换失败', { error, inputPath });
|
|
131
|
-
return {
|
|
132
|
-
input_path: inputPath,
|
|
133
|
-
output_path: '',
|
|
134
|
-
success: false,
|
|
135
|
-
error: error instanceof Error ? error.message : String(error)
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
/**
|
|
141
|
-
* 执行实际的图片转换
|
|
142
|
-
*/
|
|
143
|
-
performConversion(inputPath, outputPath, params, metadata) {
|
|
144
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
145
|
-
let sharpInstance = (0, sharp_1.default)(inputPath);
|
|
146
|
-
// 处理尺寸调整
|
|
147
|
-
if (params.width || params.height) {
|
|
148
|
-
const resizeOptions = {
|
|
149
|
-
fit: params.maintain_aspect_ratio ? 'inside' : 'fill',
|
|
150
|
-
withoutEnlargement: false
|
|
151
|
-
};
|
|
152
|
-
sharpInstance = sharpInstance.resize(params.width, params.height, resizeOptions);
|
|
153
|
-
}
|
|
154
|
-
// 根据输出格式设置选项
|
|
155
|
-
const outputFormat = params.output_format.toLowerCase();
|
|
156
|
-
switch (outputFormat) {
|
|
157
|
-
case 'jpg':
|
|
158
|
-
case 'jpeg':
|
|
159
|
-
sharpInstance = sharpInstance.jpeg({
|
|
160
|
-
quality: params.quality || 90,
|
|
161
|
-
progressive: true
|
|
162
|
-
});
|
|
163
|
-
break;
|
|
164
|
-
case 'png':
|
|
165
|
-
sharpInstance = sharpInstance.png({
|
|
166
|
-
compressionLevel: params.quality ? Math.round((100 - params.quality) / 10) : 6,
|
|
167
|
-
progressive: true
|
|
168
|
-
});
|
|
169
|
-
break;
|
|
170
|
-
case 'webp':
|
|
171
|
-
sharpInstance = sharpInstance.webp({
|
|
172
|
-
quality: params.quality || 90,
|
|
173
|
-
effort: 4
|
|
174
|
-
});
|
|
175
|
-
break;
|
|
176
|
-
case 'tiff':
|
|
177
|
-
sharpInstance = sharpInstance.tiff({
|
|
178
|
-
quality: params.quality || 90,
|
|
179
|
-
compression: 'lzw'
|
|
180
|
-
});
|
|
181
|
-
break;
|
|
182
|
-
case 'bmp':
|
|
183
|
-
// Sharp不直接支持BMP输出,转换为PNG
|
|
184
|
-
sharpInstance = sharpInstance.png();
|
|
185
|
-
break;
|
|
186
|
-
case 'gif':
|
|
187
|
-
// Sharp不直接支持GIF输出,转换为PNG
|
|
188
|
-
sharpInstance = sharpInstance.png();
|
|
189
|
-
break;
|
|
190
|
-
case 'ico':
|
|
191
|
-
// 对于ICO格式,调整到合适的尺寸
|
|
192
|
-
sharpInstance = sharpInstance.resize(32, 32, { fit: 'inside' }).png();
|
|
193
|
-
break;
|
|
194
|
-
default:
|
|
195
|
-
throw new types_1.ImageConversionError(`不支持的输出格式: ${outputFormat}`, types_1.ConversionErrorCodes.UNSUPPORTED_FORMAT, { format: outputFormat });
|
|
196
|
-
}
|
|
197
|
-
// 执行转换并保存
|
|
198
|
-
yield sharpInstance.toFile(outputPath);
|
|
199
|
-
// 获取转换后的图片信息
|
|
200
|
-
const outputMetadata = yield this.getImageMetadata(outputPath);
|
|
201
|
-
const stats = yield fs.stat(outputPath);
|
|
202
|
-
return {
|
|
203
|
-
input_path: inputPath,
|
|
204
|
-
output_path: outputPath,
|
|
205
|
-
success: true,
|
|
206
|
-
format: outputFormat,
|
|
207
|
-
dimensions: {
|
|
208
|
-
width: outputMetadata.width,
|
|
209
|
-
height: outputMetadata.height
|
|
210
|
-
},
|
|
211
|
-
file_size: stats.size
|
|
212
|
-
};
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
/**
|
|
216
|
-
* 获取图片元数据
|
|
217
|
-
*/
|
|
218
|
-
getImageMetadata(imagePath) {
|
|
219
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
220
|
-
try {
|
|
221
|
-
const metadata = yield (0, sharp_1.default)(imagePath).metadata();
|
|
222
|
-
return {
|
|
223
|
-
format: metadata.format || 'unknown',
|
|
224
|
-
width: metadata.width || 0,
|
|
225
|
-
height: metadata.height || 0,
|
|
226
|
-
channels: metadata.channels || 0,
|
|
227
|
-
hasAlpha: metadata.hasAlpha || false,
|
|
228
|
-
density: metadata.density
|
|
229
|
-
};
|
|
230
|
-
}
|
|
231
|
-
catch (error) {
|
|
232
|
-
throw new types_1.ImageConversionError(`无法读取图片元数据: ${imagePath}`, types_1.ConversionErrorCodes.CONVERSION_FAILED, { imagePath, originalError: error });
|
|
233
|
-
}
|
|
234
|
-
});
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
* 验证参数
|
|
238
|
-
*/
|
|
239
|
-
validateParams(params) {
|
|
240
|
-
// 验证输出格式
|
|
241
|
-
const outputFormat = params.output_format.toLowerCase();
|
|
242
|
-
if (!types_1.SUPPORTED_OUTPUT_FORMATS.includes(outputFormat)) {
|
|
243
|
-
throw new types_1.ImageConversionError(`不支持的输出格式: ${params.output_format}`, types_1.ConversionErrorCodes.UNSUPPORTED_FORMAT, {
|
|
244
|
-
format: params.output_format,
|
|
245
|
-
supportedFormats: types_1.SUPPORTED_OUTPUT_FORMATS
|
|
246
|
-
});
|
|
247
|
-
}
|
|
248
|
-
// 验证质量参数
|
|
249
|
-
if (params.quality !== undefined && (params.quality < 1 || params.quality > 100)) {
|
|
250
|
-
throw new types_1.ImageConversionError('质量参数必须在1-100之间', types_1.ConversionErrorCodes.INVALID_QUALITY, { quality: params.quality });
|
|
251
|
-
}
|
|
252
|
-
// 验证尺寸参数
|
|
253
|
-
if (params.width !== undefined && params.width <= 0) {
|
|
254
|
-
throw new types_1.ImageConversionError('宽度必须大于0', types_1.ConversionErrorCodes.INVALID_DIMENSIONS, { width: params.width });
|
|
255
|
-
}
|
|
256
|
-
if (params.height !== undefined && params.height <= 0) {
|
|
257
|
-
throw new types_1.ImageConversionError('高度必须大于0', types_1.ConversionErrorCodes.INVALID_DIMENSIONS, { height: params.height });
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
/**
|
|
261
|
-
* 验证输入文件
|
|
262
|
-
*/
|
|
263
|
-
validateInputFile(inputPath) {
|
|
264
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
265
|
-
try {
|
|
266
|
-
yield fs.access(inputPath);
|
|
267
|
-
}
|
|
268
|
-
catch (_a) {
|
|
269
|
-
throw new types_1.ImageConversionError(`输入文件不存在: ${inputPath}`, types_1.ConversionErrorCodes.FILE_NOT_FOUND, { inputPath });
|
|
270
|
-
}
|
|
271
|
-
// 验证文件格式
|
|
272
|
-
const ext = path.extname(inputPath).slice(1).toLowerCase();
|
|
273
|
-
if (!types_1.SUPPORTED_INPUT_FORMATS.includes(ext)) {
|
|
274
|
-
throw new types_1.ImageConversionError(`不支持的输入格式: ${ext}`, types_1.ConversionErrorCodes.UNSUPPORTED_FORMAT, {
|
|
275
|
-
format: ext,
|
|
276
|
-
supportedFormats: types_1.SUPPORTED_INPUT_FORMATS
|
|
277
|
-
});
|
|
278
|
-
}
|
|
279
|
-
});
|
|
280
|
-
}
|
|
281
|
-
/**
|
|
282
|
-
* 生成输出路径
|
|
283
|
-
*/
|
|
284
|
-
generateOutputPath(inputPath, params) {
|
|
285
|
-
const inputDir = path.dirname(inputPath);
|
|
286
|
-
const inputName = path.basename(inputPath, path.extname(inputPath));
|
|
287
|
-
const outputExt = params.output_format.toLowerCase();
|
|
288
|
-
// 如果指定了输出目录,使用输出目录
|
|
289
|
-
if (params.output_directory) {
|
|
290
|
-
return path.join(params.output_directory, `${inputName}.${outputExt}`);
|
|
291
|
-
}
|
|
292
|
-
// 否则在原文件目录生成
|
|
293
|
-
return path.join(inputDir, `${inputName}.${outputExt}`);
|
|
294
|
-
}
|
|
295
|
-
/**
|
|
296
|
-
* 确保输出目录存在
|
|
297
|
-
*/
|
|
298
|
-
ensureOutputDirectory(outputPath) {
|
|
299
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
300
|
-
const outputDir = path.dirname(outputPath);
|
|
301
|
-
try {
|
|
302
|
-
yield fs.mkdir(outputDir, { recursive: true });
|
|
303
|
-
}
|
|
304
|
-
catch (error) {
|
|
305
|
-
throw new types_1.ImageConversionError(`无法创建输出目录: ${outputDir}`, types_1.ConversionErrorCodes.OUTPUT_WRITE_FAILED, { outputDir, originalError: error });
|
|
306
|
-
}
|
|
307
|
-
});
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
exports.ImageConverter = ImageConverter;
|
|
@@ -1,262 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.ConversionErrorCodes = exports.ImageConversionError = exports.ImageConverter = exports.imageConverterTool = void 0;
|
|
13
|
-
const zod_1 = require("zod");
|
|
14
|
-
const logger_1 = require("../../utils/logger");
|
|
15
|
-
const converter_1 = require("./converter");
|
|
16
|
-
const types_1 = require("./types");
|
|
17
|
-
// 参数验证Schema
|
|
18
|
-
const ImageConversionParamsSchema = zod_1.z.object({
|
|
19
|
-
input_paths: zod_1.z
|
|
20
|
-
.union([zod_1.z.string(), zod_1.z.array(zod_1.z.string())])
|
|
21
|
-
.describe("输入图片路径,支持单个路径或路径数组"),
|
|
22
|
-
output_format: zod_1.z
|
|
23
|
-
.enum(["jpg", "jpeg", "png", "gif", "bmp", "tiff", "webp", "ico"])
|
|
24
|
-
.describe("输出格式"),
|
|
25
|
-
quality: zod_1.z
|
|
26
|
-
.number()
|
|
27
|
-
.min(1)
|
|
28
|
-
.max(100)
|
|
29
|
-
.optional()
|
|
30
|
-
.describe("图片质量,1-100,默认90"),
|
|
31
|
-
width: zod_1.z.number().positive().optional().describe("输出宽度(像素)"),
|
|
32
|
-
height: zod_1.z.number().positive().optional().describe("输出高度(像素)"),
|
|
33
|
-
maintain_aspect_ratio: zod_1.z
|
|
34
|
-
.boolean()
|
|
35
|
-
.default(true)
|
|
36
|
-
.describe("是否保持宽高比,默认true"),
|
|
37
|
-
output_directory: zod_1.z
|
|
38
|
-
.string()
|
|
39
|
-
.optional()
|
|
40
|
-
.describe("输出目录,不指定则在原文件目录生成"),
|
|
41
|
-
});
|
|
42
|
-
/**
|
|
43
|
-
* 图片格式转换智能体
|
|
44
|
-
* 支持单张图片和批量图片转换
|
|
45
|
-
*/
|
|
46
|
-
exports.imageConverterTool = {
|
|
47
|
-
name: "图片格式转换智能体",
|
|
48
|
-
description: "专业图片格式转换工具,支持单张和批量转换,包含尺寸调整和质量控制功能",
|
|
49
|
-
parameters: ImageConversionParamsSchema,
|
|
50
|
-
execute: (args) => __awaiter(void 0, void 0, void 0, function* () {
|
|
51
|
-
const converter = new converter_1.ImageConverter();
|
|
52
|
-
try {
|
|
53
|
-
logger_1.logger.info("图片格式转换智能体开始执行", {
|
|
54
|
-
inputPaths: args.input_paths,
|
|
55
|
-
outputFormat: args.output_format,
|
|
56
|
-
isBatch: Array.isArray(args.input_paths),
|
|
57
|
-
});
|
|
58
|
-
// 转换参数格式
|
|
59
|
-
const conversionParams = {
|
|
60
|
-
input_paths: args.input_paths,
|
|
61
|
-
output_format: args.output_format,
|
|
62
|
-
quality: args.quality,
|
|
63
|
-
width: args.width,
|
|
64
|
-
height: args.height,
|
|
65
|
-
maintain_aspect_ratio: args.maintain_aspect_ratio,
|
|
66
|
-
output_directory: args.output_directory,
|
|
67
|
-
};
|
|
68
|
-
// 执行转换
|
|
69
|
-
const result = yield converter.convertImages(conversionParams);
|
|
70
|
-
// 格式化返回结果
|
|
71
|
-
return formatConversionResult(result, args);
|
|
72
|
-
}
|
|
73
|
-
catch (error) {
|
|
74
|
-
logger_1.logger.error("图片格式转换智能体执行失败", { error, args });
|
|
75
|
-
if (error instanceof types_1.ImageConversionError) {
|
|
76
|
-
return formatErrorResponse(error);
|
|
77
|
-
}
|
|
78
|
-
return formatUnknownErrorResponse(error);
|
|
79
|
-
}
|
|
80
|
-
}),
|
|
81
|
-
};
|
|
82
|
-
/**
|
|
83
|
-
* 格式化转换结果
|
|
84
|
-
*/
|
|
85
|
-
function formatConversionResult(result, args) {
|
|
86
|
-
const { summary, results } = result;
|
|
87
|
-
const isBatch = Array.isArray(args.input_paths);
|
|
88
|
-
if (summary.failed === 0) {
|
|
89
|
-
// 全部成功
|
|
90
|
-
return `
|
|
91
|
-
# ✅ 图片格式转换完成
|
|
92
|
-
|
|
93
|
-
## 📊 转换统计
|
|
94
|
-
- **处理模式**: ${isBatch ? "批量转换" : "单张转换"}
|
|
95
|
-
- **总计图片**: ${summary.total} 张
|
|
96
|
-
- **成功转换**: ${summary.successful} 张
|
|
97
|
-
- **转换失败**: ${summary.failed} 张
|
|
98
|
-
- **处理时间**: ${summary.processing_time_ms}ms
|
|
99
|
-
- **目标格式**: ${args.output_format.toUpperCase()}
|
|
100
|
-
|
|
101
|
-
## 📁 转换结果
|
|
102
|
-
|
|
103
|
-
${results
|
|
104
|
-
.map((r, index) => {
|
|
105
|
-
var _a, _b, _c;
|
|
106
|
-
return `
|
|
107
|
-
### ${index + 1}. ${getFileName(r.input_path)}
|
|
108
|
-
- **输入**: \`${r.input_path}\`
|
|
109
|
-
- **输出**: \`${r.output_path}\`
|
|
110
|
-
- **格式**: ${(_a = r.format) === null || _a === void 0 ? void 0 : _a.toUpperCase()}
|
|
111
|
-
- **尺寸**: ${(_b = r.dimensions) === null || _b === void 0 ? void 0 : _b.width} × ${(_c = r.dimensions) === null || _c === void 0 ? void 0 : _c.height}
|
|
112
|
-
- **文件大小**: ${formatFileSize(r.file_size || 0)}
|
|
113
|
-
`;
|
|
114
|
-
})
|
|
115
|
-
.join("")}
|
|
116
|
-
|
|
117
|
-
${args.width || args.height
|
|
118
|
-
? `
|
|
119
|
-
## 🔧 尺寸调整
|
|
120
|
-
- **目标尺寸**: ${args.width || "自动"} × ${args.height || "自动"}
|
|
121
|
-
- **保持宽高比**: ${args.maintain_aspect_ratio ? "是" : "否"}
|
|
122
|
-
`
|
|
123
|
-
: ""}
|
|
124
|
-
|
|
125
|
-
${args.quality
|
|
126
|
-
? `
|
|
127
|
-
## 🎨 质量设置
|
|
128
|
-
- **压缩质量**: ${args.quality}%
|
|
129
|
-
`
|
|
130
|
-
: ""}
|
|
131
|
-
|
|
132
|
-
**所有图片转换成功完成!**
|
|
133
|
-
`.trim();
|
|
134
|
-
}
|
|
135
|
-
else {
|
|
136
|
-
// 部分失败
|
|
137
|
-
const successResults = results.filter((r) => r.success);
|
|
138
|
-
const failedResults = results.filter((r) => !r.success);
|
|
139
|
-
return `
|
|
140
|
-
# ⚠️ 图片格式转换部分完成
|
|
141
|
-
|
|
142
|
-
## 📊 转换统计
|
|
143
|
-
- **处理模式**: ${isBatch ? "批量转换" : "单张转换"}
|
|
144
|
-
- **总计图片**: ${summary.total} 张
|
|
145
|
-
- **成功转换**: ${summary.successful} 张
|
|
146
|
-
- **转换失败**: ${summary.failed} 张
|
|
147
|
-
- **成功率**: ${((summary.successful / summary.total) * 100).toFixed(1)}%
|
|
148
|
-
- **处理时间**: ${summary.processing_time_ms}ms
|
|
149
|
-
|
|
150
|
-
## ✅ 成功转换 (${successResults.length}张)
|
|
151
|
-
|
|
152
|
-
${successResults
|
|
153
|
-
.map((r, index) => {
|
|
154
|
-
var _a, _b;
|
|
155
|
-
return `
|
|
156
|
-
${index + 1}. **${getFileName(r.input_path)}**
|
|
157
|
-
- 输出: \`${r.output_path}\`
|
|
158
|
-
- 尺寸: ${(_a = r.dimensions) === null || _a === void 0 ? void 0 : _a.width} × ${(_b = r.dimensions) === null || _b === void 0 ? void 0 : _b.height}
|
|
159
|
-
- 大小: ${formatFileSize(r.file_size || 0)}
|
|
160
|
-
`;
|
|
161
|
-
})
|
|
162
|
-
.join("")}
|
|
163
|
-
|
|
164
|
-
## ❌ 转换失败 (${failedResults.length}张)
|
|
165
|
-
|
|
166
|
-
${failedResults
|
|
167
|
-
.map((r, index) => `
|
|
168
|
-
${index + 1}. **${getFileName(r.input_path)}**
|
|
169
|
-
- 错误: ${r.error}
|
|
170
|
-
`)
|
|
171
|
-
.join("")}
|
|
172
|
-
|
|
173
|
-
**请检查失败的图片并重试。**
|
|
174
|
-
`.trim();
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
|
-
* 格式化错误响应
|
|
179
|
-
*/
|
|
180
|
-
function formatErrorResponse(error) {
|
|
181
|
-
const errorMessages = {
|
|
182
|
-
[types_1.ConversionErrorCodes.INVALID_INPUT_PATH]: "输入路径无效",
|
|
183
|
-
[types_1.ConversionErrorCodes.UNSUPPORTED_FORMAT]: "不支持的格式",
|
|
184
|
-
[types_1.ConversionErrorCodes.FILE_NOT_FOUND]: "文件未找到",
|
|
185
|
-
[types_1.ConversionErrorCodes.INVALID_DIMENSIONS]: "无效的尺寸参数",
|
|
186
|
-
[types_1.ConversionErrorCodes.CONVERSION_FAILED]: "转换失败",
|
|
187
|
-
[types_1.ConversionErrorCodes.OUTPUT_WRITE_FAILED]: "输出写入失败",
|
|
188
|
-
[types_1.ConversionErrorCodes.INVALID_QUALITY]: "无效的质量参数",
|
|
189
|
-
};
|
|
190
|
-
const errorTitle = errorMessages[error.code] || "转换错误";
|
|
191
|
-
return `
|
|
192
|
-
# ❌ ${errorTitle}
|
|
193
|
-
|
|
194
|
-
## 错误信息
|
|
195
|
-
${error.message}
|
|
196
|
-
|
|
197
|
-
## 错误代码
|
|
198
|
-
${error.code}
|
|
199
|
-
|
|
200
|
-
## 解决建议
|
|
201
|
-
${getErrorSuggestion(error.code)}
|
|
202
|
-
|
|
203
|
-
## 支持的格式
|
|
204
|
-
- **输入格式**: ${types_1.SUPPORTED_INPUT_FORMATS.join(", ")}
|
|
205
|
-
- **输出格式**: ${types_1.SUPPORTED_OUTPUT_FORMATS.join(", ")}
|
|
206
|
-
|
|
207
|
-
## 错误详情
|
|
208
|
-
- **时间**: ${new Date().toISOString()}
|
|
209
|
-
- **上下文**: ${error.context ? JSON.stringify(error.context, null, 2) : "无"}
|
|
210
|
-
|
|
211
|
-
请根据上述信息调整参数后重试。
|
|
212
|
-
`.trim();
|
|
213
|
-
}
|
|
214
|
-
/**
|
|
215
|
-
* 格式化未知错误响应
|
|
216
|
-
*/
|
|
217
|
-
function formatUnknownErrorResponse(error) {
|
|
218
|
-
return `
|
|
219
|
-
# ❌ 系统错误
|
|
220
|
-
|
|
221
|
-
图片转换过程中发生未知错误,请稍后重试或联系技术支持。
|
|
222
|
-
|
|
223
|
-
**错误信息**: ${(error === null || error === void 0 ? void 0 : error.message) || "未知错误"}
|
|
224
|
-
**时间**: ${new Date().toISOString()}
|
|
225
|
-
|
|
226
|
-
## 建议
|
|
227
|
-
1. 检查输入文件是否存在且可读
|
|
228
|
-
2. 确认输出目录有写入权限
|
|
229
|
-
3. 验证图片文件是否损坏
|
|
230
|
-
4. 如问题持续,请联系技术支持
|
|
231
|
-
`.trim();
|
|
232
|
-
}
|
|
233
|
-
// 辅助函数
|
|
234
|
-
function getFileName(filePath) {
|
|
235
|
-
return filePath.split("/").pop() || filePath;
|
|
236
|
-
}
|
|
237
|
-
function formatFileSize(bytes) {
|
|
238
|
-
if (bytes === 0)
|
|
239
|
-
return "0 B";
|
|
240
|
-
const k = 1024;
|
|
241
|
-
const sizes = ["B", "KB", "MB", "GB"];
|
|
242
|
-
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
243
|
-
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;
|
|
244
|
-
}
|
|
245
|
-
function getErrorSuggestion(errorCode) {
|
|
246
|
-
const suggestions = {
|
|
247
|
-
[types_1.ConversionErrorCodes.INVALID_INPUT_PATH]: "请检查输入路径是否正确",
|
|
248
|
-
[types_1.ConversionErrorCodes.UNSUPPORTED_FORMAT]: "请使用支持的图片格式",
|
|
249
|
-
[types_1.ConversionErrorCodes.FILE_NOT_FOUND]: "请确认文件存在且路径正确",
|
|
250
|
-
[types_1.ConversionErrorCodes.INVALID_DIMENSIONS]: "请提供有效的宽度和高度值(大于0)",
|
|
251
|
-
[types_1.ConversionErrorCodes.CONVERSION_FAILED]: "请检查图片文件是否损坏",
|
|
252
|
-
[types_1.ConversionErrorCodes.OUTPUT_WRITE_FAILED]: "请检查输出目录权限",
|
|
253
|
-
[types_1.ConversionErrorCodes.INVALID_QUALITY]: "请设置1-100之间的质量值",
|
|
254
|
-
};
|
|
255
|
-
return suggestions[errorCode] || "请检查输入参数并重试";
|
|
256
|
-
}
|
|
257
|
-
// 导出类型和服务
|
|
258
|
-
var converter_2 = require("./converter");
|
|
259
|
-
Object.defineProperty(exports, "ImageConverter", { enumerable: true, get: function () { return converter_2.ImageConverter; } });
|
|
260
|
-
var types_2 = require("./types");
|
|
261
|
-
Object.defineProperty(exports, "ImageConversionError", { enumerable: true, get: function () { return types_2.ImageConversionError; } });
|
|
262
|
-
Object.defineProperty(exports, "ConversionErrorCodes", { enumerable: true, get: function () { return types_2.ConversionErrorCodes; } });
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* 图片格式转换智能体的类型定义
|
|
4
|
-
*/
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.SUPPORTED_OUTPUT_FORMATS = exports.SUPPORTED_INPUT_FORMATS = exports.ConversionErrorCodes = exports.ImageConversionError = void 0;
|
|
7
|
-
class ImageConversionError extends Error {
|
|
8
|
-
constructor(message, code, context) {
|
|
9
|
-
super(message);
|
|
10
|
-
this.code = code;
|
|
11
|
-
this.context = context;
|
|
12
|
-
this.name = 'ImageConversionError';
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
exports.ImageConversionError = ImageConversionError;
|
|
16
|
-
var ConversionErrorCodes;
|
|
17
|
-
(function (ConversionErrorCodes) {
|
|
18
|
-
ConversionErrorCodes["INVALID_INPUT_PATH"] = "INVALID_INPUT_PATH";
|
|
19
|
-
ConversionErrorCodes["UNSUPPORTED_FORMAT"] = "UNSUPPORTED_FORMAT";
|
|
20
|
-
ConversionErrorCodes["FILE_NOT_FOUND"] = "FILE_NOT_FOUND";
|
|
21
|
-
ConversionErrorCodes["INVALID_DIMENSIONS"] = "INVALID_DIMENSIONS";
|
|
22
|
-
ConversionErrorCodes["CONVERSION_FAILED"] = "CONVERSION_FAILED";
|
|
23
|
-
ConversionErrorCodes["OUTPUT_WRITE_FAILED"] = "OUTPUT_WRITE_FAILED";
|
|
24
|
-
ConversionErrorCodes["INVALID_QUALITY"] = "INVALID_QUALITY";
|
|
25
|
-
})(ConversionErrorCodes || (exports.ConversionErrorCodes = ConversionErrorCodes = {}));
|
|
26
|
-
exports.SUPPORTED_INPUT_FORMATS = [
|
|
27
|
-
'jpg', 'jpeg', 'png', 'gif', 'bmp', 'tiff', 'tif', 'webp', 'svg', 'ico'
|
|
28
|
-
];
|
|
29
|
-
exports.SUPPORTED_OUTPUT_FORMATS = [
|
|
30
|
-
'jpg', 'jpeg', 'png', 'gif', 'bmp', 'tiff', 'webp', 'ico'
|
|
31
|
-
];
|