@winspan/claude-forge 1.79.0 → 1.81.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/pipeline/completion-detector.d.ts +57 -0
- package/dist/pipeline/completion-detector.d.ts.map +1 -0
- package/dist/pipeline/completion-detector.js +179 -0
- package/dist/pipeline/completion-detector.js.map +1 -0
- package/dist/pipeline/completion-engine.d.ts +37 -0
- package/dist/pipeline/completion-engine.d.ts.map +1 -0
- package/dist/pipeline/completion-engine.js +111 -0
- package/dist/pipeline/completion-engine.js.map +1 -0
- package/dist/pipeline/dynamic-node-executor.d.ts +8 -14
- package/dist/pipeline/dynamic-node-executor.d.ts.map +1 -1
- package/dist/pipeline/dynamic-node-executor.js +48 -96
- package/dist/pipeline/dynamic-node-executor.js.map +1 -1
- package/dist/pipeline/node-type-registry.d.ts.map +1 -1
- package/dist/pipeline/node-type-registry.js +12 -11
- package/dist/pipeline/node-type-registry.js.map +1 -1
- package/dist/pipeline/node-type-sync.js +7 -7
- package/dist/pipeline/node-type-sync.js.map +1 -1
- package/dist/web-static/assets/{index-CQLtn5OC.js → index-BbPsfjnl.js} +1 -1
- package/dist/web-static/index.html +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CompletionDetector — 节点完成检测器
|
|
3
|
+
*
|
|
4
|
+
* 实现三层检测机制:
|
|
5
|
+
* 1. 精准检测:显式信号、关键词、文件模式
|
|
6
|
+
* 2. 智能推断:语义分析、行为模式识别
|
|
7
|
+
* 3. 强制保护:超时检测、停滞检测
|
|
8
|
+
*/
|
|
9
|
+
import type { ForgeEvent } from '../types/index.js';
|
|
10
|
+
import type { DynamicNode } from './dynamic-node-types.js';
|
|
11
|
+
export declare class CompletionDetector {
|
|
12
|
+
/**
|
|
13
|
+
* 第一层:精准检测 - 显式信号
|
|
14
|
+
* 检查 user_prompt 和 Bash 工具输出中的完成信号
|
|
15
|
+
*/
|
|
16
|
+
detectExplicitSignal(event: ForgeEvent, signal: string): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* 第一层:精准检测 - 关键词匹配
|
|
19
|
+
* 扩展检测范围:user_prompt + tool_input + tool_output
|
|
20
|
+
*/
|
|
21
|
+
detectKeywords(event: ForgeEvent, keywords: string[]): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* 第一层:精准检测 - 文件模式匹配
|
|
24
|
+
* 支持 Write/Edit 和 Bash 创建的文件
|
|
25
|
+
*/
|
|
26
|
+
detectFilePatterns(event: ForgeEvent, patterns: string[]): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* 第二层:智能推断 - 语义完成检测
|
|
29
|
+
* 检测用户输入中的完成语义
|
|
30
|
+
*/
|
|
31
|
+
detectSemanticCompletion(event: ForgeEvent): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* 第二层:智能推断 - 验证阶段模式
|
|
34
|
+
* 连续 Read 且无 Write/Edit = 可能在验证
|
|
35
|
+
*/
|
|
36
|
+
detectVerificationPhase(recentEvents: ForgeEvent[]): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* 第三层:强制保护 - 绝对超时
|
|
39
|
+
* 节点运行超过最大时间限制
|
|
40
|
+
*/
|
|
41
|
+
checkAbsoluteTimeout(node: DynamicNode, maxMinutes?: number): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* 第三层:强制保护 - 停滞检测
|
|
44
|
+
* 节点长时间无工具调用活动
|
|
45
|
+
*/
|
|
46
|
+
checkStagnation(lastActivityAt: number | undefined, maxMinutes?: number): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* 第三层:强制保护 - 产物停滞检测
|
|
49
|
+
* 节点长时间无新产物生成
|
|
50
|
+
*/
|
|
51
|
+
checkArtifactStagnation(lastArtifactAt: number | undefined, maxMinutes?: number): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Glob 模式匹配(支持 * 和 ** 通配符)
|
|
54
|
+
*/
|
|
55
|
+
private matchGlob;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=completion-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion-detector.d.ts","sourceRoot":"","sources":["../../src/pipeline/completion-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG3D,qBAAa,kBAAkB;IAC7B;;;OAGG;IACH,oBAAoB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAsBhE;;;OAGG;IACH,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO;IAgB9D;;;OAGG;IACH,kBAAkB,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO;IAgClE;;;OAGG;IACH,wBAAwB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO;IAkBpD;;;OAGG;IACH,uBAAuB,CAAC,YAAY,EAAE,UAAU,EAAE,GAAG,OAAO;IAgB5D;;;OAGG;IACH,oBAAoB,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,GAAE,MAAW,GAAG,OAAO;IAezE;;;OAGG;IACH,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,EAAE,UAAU,GAAE,MAAU,GAAG,OAAO;IAcpF;;;OAGG;IACH,uBAAuB,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,EAAE,UAAU,GAAE,MAAU,GAAG,OAAO;IAc5F;;OAEG;IACH,OAAO,CAAC,SAAS;CAWlB"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CompletionDetector — 节点完成检测器
|
|
3
|
+
*
|
|
4
|
+
* 实现三层检测机制:
|
|
5
|
+
* 1. 精准检测:显式信号、关键词、文件模式
|
|
6
|
+
* 2. 智能推断:语义分析、行为模式识别
|
|
7
|
+
* 3. 强制保护:超时检测、停滞检测
|
|
8
|
+
*/
|
|
9
|
+
import { logger } from '../utils/logger.js';
|
|
10
|
+
export class CompletionDetector {
|
|
11
|
+
/**
|
|
12
|
+
* 第一层:精准检测 - 显式信号
|
|
13
|
+
* 检查 user_prompt 和 Bash 工具输出中的完成信号
|
|
14
|
+
*/
|
|
15
|
+
detectExplicitSignal(event, signal) {
|
|
16
|
+
const signalLower = signal.toLowerCase();
|
|
17
|
+
// 检查 user_prompt(新增)
|
|
18
|
+
const userPrompt = (event.user_prompt || '').toLowerCase();
|
|
19
|
+
if (userPrompt.includes(signalLower)) {
|
|
20
|
+
logger.info(`[CompletionDetector] 🔔 检测到 user_prompt 中的完成信号:${signal}`);
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
// 检查 Bash 输出(AI 通过 echo 发出信号时)
|
|
24
|
+
if (event.tool_name === 'Bash') {
|
|
25
|
+
const toolOutput = JSON.stringify(event.tool_output || '').toLowerCase();
|
|
26
|
+
if (toolOutput.includes(signalLower)) {
|
|
27
|
+
logger.info(`[CompletionDetector] 🔔 检测到 Bash 输出中的完成信号:${signal}`);
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 第一层:精准检测 - 关键词匹配
|
|
35
|
+
* 扩展检测范围:user_prompt + tool_input + tool_output
|
|
36
|
+
*/
|
|
37
|
+
detectKeywords(event, keywords) {
|
|
38
|
+
const searchText = [
|
|
39
|
+
event.user_prompt || '', // 新增:检查用户输入
|
|
40
|
+
JSON.stringify(event.tool_output || {}),
|
|
41
|
+
JSON.stringify(event.tool_input || {}),
|
|
42
|
+
].join(' ').toLowerCase();
|
|
43
|
+
const matched = keywords.find(kw => searchText.includes(kw.toLowerCase()));
|
|
44
|
+
if (matched) {
|
|
45
|
+
logger.info(`[CompletionDetector] 🔑 检测到关键词匹配:${matched}`);
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 第一层:精准检测 - 文件模式匹配
|
|
52
|
+
* 支持 Write/Edit 和 Bash 创建的文件
|
|
53
|
+
*/
|
|
54
|
+
detectFilePatterns(event, patterns) {
|
|
55
|
+
// 支持 Write/Edit
|
|
56
|
+
if (event.tool_name === 'Write' || event.tool_name === 'Edit') {
|
|
57
|
+
const filePath = event.tool_input?.file_path;
|
|
58
|
+
if (filePath && typeof filePath === 'string') {
|
|
59
|
+
const matched = patterns.some(p => this.matchGlob(filePath, p));
|
|
60
|
+
if (matched) {
|
|
61
|
+
logger.info(`[CompletionDetector] 📁 检测到文件模式匹配(Write/Edit):${filePath}`);
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// 支持 Bash 创建的文件(新增)
|
|
67
|
+
if (event.tool_name === 'Bash') {
|
|
68
|
+
const output = JSON.stringify(event.tool_output || '');
|
|
69
|
+
// 解析 Bash 输出中的文件路径(如 "Created file: src/test.ts")
|
|
70
|
+
const fileMatches = output.match(/(?:created|wrote|generated|saved|writing)\s+(?:file:?\s+)?([^\s]+\.\w+)/gi);
|
|
71
|
+
if (fileMatches) {
|
|
72
|
+
for (const match of fileMatches) {
|
|
73
|
+
const filePath = match.split(/\s+/).pop();
|
|
74
|
+
if (filePath && patterns.some(p => this.matchGlob(filePath, p))) {
|
|
75
|
+
logger.info(`[CompletionDetector] 📁 检测到文件模式匹配(Bash):${filePath}`);
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* 第二层:智能推断 - 语义完成检测
|
|
85
|
+
* 检测用户输入中的完成语义
|
|
86
|
+
*/
|
|
87
|
+
detectSemanticCompletion(event) {
|
|
88
|
+
const completionPhrases = [
|
|
89
|
+
'完成了', '好了', '搞定', '做完了', '已完成', '完工',
|
|
90
|
+
'done', 'finished', 'completed', 'ready',
|
|
91
|
+
'可以了', '没问题了', 'all set', 'good to go',
|
|
92
|
+
'结束了', 'over', 'end',
|
|
93
|
+
];
|
|
94
|
+
const text = (event.user_prompt || '').toLowerCase();
|
|
95
|
+
const matched = completionPhrases.find(phrase => text.includes(phrase));
|
|
96
|
+
if (matched) {
|
|
97
|
+
logger.info(`[CompletionDetector] 💬 检测到语义完成信号:${matched}`);
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 第二层:智能推断 - 验证阶段模式
|
|
104
|
+
* 连续 Read 且无 Write/Edit = 可能在验证
|
|
105
|
+
*/
|
|
106
|
+
detectVerificationPhase(recentEvents) {
|
|
107
|
+
if (recentEvents.length < 3)
|
|
108
|
+
return false;
|
|
109
|
+
const last3 = recentEvents.slice(-3);
|
|
110
|
+
const allReads = last3.every(e => e.tool_name === 'Read');
|
|
111
|
+
const last10 = recentEvents.slice(-10);
|
|
112
|
+
const noWrites = !last10.some(e => e.tool_name === 'Write' || e.tool_name === 'Edit');
|
|
113
|
+
if (allReads && noWrites) {
|
|
114
|
+
logger.info(`[CompletionDetector] 🔍 检测到验证阶段模式(连续 Read 无 Write)`);
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* 第三层:强制保护 - 绝对超时
|
|
121
|
+
* 节点运行超过最大时间限制
|
|
122
|
+
*/
|
|
123
|
+
checkAbsoluteTimeout(node, maxMinutes = 30) {
|
|
124
|
+
if (!node.startedAt)
|
|
125
|
+
return false;
|
|
126
|
+
const startTime = new Date(node.startedAt).getTime();
|
|
127
|
+
const elapsed = Date.now() - startTime;
|
|
128
|
+
const isTimeout = elapsed > maxMinutes * 60 * 1000;
|
|
129
|
+
if (isTimeout) {
|
|
130
|
+
const elapsedMin = Math.floor(elapsed / 60000);
|
|
131
|
+
logger.warn(`[CompletionDetector] ⏰ 节点绝对超时(${elapsedMin}/${maxMinutes} 分钟)`);
|
|
132
|
+
}
|
|
133
|
+
return isTimeout;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* 第三层:强制保护 - 停滞检测
|
|
137
|
+
* 节点长时间无工具调用活动
|
|
138
|
+
*/
|
|
139
|
+
checkStagnation(lastActivityAt, maxMinutes = 5) {
|
|
140
|
+
if (!lastActivityAt)
|
|
141
|
+
return false;
|
|
142
|
+
const elapsed = Date.now() - lastActivityAt;
|
|
143
|
+
const isStagnant = elapsed > maxMinutes * 60 * 1000;
|
|
144
|
+
if (isStagnant) {
|
|
145
|
+
const elapsedMin = Math.floor(elapsed / 60000);
|
|
146
|
+
logger.warn(`[CompletionDetector] 💤 节点停滞(${elapsedMin}/${maxMinutes} 分钟无活动)`);
|
|
147
|
+
}
|
|
148
|
+
return isStagnant;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* 第三层:强制保护 - 产物停滞检测
|
|
152
|
+
* 节点长时间无新产物生成
|
|
153
|
+
*/
|
|
154
|
+
checkArtifactStagnation(lastArtifactAt, maxMinutes = 5) {
|
|
155
|
+
if (!lastArtifactAt)
|
|
156
|
+
return false;
|
|
157
|
+
const elapsed = Date.now() - lastArtifactAt;
|
|
158
|
+
const isStagnant = elapsed > maxMinutes * 60 * 1000;
|
|
159
|
+
if (isStagnant) {
|
|
160
|
+
const elapsedMin = Math.floor(elapsed / 60000);
|
|
161
|
+
logger.warn(`[CompletionDetector] 📦 产物停滞(${elapsedMin}/${maxMinutes} 分钟无新产物)`);
|
|
162
|
+
}
|
|
163
|
+
return isStagnant;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Glob 模式匹配(支持 * 和 ** 通配符)
|
|
167
|
+
*/
|
|
168
|
+
matchGlob(filePath, pattern) {
|
|
169
|
+
// 转义特殊字符
|
|
170
|
+
let regex = pattern
|
|
171
|
+
.replace(/[.+?^${}()|[\]\\]/g, '\\$&')
|
|
172
|
+
// ** 匹配任意路径
|
|
173
|
+
.replace(/\*\*/g, '.*')
|
|
174
|
+
// * 匹配单层路径
|
|
175
|
+
.replace(/\*/g, '[^/]*');
|
|
176
|
+
return new RegExp('^' + regex + '$').test(filePath);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=completion-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion-detector.js","sourceRoot":"","sources":["../../src/pipeline/completion-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CompletionEngine — 节点完成综合决策引擎
|
|
3
|
+
*
|
|
4
|
+
* 聚合所有检测层的结果,基于置信度综合决策是否推进节点。
|
|
5
|
+
*/
|
|
6
|
+
import type { ForgeEvent } from '../types/index.js';
|
|
7
|
+
import type { DynamicNode } from './dynamic-node-types.js';
|
|
8
|
+
import type { ConventionNodeType, Artifact } from '../convention/types.js';
|
|
9
|
+
export interface CompletionDecision {
|
|
10
|
+
shouldAdvance: boolean;
|
|
11
|
+
confidence: number;
|
|
12
|
+
reasons: string[];
|
|
13
|
+
method: 'precise' | 'inferred' | 'forced';
|
|
14
|
+
}
|
|
15
|
+
export declare class CompletionEngine {
|
|
16
|
+
private detector;
|
|
17
|
+
private artifactValidator;
|
|
18
|
+
/**
|
|
19
|
+
* 综合决策:是否推进节点
|
|
20
|
+
*
|
|
21
|
+
* @param node - 当前节点
|
|
22
|
+
* @param nodeType - 节点类型定义
|
|
23
|
+
* @param event - 当前事件
|
|
24
|
+
* @param recentEvents - 最近的事件列表(用于模式识别)
|
|
25
|
+
* @param artifacts - 已收集的产物
|
|
26
|
+
* @param eventCount - 工具调用次数
|
|
27
|
+
* @param lastActivityAt - 最后活动时间戳
|
|
28
|
+
* @param lastArtifactAt - 最后产物生成时间戳
|
|
29
|
+
* @param complexity - Pipeline 复杂度
|
|
30
|
+
*/
|
|
31
|
+
decide(node: DynamicNode, nodeType: ConventionNodeType, event: ForgeEvent, recentEvents: ForgeEvent[], artifacts: Artifact[], eventCount: number, lastActivityAt: number | undefined, lastArtifactAt: number | undefined, complexity?: 'simple' | 'moderate' | 'complex'): CompletionDecision;
|
|
32
|
+
/**
|
|
33
|
+
* 分类决策方法
|
|
34
|
+
*/
|
|
35
|
+
private classifyMethod;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=completion-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion-engine.d.ts","sourceRoot":"","sources":["../../src/pipeline/completion-engine.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAK3E,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;CAC3C;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,iBAAiB,CAA2B;IAEpD;;;;;;;;;;;;OAYG;IACH,MAAM,CACJ,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,kBAAkB,EAC5B,KAAK,EAAE,UAAU,EACjB,YAAY,EAAE,UAAU,EAAE,EAC1B,SAAS,EAAE,QAAQ,EAAE,EACrB,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,UAAU,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,GAC7C,kBAAkB;IAsFrB;;OAEG;IACH,OAAO,CAAC,cAAc;CASvB"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CompletionEngine — 节点完成综合决策引擎
|
|
3
|
+
*
|
|
4
|
+
* 聚合所有检测层的结果,基于置信度综合决策是否推进节点。
|
|
5
|
+
*/
|
|
6
|
+
import { CompletionDetector } from './completion-detector.js';
|
|
7
|
+
import { ArtifactValidator } from './artifact-validator.js';
|
|
8
|
+
import { logger } from '../utils/logger.js';
|
|
9
|
+
export class CompletionEngine {
|
|
10
|
+
detector = new CompletionDetector();
|
|
11
|
+
artifactValidator = new ArtifactValidator();
|
|
12
|
+
/**
|
|
13
|
+
* 综合决策:是否推进节点
|
|
14
|
+
*
|
|
15
|
+
* @param node - 当前节点
|
|
16
|
+
* @param nodeType - 节点类型定义
|
|
17
|
+
* @param event - 当前事件
|
|
18
|
+
* @param recentEvents - 最近的事件列表(用于模式识别)
|
|
19
|
+
* @param artifacts - 已收集的产物
|
|
20
|
+
* @param eventCount - 工具调用次数
|
|
21
|
+
* @param lastActivityAt - 最后活动时间戳
|
|
22
|
+
* @param lastArtifactAt - 最后产物生成时间戳
|
|
23
|
+
* @param complexity - Pipeline 复杂度
|
|
24
|
+
*/
|
|
25
|
+
decide(node, nodeType, event, recentEvents, artifacts, eventCount, lastActivityAt, lastArtifactAt, complexity) {
|
|
26
|
+
const reasons = [];
|
|
27
|
+
let confidence = 0; // 0-100
|
|
28
|
+
// 第一层:精准检测
|
|
29
|
+
if (nodeType.completion.explicit_signal) {
|
|
30
|
+
if (this.detector.detectExplicitSignal(event, nodeType.completion.explicit_signal)) {
|
|
31
|
+
reasons.push('显式信号');
|
|
32
|
+
confidence += 40;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (nodeType.completion.heuristic?.keywords) {
|
|
36
|
+
if (this.detector.detectKeywords(event, nodeType.completion.heuristic.keywords)) {
|
|
37
|
+
reasons.push('关键词匹配');
|
|
38
|
+
confidence += 30;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (nodeType.completion.heuristic?.file_patterns) {
|
|
42
|
+
if (this.detector.detectFilePatterns(event, nodeType.completion.heuristic.file_patterns)) {
|
|
43
|
+
reasons.push('文件模式匹配');
|
|
44
|
+
confidence += 25;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// 产物完整性
|
|
48
|
+
if (nodeType.expected_artifacts) {
|
|
49
|
+
const validation = this.artifactValidator.validate(artifacts, nodeType.expected_artifacts, complexity);
|
|
50
|
+
if (validation.passed) {
|
|
51
|
+
reasons.push('产物完整');
|
|
52
|
+
confidence += 30;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// 第二层:智能推断
|
|
56
|
+
if (this.detector.detectSemanticCompletion(event)) {
|
|
57
|
+
reasons.push('语义完成信号');
|
|
58
|
+
confidence += 20;
|
|
59
|
+
}
|
|
60
|
+
if (this.detector.detectVerificationPhase(recentEvents)) {
|
|
61
|
+
reasons.push('验证阶段模式');
|
|
62
|
+
confidence += 15;
|
|
63
|
+
}
|
|
64
|
+
// 第三层:强制保护
|
|
65
|
+
if (this.detector.checkAbsoluteTimeout(node, 30)) {
|
|
66
|
+
reasons.push('绝对超时(30 分钟)');
|
|
67
|
+
confidence = 100; // 强制完成
|
|
68
|
+
}
|
|
69
|
+
if (this.detector.checkStagnation(lastActivityAt, 5)) {
|
|
70
|
+
reasons.push('停滞超时(5 分钟无活动)');
|
|
71
|
+
confidence += 50;
|
|
72
|
+
}
|
|
73
|
+
if (this.detector.checkArtifactStagnation(lastArtifactAt, 5)) {
|
|
74
|
+
reasons.push('产物停滞(5 分钟无新产物)');
|
|
75
|
+
confidence += 30;
|
|
76
|
+
}
|
|
77
|
+
// 活动阈值
|
|
78
|
+
const threshold = nodeType.activity_threshold.min_tool_calls;
|
|
79
|
+
if (eventCount >= threshold) {
|
|
80
|
+
reasons.push(`活动阈值(${eventCount}/${threshold})`);
|
|
81
|
+
confidence += 40;
|
|
82
|
+
}
|
|
83
|
+
// 决策:confidence >= 60 即推进
|
|
84
|
+
const shouldAdvance = confidence >= 60;
|
|
85
|
+
if (shouldAdvance) {
|
|
86
|
+
logger.info(`[CompletionEngine] ✅ 决策推进(置信度 ${confidence}%):${reasons.join('、')}`);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
logger.debug(`[CompletionEngine] ⏸️ 决策不推进(置信度 ${confidence}%):${reasons.join('、')}`);
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
shouldAdvance,
|
|
93
|
+
confidence,
|
|
94
|
+
reasons,
|
|
95
|
+
method: this.classifyMethod(reasons),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* 分类决策方法
|
|
100
|
+
*/
|
|
101
|
+
classifyMethod(reasons) {
|
|
102
|
+
if (reasons.some(r => r.includes('显式信号') || r.includes('产物完整'))) {
|
|
103
|
+
return 'precise';
|
|
104
|
+
}
|
|
105
|
+
if (reasons.some(r => r.includes('超时') || r.includes('阈值'))) {
|
|
106
|
+
return 'forced';
|
|
107
|
+
}
|
|
108
|
+
return 'inferred';
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=completion-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion-engine.js","sourceRoot":"","sources":["../../src/pipeline/completion-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,9 +20,17 @@ export declare class DynamicNodeExecutor implements INodeExecutor {
|
|
|
20
20
|
private recentTools;
|
|
21
21
|
/** 产物重试次数(key = pipelineId:nodeId) */
|
|
22
22
|
private artifactRetryCount;
|
|
23
|
+
/** 最后活动时间戳(key = pipelineId:nodeId) */
|
|
24
|
+
private lastActivityAt;
|
|
25
|
+
/** 最后产物生成时间戳(key = pipelineId:nodeId) */
|
|
26
|
+
private lastArtifactAt;
|
|
27
|
+
/** 最近事件列表(key = pipelineId:nodeId,保留最近 10 条) */
|
|
28
|
+
private recentEvents;
|
|
23
29
|
private static readonly MAX_ARTIFACT_RETRIES;
|
|
30
|
+
private static readonly MAX_RECENT_EVENTS;
|
|
24
31
|
private artifactCollector;
|
|
25
32
|
private artifactValidator;
|
|
33
|
+
private completionEngine;
|
|
26
34
|
/**
|
|
27
35
|
* 获取当前节点的指令
|
|
28
36
|
*/
|
|
@@ -55,20 +63,6 @@ export declare class DynamicNodeExecutor implements INodeExecutor {
|
|
|
55
63
|
* 追踪工具调用
|
|
56
64
|
*/
|
|
57
65
|
private trackToolCall;
|
|
58
|
-
/**
|
|
59
|
-
* 检查节点完成条件
|
|
60
|
-
*/
|
|
61
|
-
private checkCompletion;
|
|
62
|
-
/**
|
|
63
|
-
* 检查文件模式匹配
|
|
64
|
-
* 从 Write/Edit 工具调用中提取文件路径,检查是否匹配 file_patterns
|
|
65
|
-
*/
|
|
66
|
-
private checkFilePatterns;
|
|
67
|
-
/**
|
|
68
|
-
* 检查关键词匹配
|
|
69
|
-
* 只检查工具调用的输入/输出内容,不检查 user_prompt(避免因用户提问包含关键词而误判完成)
|
|
70
|
-
*/
|
|
71
|
-
private checkKeywords;
|
|
72
66
|
/**
|
|
73
67
|
* 获取下一个节点 ID
|
|
74
68
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic-node-executor.d.ts","sourceRoot":"","sources":["../../src/pipeline/dynamic-node-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAe,MAAM,yBAAyB,CAAC;AAC5E,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC5F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"dynamic-node-executor.d.ts","sourceRoot":"","sources":["../../src/pipeline/dynamic-node-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAe,MAAM,yBAAyB,CAAC;AAC5E,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC5F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAU/D,qBAAa,mBAAoB,YAAW,aAAa;IACvD,OAAO,CAAC,aAAa,CAAoH;IACzI,OAAO,CAAC,eAAe,CAAsH;IAC7I,OAAO,CAAC,eAAe,CAAsH;IAC7I,OAAO,CAAC,mBAAmB,CAA0H;IACrJ,OAAO,CAAC,WAAW,CAAwH;IAC3I,sCAAsC;IACtC,OAAO,CAAC,kBAAkB,CAAwH;IAClJ,uCAAuC;IACvC,OAAO,CAAC,cAAc,CAAuH;IAC7I,yCAAyC;IACzC,OAAO,CAAC,cAAc,CAAuH;IAC7I,gDAAgD;IAChD,OAAO,CAAC,YAAY,CAA6H;IACjJ,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAK;IACjD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAM;IAE/C,OAAO,CAAC,iBAAiB,CAA2B;IACpD,OAAO,CAAC,iBAAiB,CAA2B;IACpD,OAAO,CAAC,gBAAgB,CAA0B;IAElD;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM;IAmCjD;;OAEG;IACG,eAAe,CACnB,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE,UAAU,EACjB,WAAW,CAAC,EAAE,iBAAiB,GAC9B,OAAO,CAAC,aAAa,CAAC;IAyFzB;;OAEG;IACH,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAgBjC;;OAEG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAQ1C;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAkBzD;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB;IAW3C;;OAEG;IACH,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,EAAE;IAoBvD;;OAEG;IACH,OAAO,CAAC,aAAa;IAoCrB;;OAEG;IACH,OAAO,CAAC,aAAa;IAiBrB;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAU3B"}
|