persona-core 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/db/client.d.ts +55 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +157 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/index.d.ts +7 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +7 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/repositories/executionRepository.d.ts +15 -0
- package/dist/db/repositories/executionRepository.d.ts.map +1 -0
- package/dist/db/repositories/executionRepository.js +41 -0
- package/dist/db/repositories/executionRepository.js.map +1 -0
- package/dist/db/repositories/index.d.ts +10 -0
- package/dist/db/repositories/index.d.ts.map +1 -0
- package/dist/db/repositories/index.js +10 -0
- package/dist/db/repositories/index.js.map +1 -0
- package/dist/db/repositories/nodeRepository.d.ts +15 -0
- package/dist/db/repositories/nodeRepository.d.ts.map +1 -0
- package/dist/db/repositories/nodeRepository.js +61 -0
- package/dist/db/repositories/nodeRepository.js.map +1 -0
- package/dist/db/repositories/personaRepository.d.ts +13 -0
- package/dist/db/repositories/personaRepository.d.ts.map +1 -0
- package/dist/db/repositories/personaRepository.js +42 -0
- package/dist/db/repositories/personaRepository.js.map +1 -0
- package/dist/db/repositories/planResultRepository.d.ts +13 -0
- package/dist/db/repositories/planResultRepository.d.ts.map +1 -0
- package/dist/db/repositories/planResultRepository.js +30 -0
- package/dist/db/repositories/planResultRepository.js.map +1 -0
- package/dist/db/repositories/scheduleRepository.d.ts +27 -0
- package/dist/db/repositories/scheduleRepository.d.ts.map +1 -0
- package/dist/db/repositories/scheduleRepository.js +187 -0
- package/dist/db/repositories/scheduleRepository.js.map +1 -0
- package/dist/db/repositories/types.d.ts +132 -0
- package/dist/db/repositories/types.d.ts.map +1 -0
- package/dist/db/repositories/types.js +5 -0
- package/dist/db/repositories/types.js.map +1 -0
- package/dist/db/schema.d.ts +742 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +85 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/capabilities.d.ts +56 -0
- package/dist/llm/capabilities.d.ts.map +1 -0
- package/dist/llm/capabilities.js +305 -0
- package/dist/llm/capabilities.js.map +1 -0
- package/dist/llm/index.d.ts +7 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +10 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/interfaces.d.ts +249 -0
- package/dist/llm/interfaces.d.ts.map +1 -0
- package/dist/llm/interfaces.js +5 -0
- package/dist/llm/interfaces.js.map +1 -0
- package/dist/llm/providers/anthropic-compatible.d.ts +48 -0
- package/dist/llm/providers/anthropic-compatible.d.ts.map +1 -0
- package/dist/llm/providers/anthropic-compatible.js +163 -0
- package/dist/llm/providers/anthropic-compatible.js.map +1 -0
- package/dist/llm/providers/index.d.ts +14 -0
- package/dist/llm/providers/index.d.ts.map +1 -0
- package/dist/llm/providers/index.js +12 -0
- package/dist/llm/providers/index.js.map +1 -0
- package/dist/llm/providers/openai-compatible.d.ts +59 -0
- package/dist/llm/providers/openai-compatible.d.ts.map +1 -0
- package/dist/llm/providers/openai-compatible.js +207 -0
- package/dist/llm/providers/openai-compatible.js.map +1 -0
- package/dist/services/actionService.d.ts +132 -0
- package/dist/services/actionService.d.ts.map +1 -0
- package/dist/services/actionService.js +971 -0
- package/dist/services/actionService.js.map +1 -0
- package/dist/services/branchService.d.ts +19 -0
- package/dist/services/branchService.d.ts.map +1 -0
- package/dist/services/branchService.js +50 -0
- package/dist/services/branchService.js.map +1 -0
- package/dist/services/expressionEvaluator.d.ts +16 -0
- package/dist/services/expressionEvaluator.d.ts.map +1 -0
- package/dist/services/expressionEvaluator.js +70 -0
- package/dist/services/expressionEvaluator.js.map +1 -0
- package/dist/services/factory.d.ts +43 -0
- package/dist/services/factory.d.ts.map +1 -0
- package/dist/services/factory.js +30 -0
- package/dist/services/factory.js.map +1 -0
- package/dist/services/index.d.ts +15 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +17 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/interfaces.d.ts +117 -0
- package/dist/services/interfaces.d.ts.map +1 -0
- package/dist/services/interfaces.js +5 -0
- package/dist/services/interfaces.js.map +1 -0
- package/dist/services/loaders/fileLoader.d.ts +56 -0
- package/dist/services/loaders/fileLoader.d.ts.map +1 -0
- package/dist/services/loaders/fileLoader.js +161 -0
- package/dist/services/loaders/fileLoader.js.map +1 -0
- package/dist/services/loaders/index.d.ts +6 -0
- package/dist/services/loaders/index.d.ts.map +1 -0
- package/dist/services/loaders/index.js +6 -0
- package/dist/services/loaders/index.js.map +1 -0
- package/dist/services/loaders/transformers.d.ts +32 -0
- package/dist/services/loaders/transformers.d.ts.map +1 -0
- package/dist/services/loaders/transformers.js +78 -0
- package/dist/services/loaders/transformers.js.map +1 -0
- package/dist/services/mockAction.d.ts +65 -0
- package/dist/services/mockAction.d.ts.map +1 -0
- package/dist/services/mockAction.js +153 -0
- package/dist/services/mockAction.js.map +1 -0
- package/dist/services/mockBranch.d.ts +50 -0
- package/dist/services/mockBranch.d.ts.map +1 -0
- package/dist/services/mockBranch.js +75 -0
- package/dist/services/mockBranch.js.map +1 -0
- package/dist/services/mockThinking.d.ts +68 -0
- package/dist/services/mockThinking.d.ts.map +1 -0
- package/dist/services/mockThinking.js +89 -0
- package/dist/services/mockThinking.js.map +1 -0
- package/dist/services/thinkingService.d.ts +15 -0
- package/dist/services/thinkingService.d.ts.map +1 -0
- package/dist/services/thinkingService.js +117 -0
- package/dist/services/thinkingService.js.map +1 -0
- package/dist/temporal/activities/actionActivities.d.ts +15 -0
- package/dist/temporal/activities/actionActivities.d.ts.map +1 -0
- package/dist/temporal/activities/actionActivities.js +140 -0
- package/dist/temporal/activities/actionActivities.js.map +1 -0
- package/dist/temporal/activities/branchActivities.d.ts +13 -0
- package/dist/temporal/activities/branchActivities.d.ts.map +1 -0
- package/dist/temporal/activities/branchActivities.js +26 -0
- package/dist/temporal/activities/branchActivities.js.map +1 -0
- package/dist/temporal/activities/dbActivities.d.ts +14 -0
- package/dist/temporal/activities/dbActivities.d.ts.map +1 -0
- package/dist/temporal/activities/dbActivities.js +84 -0
- package/dist/temporal/activities/dbActivities.js.map +1 -0
- package/dist/temporal/activities/index.d.ts +9 -0
- package/dist/temporal/activities/index.d.ts.map +1 -0
- package/dist/temporal/activities/index.js +9 -0
- package/dist/temporal/activities/index.js.map +1 -0
- package/dist/temporal/activities/thinkingActivities.d.ts +17 -0
- package/dist/temporal/activities/thinkingActivities.d.ts.map +1 -0
- package/dist/temporal/activities/thinkingActivities.js +145 -0
- package/dist/temporal/activities/thinkingActivities.js.map +1 -0
- package/dist/temporal/activities/types.d.ts +100 -0
- package/dist/temporal/activities/types.d.ts.map +1 -0
- package/dist/temporal/activities/types.js +5 -0
- package/dist/temporal/activities/types.js.map +1 -0
- package/dist/temporal/client.d.ts +43 -0
- package/dist/temporal/client.d.ts.map +1 -0
- package/dist/temporal/client.js +75 -0
- package/dist/temporal/client.js.map +1 -0
- package/dist/temporal/index.d.ts +10 -0
- package/dist/temporal/index.d.ts.map +1 -0
- package/dist/temporal/index.js +12 -0
- package/dist/temporal/index.js.map +1 -0
- package/dist/temporal/personaCoreClient.d.ts +199 -0
- package/dist/temporal/personaCoreClient.d.ts.map +1 -0
- package/dist/temporal/personaCoreClient.js +233 -0
- package/dist/temporal/personaCoreClient.js.map +1 -0
- package/dist/temporal/personaWorker.d.ts +141 -0
- package/dist/temporal/personaWorker.d.ts.map +1 -0
- package/dist/temporal/personaWorker.js +93 -0
- package/dist/temporal/personaWorker.js.map +1 -0
- package/dist/temporal/worker.d.ts +66 -0
- package/dist/temporal/worker.d.ts.map +1 -0
- package/dist/temporal/worker.js +109 -0
- package/dist/temporal/worker.js.map +1 -0
- package/dist/temporal/workflows/index.d.ts +5 -0
- package/dist/temporal/workflows/index.d.ts.map +1 -0
- package/dist/temporal/workflows/index.js +5 -0
- package/dist/temporal/workflows/index.js.map +1 -0
- package/dist/temporal/workflows/scheduleWorkflow.d.ts +31 -0
- package/dist/temporal/workflows/scheduleWorkflow.d.ts.map +1 -0
- package/dist/temporal/workflows/scheduleWorkflow.js +256 -0
- package/dist/temporal/workflows/scheduleWorkflow.js.map +1 -0
- package/dist/types/common.d.ts +81 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +5 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +12 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/nodes.d.ts +496 -0
- package/dist/types/nodes.d.ts.map +1 -0
- package/dist/types/nodes.js +5 -0
- package/dist/types/nodes.js.map +1 -0
- package/dist/types/persona.d.ts +59 -0
- package/dist/types/persona.d.ts.map +1 -0
- package/dist/types/persona.js +36 -0
- package/dist/types/persona.js.map +1 -0
- package/dist/types/schedule.d.ts +143 -0
- package/dist/types/schedule.d.ts.map +1 -0
- package/dist/types/schedule.js +155 -0
- package/dist/types/schedule.js.map +1 -0
- package/dist/utils/dateUtils.d.ts +31 -0
- package/dist/utils/dateUtils.d.ts.map +1 -0
- package/dist/utils/dateUtils.js +53 -0
- package/dist/utils/dateUtils.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/inputResolver.d.ts +43 -0
- package/dist/utils/inputResolver.d.ts.map +1 -0
- package/dist/utils/inputResolver.js +137 -0
- package/dist/utils/inputResolver.js.map +1 -0
- package/dist/utils/sharedDataUtils.d.ts +36 -0
- package/dist/utils/sharedDataUtils.d.ts.map +1 -0
- package/dist/utils/sharedDataUtils.js +84 -0
- package/dist/utils/sharedDataUtils.js.map +1 -0
- package/dist/utils/typeGuards.d.ts +33 -0
- package/dist/utils/typeGuards.d.ts.map +1 -0
- package/dist/utils/typeGuards.js +50 -0
- package/dist/utils/typeGuards.js.map +1 -0
- package/docs/add-llm-provider.md +353 -0
- package/docs/external/deepseek-v32.md +28 -0
- package/docs/quick-start.md +849 -0
- package/docs/suite-guide.md +148 -0
- package/docs/usage-guide.md +1487 -0
- package/package.json +80 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File Loader
|
|
3
|
+
* 读取本地文件内容,用于 Template Loader 表达式
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'fs/promises';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
/**
|
|
8
|
+
* 敏感文件模式
|
|
9
|
+
* 禁止读取这些文件以保护安全
|
|
10
|
+
*/
|
|
11
|
+
const FORBIDDEN_PATTERNS = [
|
|
12
|
+
/\.env$/i,
|
|
13
|
+
/\.env\.\w+$/i, // .env.local, .env.production 等
|
|
14
|
+
/keys\.json$/i,
|
|
15
|
+
/\.pem$/i,
|
|
16
|
+
/\.key$/i,
|
|
17
|
+
/id_rsa$/i,
|
|
18
|
+
/id_ed25519$/i,
|
|
19
|
+
/\.p12$/i,
|
|
20
|
+
/\.pfx$/i,
|
|
21
|
+
/credentials\.json$/i,
|
|
22
|
+
/secrets?\.(json|ya?ml)$/i,
|
|
23
|
+
];
|
|
24
|
+
/**
|
|
25
|
+
* MIME 类型映射
|
|
26
|
+
*/
|
|
27
|
+
const MIME_TYPES = {
|
|
28
|
+
// 图片
|
|
29
|
+
'.png': 'image/png',
|
|
30
|
+
'.jpg': 'image/jpeg',
|
|
31
|
+
'.jpeg': 'image/jpeg',
|
|
32
|
+
'.gif': 'image/gif',
|
|
33
|
+
'.webp': 'image/webp',
|
|
34
|
+
'.svg': 'image/svg+xml',
|
|
35
|
+
'.bmp': 'image/bmp',
|
|
36
|
+
'.ico': 'image/x-icon',
|
|
37
|
+
'.tiff': 'image/tiff',
|
|
38
|
+
'.tif': 'image/tiff',
|
|
39
|
+
// 视频
|
|
40
|
+
'.mp4': 'video/mp4',
|
|
41
|
+
'.webm': 'video/webm',
|
|
42
|
+
'.avi': 'video/x-msvideo',
|
|
43
|
+
'.mov': 'video/quicktime',
|
|
44
|
+
'.mkv': 'video/x-matroska',
|
|
45
|
+
// 音频
|
|
46
|
+
'.mp3': 'audio/mpeg',
|
|
47
|
+
'.wav': 'audio/wav',
|
|
48
|
+
'.ogg': 'audio/ogg',
|
|
49
|
+
'.flac': 'audio/flac',
|
|
50
|
+
// 文本
|
|
51
|
+
'.txt': 'text/plain',
|
|
52
|
+
'.html': 'text/html',
|
|
53
|
+
'.htm': 'text/html',
|
|
54
|
+
'.css': 'text/css',
|
|
55
|
+
'.csv': 'text/csv',
|
|
56
|
+
'.xml': 'text/xml',
|
|
57
|
+
'.md': 'text/markdown',
|
|
58
|
+
// 数据
|
|
59
|
+
'.json': 'application/json',
|
|
60
|
+
'.js': 'application/javascript',
|
|
61
|
+
'.ts': 'application/typescript',
|
|
62
|
+
'.pdf': 'application/pdf',
|
|
63
|
+
'.zip': 'application/zip',
|
|
64
|
+
'.tar': 'application/x-tar',
|
|
65
|
+
'.gz': 'application/gzip',
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* FileLoader 类
|
|
69
|
+
* 负责安全地读取本地文件
|
|
70
|
+
*/
|
|
71
|
+
export class FileLoader {
|
|
72
|
+
baseDir;
|
|
73
|
+
maxFileSize;
|
|
74
|
+
constructor(
|
|
75
|
+
/** 基础目录,所有相对路径都相对于此目录 */
|
|
76
|
+
baseDir,
|
|
77
|
+
/** 最大文件大小(字节) */
|
|
78
|
+
maxFileSize = 50 * 1024 * 1024 // 50MB
|
|
79
|
+
) {
|
|
80
|
+
this.baseDir = baseDir;
|
|
81
|
+
this.maxFileSize = maxFileSize;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* 加载文件
|
|
85
|
+
*
|
|
86
|
+
* @param filePath 文件路径(相对或绝对)
|
|
87
|
+
* @param options 加载选项
|
|
88
|
+
* @returns 加载结果
|
|
89
|
+
*/
|
|
90
|
+
async load(filePath, options = {}) {
|
|
91
|
+
// 解析完整路径
|
|
92
|
+
const fullPath = path.isAbsolute(filePath)
|
|
93
|
+
? filePath
|
|
94
|
+
: path.resolve(this.baseDir, filePath);
|
|
95
|
+
// 安全检查:路径遍历防护
|
|
96
|
+
const normalizedPath = path.normalize(fullPath);
|
|
97
|
+
const normalizedBase = path.normalize(this.baseDir);
|
|
98
|
+
if (!normalizedPath.startsWith(normalizedBase)) {
|
|
99
|
+
throw new Error(`File path must be within base directory: ${this.baseDir}. ` +
|
|
100
|
+
`Attempted path: ${filePath}`);
|
|
101
|
+
}
|
|
102
|
+
// 安全检查:敏感文件保护
|
|
103
|
+
if (this.isForbiddenPath(normalizedPath)) {
|
|
104
|
+
throw new Error(`Access to sensitive files is forbidden: ${path.basename(filePath)}`);
|
|
105
|
+
}
|
|
106
|
+
// 检查文件是否存在
|
|
107
|
+
try {
|
|
108
|
+
await fs.access(normalizedPath);
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
throw new Error(`File not found: ${filePath}`);
|
|
112
|
+
}
|
|
113
|
+
// 获取文件信息
|
|
114
|
+
const stats = await fs.stat(normalizedPath);
|
|
115
|
+
// 检查文件大小
|
|
116
|
+
if (stats.size > this.maxFileSize) {
|
|
117
|
+
throw new Error(`File too large: ${stats.size} bytes (max: ${this.maxFileSize} bytes). ` +
|
|
118
|
+
`File: ${filePath}`);
|
|
119
|
+
}
|
|
120
|
+
// 确定 MIME 类型
|
|
121
|
+
const mimeType = this.detectMimeType(normalizedPath);
|
|
122
|
+
// 判断是否需要二进制模式
|
|
123
|
+
// 如果明确指定 binary 或者是二进制文件类型,使用二进制模式
|
|
124
|
+
const needsBinary = options.binary ?? this.isBinaryMimeType(mimeType);
|
|
125
|
+
// 读取文件
|
|
126
|
+
const buffer = await fs.readFile(normalizedPath);
|
|
127
|
+
return {
|
|
128
|
+
value: needsBinary ? buffer : buffer.toString('utf-8'),
|
|
129
|
+
mimeType,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* 检测文件的 MIME 类型
|
|
134
|
+
*/
|
|
135
|
+
detectMimeType(filePath) {
|
|
136
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
137
|
+
return MIME_TYPES[ext] ?? 'application/octet-stream';
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* 检查 MIME 类型是否为二进制类型
|
|
141
|
+
*/
|
|
142
|
+
isBinaryMimeType(mimeType) {
|
|
143
|
+
// 文本类型不是二进制
|
|
144
|
+
if (mimeType.startsWith('text/')) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
// JSON 和 JavaScript 是文本
|
|
148
|
+
if (mimeType === 'application/json' || mimeType === 'application/javascript') {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
// 其他都视为二进制
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* 检查路径是否是被禁止的敏感文件
|
|
156
|
+
*/
|
|
157
|
+
isForbiddenPath(filePath) {
|
|
158
|
+
return FORBIDDEN_PATTERNS.some(pattern => pattern.test(filePath));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=fileLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileLoader.js","sourceRoot":"","sources":["../../../src/services/loaders/fileLoader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template Loaders 模块导出
|
|
3
|
+
*/
|
|
4
|
+
export { FileLoader, type LoaderResult, type FileLoadOptions } from './fileLoader.js';
|
|
5
|
+
export { builtinTransformers, applyTransformers, type Transformer, type TransformerContext } from './transformers.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/loaders/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,KAAK,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACtF,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACxB,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/loaders/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAA2C,MAAM,iBAAiB,CAAC;AACtF,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EAGlB,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template Loader Transformers
|
|
3
|
+
* 用于在 Loader 处理后对数据进行转换
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Transformer 上下文
|
|
7
|
+
* 包含转换过程中需要的元数据
|
|
8
|
+
*/
|
|
9
|
+
export interface TransformerContext {
|
|
10
|
+
/** 文件的 MIME 类型 */
|
|
11
|
+
mimeType?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Transformer 函数类型
|
|
15
|
+
* 接收值和上下文,返回转换后的值
|
|
16
|
+
*/
|
|
17
|
+
export type Transformer = (value: string | Buffer, context: TransformerContext) => string | Buffer;
|
|
18
|
+
/**
|
|
19
|
+
* 内置 Transformer 集合
|
|
20
|
+
*/
|
|
21
|
+
export declare const builtinTransformers: Record<string, Transformer>;
|
|
22
|
+
/**
|
|
23
|
+
* 应用转换器链
|
|
24
|
+
* 按顺序执行所有转换器
|
|
25
|
+
*
|
|
26
|
+
* @param value 初始值
|
|
27
|
+
* @param transformerNames 转换器名称数组
|
|
28
|
+
* @param context 转换上下文
|
|
29
|
+
* @returns 转换后的值
|
|
30
|
+
*/
|
|
31
|
+
export declare function applyTransformers(value: string | Buffer, transformerNames: string[], context: TransformerContext): string | Buffer;
|
|
32
|
+
//# sourceMappingURL=transformers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transformers.d.ts","sourceRoot":"","sources":["../../../src/services/loaders/transformers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,kBAAkB;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,CACxB,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,OAAO,EAAE,kBAAkB,KACxB,MAAM,GAAG,MAAM,CAAC;AAErB;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAiD3D,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,gBAAgB,EAAE,MAAM,EAAE,EAC1B,OAAO,EAAE,kBAAkB,GAC1B,MAAM,GAAG,MAAM,CAgBjB"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template Loader Transformers
|
|
3
|
+
* 用于在 Loader 处理后对数据进行转换
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* 内置 Transformer 集合
|
|
7
|
+
*/
|
|
8
|
+
export const builtinTransformers = {
|
|
9
|
+
/**
|
|
10
|
+
* Base64 编码转换器
|
|
11
|
+
* 将 Buffer 或字符串转换为 base64 编码的字符串
|
|
12
|
+
*/
|
|
13
|
+
base64: (value, _ctx) => {
|
|
14
|
+
if (Buffer.isBuffer(value)) {
|
|
15
|
+
return value.toString('base64');
|
|
16
|
+
}
|
|
17
|
+
return Buffer.from(value).toString('base64');
|
|
18
|
+
},
|
|
19
|
+
/**
|
|
20
|
+
* Data URI 转换器
|
|
21
|
+
* 将 base64 字符串转换为 Data URI 格式
|
|
22
|
+
* 输入应为 base64 字符串,通常与 base64 transformer 配合使用
|
|
23
|
+
*
|
|
24
|
+
* 示例输出: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA..."
|
|
25
|
+
*/
|
|
26
|
+
dataUri: (value, ctx) => {
|
|
27
|
+
if (typeof value !== 'string') {
|
|
28
|
+
throw new Error('dataUri transformer requires string input (base64). Use base64 transformer first.');
|
|
29
|
+
}
|
|
30
|
+
const mimeType = ctx.mimeType ?? 'application/octet-stream';
|
|
31
|
+
return `data:${mimeType};base64,${value}`;
|
|
32
|
+
},
|
|
33
|
+
/**
|
|
34
|
+
* JSON 序列化转换器
|
|
35
|
+
* 将值序列化为 JSON 字符串
|
|
36
|
+
*/
|
|
37
|
+
json: (value, _ctx) => {
|
|
38
|
+
if (Buffer.isBuffer(value)) {
|
|
39
|
+
// 对于 Buffer,转换为 base64 后再序列化
|
|
40
|
+
return JSON.stringify(value.toString('base64'));
|
|
41
|
+
}
|
|
42
|
+
return JSON.stringify(value);
|
|
43
|
+
},
|
|
44
|
+
/**
|
|
45
|
+
* Trim 转换器
|
|
46
|
+
* 去除字符串首尾的空白字符
|
|
47
|
+
*/
|
|
48
|
+
trim: (value, _ctx) => {
|
|
49
|
+
if (typeof value !== 'string') {
|
|
50
|
+
throw new Error('trim transformer requires string input');
|
|
51
|
+
}
|
|
52
|
+
return value.trim();
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* 应用转换器链
|
|
57
|
+
* 按顺序执行所有转换器
|
|
58
|
+
*
|
|
59
|
+
* @param value 初始值
|
|
60
|
+
* @param transformerNames 转换器名称数组
|
|
61
|
+
* @param context 转换上下文
|
|
62
|
+
* @returns 转换后的值
|
|
63
|
+
*/
|
|
64
|
+
export function applyTransformers(value, transformerNames, context) {
|
|
65
|
+
let result = value;
|
|
66
|
+
for (const transformerName of transformerNames) {
|
|
67
|
+
// 跳过 binary,它是 loader 内部选项
|
|
68
|
+
if (transformerName === 'binary')
|
|
69
|
+
continue;
|
|
70
|
+
const transformer = builtinTransformers[transformerName];
|
|
71
|
+
if (!transformer) {
|
|
72
|
+
throw new Error(`Unknown transformer: ${transformerName}. Available: ${Object.keys(builtinTransformers).join(', ')}`);
|
|
73
|
+
}
|
|
74
|
+
result = transformer(result, context);
|
|
75
|
+
}
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=transformers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transformers.js","sourceRoot":"","sources":["../../../src/services/loaders/transformers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAoBH;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAgC;IAC9D;;;OAGG;IACH,MAAM,EAAE,CAAC,KAAsB,EAAE,IAAwB,EAAU,EAAE;QACnE,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;;OAMG;IACH,OAAO,EAAE,CAAC,KAAsB,EAAE,GAAuB,EAAU,EAAE;QACnE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC,CAAC;QACvG,CAAC;QACD,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,0BAA0B,CAAC;QAC5D,OAAO,QAAQ,QAAQ,WAAW,KAAK,EAAE,CAAC;IAC5C,CAAC;IAED;;;OAGG;IACH,IAAI,EAAE,CAAC,KAAsB,EAAE,IAAwB,EAAU,EAAE;QACjE,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,6BAA6B;YAC7B,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,IAAI,EAAE,CAAC,KAAsB,EAAE,IAAwB,EAAU,EAAE;QACjE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;CACF,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAsB,EACtB,gBAA0B,EAC1B,OAA2B;IAE3B,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,KAAK,MAAM,eAAe,IAAI,gBAAgB,EAAE,CAAC;QAC/C,2BAA2B;QAC3B,IAAI,eAAe,KAAK,QAAQ;YAAE,SAAS;QAE3C,MAAM,WAAW,GAAG,mBAAmB,CAAC,eAAe,CAAC,CAAC;QACzD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,wBAAwB,eAAe,gBAAgB,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxH,CAAC;QAED,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock 动作节点服务
|
|
3
|
+
* 用于测试环境模拟 Action 执行
|
|
4
|
+
*/
|
|
5
|
+
import { ActionService, ActionContext, ActionResult, TaskStatus, MockService } from './interfaces.js';
|
|
6
|
+
import { ActionNodeType } from '../types/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Mock 动作配置
|
|
9
|
+
*/
|
|
10
|
+
export interface MockActionConfig {
|
|
11
|
+
/** 预定义的输出结果 */
|
|
12
|
+
outputs?: Record<string, unknown> | (() => Record<string, unknown>);
|
|
13
|
+
/** 模拟延迟 (ms) */
|
|
14
|
+
delayMs?: number;
|
|
15
|
+
/** 是否为异步任务 */
|
|
16
|
+
isAsync?: boolean;
|
|
17
|
+
/** 异步任务需要的轮询次数 */
|
|
18
|
+
pollCount?: number;
|
|
19
|
+
/** 是否模拟失败 */
|
|
20
|
+
shouldFail?: boolean;
|
|
21
|
+
/** 失败时机 */
|
|
22
|
+
failureType?: 'immediate' | 'after_submit' | 'after_polls' | 'timeout';
|
|
23
|
+
/** 失败错误信息 */
|
|
24
|
+
failureMessage?: string;
|
|
25
|
+
/** 进度模拟(异步任务) */
|
|
26
|
+
progressSteps?: number[];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Mock 动作服务实现
|
|
30
|
+
*/
|
|
31
|
+
export declare class MockActionService implements ActionService, MockService {
|
|
32
|
+
private configs;
|
|
33
|
+
private defaultConfig;
|
|
34
|
+
private asyncTasks;
|
|
35
|
+
private callHistory;
|
|
36
|
+
/**
|
|
37
|
+
* 配置特定动作类型的 Mock 行为
|
|
38
|
+
*/
|
|
39
|
+
configureAction(actionTypeId: string, config: MockActionConfig): void;
|
|
40
|
+
/**
|
|
41
|
+
* 设置默认配置
|
|
42
|
+
*/
|
|
43
|
+
setDefaultConfig(config: MockActionConfig): void;
|
|
44
|
+
/**
|
|
45
|
+
* 重置服务状态
|
|
46
|
+
*/
|
|
47
|
+
reset(): void;
|
|
48
|
+
/**
|
|
49
|
+
* 获取调用历史
|
|
50
|
+
*/
|
|
51
|
+
getCallHistory(): {
|
|
52
|
+
actionTypeId: string;
|
|
53
|
+
method: "executeSync" | "submitAsyncTask" | "checkTaskStatus" | "getTaskResult";
|
|
54
|
+
args: unknown[];
|
|
55
|
+
}[];
|
|
56
|
+
/**
|
|
57
|
+
* 获取活跃的异步任务数量
|
|
58
|
+
*/
|
|
59
|
+
getActiveTaskCount(): number;
|
|
60
|
+
executeSync(actionType: ActionNodeType, context: ActionContext): Promise<ActionResult>;
|
|
61
|
+
submitAsyncTask(actionType: ActionNodeType, context: ActionContext): Promise<string>;
|
|
62
|
+
checkTaskStatus(taskId: string): Promise<TaskStatus>;
|
|
63
|
+
getTaskResult(taskId: string): Promise<ActionResult>;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=mockAction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mockAction.d.ts","sourceRoot":"","sources":["../../src/services/mockAction.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,aAAa,EACb,aAAa,EACb,YAAY,EACZ,UAAU,EACV,WAAW,EACZ,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,eAAe;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACpE,gBAAgB;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kBAAkB;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa;IACb,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW;IACX,WAAW,CAAC,EAAE,WAAW,GAAG,cAAc,GAAG,aAAa,GAAG,SAAS,CAAC;IACvE,aAAa;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB;IACjB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAkBD;;GAEG;AACH,qBAAa,iBAAkB,YAAW,aAAa,EAAE,WAAW;IAClE,OAAO,CAAC,OAAO,CAA4C;IAC3D,OAAO,CAAC,aAAa,CAAwB;IAC7C,OAAO,CAAC,UAAU,CAA0C;IAC5D,OAAO,CAAC,WAAW,CAIX;IAER;;OAEG;IACH,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAIrE;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAIhD;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;OAEG;IACH,cAAc;sBAhCE,MAAM;gBACZ,aAAa,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,eAAe;cACzE,OAAO,EAAE;;IAkCjB;;OAEG;IACH,kBAAkB,IAAI,MAAM;IAItB,WAAW,CACf,UAAU,EAAE,cAAc,EAC1B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,CAAC;IA2BlB,eAAe,CACnB,UAAU,EAAE,cAAc,EAC1B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,MAAM,CAAC;IAqCZ,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA4CpD,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;CA2B3D"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock 动作节点服务
|
|
3
|
+
* 用于测试环境模拟 Action 执行
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Mock 动作服务实现
|
|
7
|
+
*/
|
|
8
|
+
export class MockActionService {
|
|
9
|
+
configs = new Map();
|
|
10
|
+
defaultConfig = {};
|
|
11
|
+
asyncTasks = new Map();
|
|
12
|
+
callHistory = [];
|
|
13
|
+
/**
|
|
14
|
+
* 配置特定动作类型的 Mock 行为
|
|
15
|
+
*/
|
|
16
|
+
configureAction(actionTypeId, config) {
|
|
17
|
+
this.configs.set(actionTypeId, config);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 设置默认配置
|
|
21
|
+
*/
|
|
22
|
+
setDefaultConfig(config) {
|
|
23
|
+
this.defaultConfig = config;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 重置服务状态
|
|
27
|
+
*/
|
|
28
|
+
reset() {
|
|
29
|
+
this.configs.clear();
|
|
30
|
+
this.asyncTasks.clear();
|
|
31
|
+
this.callHistory = [];
|
|
32
|
+
this.defaultConfig = {};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 获取调用历史
|
|
36
|
+
*/
|
|
37
|
+
getCallHistory() {
|
|
38
|
+
return [...this.callHistory];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 获取活跃的异步任务数量
|
|
42
|
+
*/
|
|
43
|
+
getActiveTaskCount() {
|
|
44
|
+
return this.asyncTasks.size;
|
|
45
|
+
}
|
|
46
|
+
async executeSync(actionType, context) {
|
|
47
|
+
this.callHistory.push({
|
|
48
|
+
actionTypeId: actionType.id,
|
|
49
|
+
method: 'executeSync',
|
|
50
|
+
args: [actionType, context],
|
|
51
|
+
});
|
|
52
|
+
const config = this.configs.get(actionType.id) ?? this.defaultConfig;
|
|
53
|
+
// 模拟延迟
|
|
54
|
+
if (config.delayMs) {
|
|
55
|
+
await new Promise(resolve => setTimeout(resolve, config.delayMs));
|
|
56
|
+
}
|
|
57
|
+
// 模拟失败
|
|
58
|
+
if (config.shouldFail && config.failureType === 'immediate') {
|
|
59
|
+
throw new Error(config.failureMessage ?? `Action ${actionType.id} failed`);
|
|
60
|
+
}
|
|
61
|
+
// 获取输出
|
|
62
|
+
const outputs = typeof config.outputs === 'function'
|
|
63
|
+
? config.outputs()
|
|
64
|
+
: (config.outputs ?? {});
|
|
65
|
+
return { outputs };
|
|
66
|
+
}
|
|
67
|
+
async submitAsyncTask(actionType, context) {
|
|
68
|
+
this.callHistory.push({
|
|
69
|
+
actionTypeId: actionType.id,
|
|
70
|
+
method: 'submitAsyncTask',
|
|
71
|
+
args: [actionType, context],
|
|
72
|
+
});
|
|
73
|
+
const config = this.configs.get(actionType.id) ?? this.defaultConfig;
|
|
74
|
+
// 模拟提交失败
|
|
75
|
+
if (config.shouldFail && config.failureType === 'after_submit') {
|
|
76
|
+
throw new Error(config.failureMessage ?? 'Failed to submit async task');
|
|
77
|
+
}
|
|
78
|
+
// 创建任务
|
|
79
|
+
const taskId = `task-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
80
|
+
const totalPolls = config.pollCount ?? 3;
|
|
81
|
+
const progressSteps = config.progressSteps ??
|
|
82
|
+
Array.from({ length: totalPolls }, (_, i) => Math.floor((100 / totalPolls) * (i + 1)));
|
|
83
|
+
this.asyncTasks.set(taskId, {
|
|
84
|
+
actionTypeId: actionType.id,
|
|
85
|
+
inputs: context.resolvedInputs,
|
|
86
|
+
currentPollIndex: 0,
|
|
87
|
+
totalPolls,
|
|
88
|
+
currentProgress: 0,
|
|
89
|
+
progressSteps,
|
|
90
|
+
config,
|
|
91
|
+
createdAt: Date.now(),
|
|
92
|
+
});
|
|
93
|
+
return taskId;
|
|
94
|
+
}
|
|
95
|
+
async checkTaskStatus(taskId) {
|
|
96
|
+
this.callHistory.push({
|
|
97
|
+
actionTypeId: '',
|
|
98
|
+
method: 'checkTaskStatus',
|
|
99
|
+
args: [taskId],
|
|
100
|
+
});
|
|
101
|
+
const task = this.asyncTasks.get(taskId);
|
|
102
|
+
if (!task) {
|
|
103
|
+
return {
|
|
104
|
+
completed: false,
|
|
105
|
+
failed: true,
|
|
106
|
+
error: 'Task not found',
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
// 递增轮询计数
|
|
110
|
+
task.currentPollIndex++;
|
|
111
|
+
// 更新进度
|
|
112
|
+
const progress = task.progressSteps[task.currentPollIndex - 1] ?? 100;
|
|
113
|
+
task.currentProgress = progress;
|
|
114
|
+
// 检查是否完成
|
|
115
|
+
const completed = task.currentPollIndex >= task.totalPolls;
|
|
116
|
+
// 模拟轮询后失败
|
|
117
|
+
if (task.config.shouldFail && task.config.failureType === 'after_polls' && completed) {
|
|
118
|
+
return {
|
|
119
|
+
completed: false,
|
|
120
|
+
failed: true,
|
|
121
|
+
error: task.config.failureMessage ?? 'Task failed after processing',
|
|
122
|
+
progress: task.currentProgress,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
completed,
|
|
127
|
+
failed: false,
|
|
128
|
+
progress: task.currentProgress,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
async getTaskResult(taskId) {
|
|
132
|
+
this.callHistory.push({
|
|
133
|
+
actionTypeId: '',
|
|
134
|
+
method: 'getTaskResult',
|
|
135
|
+
args: [taskId],
|
|
136
|
+
});
|
|
137
|
+
const task = this.asyncTasks.get(taskId);
|
|
138
|
+
if (!task) {
|
|
139
|
+
throw new Error('Task not found');
|
|
140
|
+
}
|
|
141
|
+
if (task.currentPollIndex < task.totalPolls) {
|
|
142
|
+
throw new Error('Task not completed yet');
|
|
143
|
+
}
|
|
144
|
+
// 获取输出
|
|
145
|
+
const outputs = typeof task.config.outputs === 'function'
|
|
146
|
+
? task.config.outputs()
|
|
147
|
+
: (task.config.outputs ?? {});
|
|
148
|
+
// 清理任务
|
|
149
|
+
this.asyncTasks.delete(taskId);
|
|
150
|
+
return { outputs };
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=mockAction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mockAction.js","sourceRoot":"","sources":["../../src/services/mockAction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock 分支决策服务
|
|
3
|
+
* 用于测试环境模拟分支决策
|
|
4
|
+
*/
|
|
5
|
+
import { BranchService, BranchResult, MockService } from './interfaces.js';
|
|
6
|
+
import { BranchNodeInstance, SharedDataInstance } from '../types/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Mock 分支配置
|
|
9
|
+
*/
|
|
10
|
+
export interface MockBranchConfig {
|
|
11
|
+
/** 预定义的分支选择结果 */
|
|
12
|
+
selectedBranchId?: string;
|
|
13
|
+
/** 动态决策函数 */
|
|
14
|
+
decisionFn?: (node: BranchNodeInstance, inputs: Record<string, unknown>) => string;
|
|
15
|
+
/** 模拟延迟 (ms) */
|
|
16
|
+
delayMs?: number;
|
|
17
|
+
/** 是否模拟失败 */
|
|
18
|
+
shouldFail?: boolean;
|
|
19
|
+
/** 失败错误信息 */
|
|
20
|
+
failureMessage?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Mock 分支服务实现
|
|
24
|
+
*/
|
|
25
|
+
export declare class MockBranchService implements BranchService, MockService {
|
|
26
|
+
private configs;
|
|
27
|
+
private defaultConfig;
|
|
28
|
+
private callHistory;
|
|
29
|
+
/**
|
|
30
|
+
* 配置特定节点的 Mock 行为
|
|
31
|
+
*/
|
|
32
|
+
configure(nodeId: string, config: MockBranchConfig): void;
|
|
33
|
+
/**
|
|
34
|
+
* 设置默认配置
|
|
35
|
+
*/
|
|
36
|
+
setDefaultConfig(config: MockBranchConfig): void;
|
|
37
|
+
/**
|
|
38
|
+
* 重置服务状态
|
|
39
|
+
*/
|
|
40
|
+
reset(): void;
|
|
41
|
+
/**
|
|
42
|
+
* 获取调用历史(用于断言)
|
|
43
|
+
*/
|
|
44
|
+
getCallHistory(): Array<{
|
|
45
|
+
nodeId: string;
|
|
46
|
+
inputs: Record<string, unknown>;
|
|
47
|
+
}>;
|
|
48
|
+
evaluateBranch(node: BranchNodeInstance, inputs: Record<string, unknown>, _sharedData: SharedDataInstance): Promise<BranchResult>;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=mockBranch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mockBranch.d.ts","sourceRoot":"","sources":["../../src/services/mockBranch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,aAAa,EACb,YAAY,EACZ,WAAW,EACZ,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE3E;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa;IACb,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC;IACnF,gBAAgB;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa;IACb,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,qBAAa,iBAAkB,YAAW,aAAa,EAAE,WAAW;IAClE,OAAO,CAAC,OAAO,CAA4C;IAC3D,OAAO,CAAC,aAAa,CAAwB;IAC7C,OAAO,CAAC,WAAW,CAAkE;IAErF;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAIzD;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAIhD;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;OAEG;IACH,cAAc,IAAI,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IAItE,cAAc,CAClB,IAAI,EAAE,kBAAkB,EACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,WAAW,EAAE,kBAAkB,GAC9B,OAAO,CAAC,YAAY,CAAC;CAwCzB"}
|