@winspan/claude-forge 1.80.0 → 1.84.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/README.md +2 -2
- package/dist/pipeline/artifact-collector.d.ts.map +1 -1
- package/dist/pipeline/artifact-collector.js +13 -4
- package/dist/pipeline/artifact-collector.js.map +1 -1
- 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 +131 -0
- package/dist/pipeline/completion-engine.js.map +1 -0
- package/dist/pipeline/dynamic-node-executor.d.ts +10 -14
- package/dist/pipeline/dynamic-node-executor.d.ts.map +1 -1
- package/dist/pipeline/dynamic-node-executor.js +36 -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 +2 -0
- package/dist/pipeline/node-type-registry.js.map +1 -1
- package/dist/web-static/assets/{index-B379ftX3.js → index-DMmR-2aM.js} +1 -1
- package/dist/web-static/index.html +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@ Claude Forge 是一个为 Claude Code 设计的智能编排引擎,通过透明
|
|
|
9
9
|
|
|
10
10
|
## ✨ 核心特性
|
|
11
11
|
|
|
12
|
-
- 🎯 **智能意图识别** -
|
|
12
|
+
- 🎯 **智能意图识别** - 自动分析任务复杂度,决定执行策略(三层架构:Ground Truth 规则 + 学习规则 + AI 降级层,支持上下文感知和活跃计划检测) [x] 2026-04-24
|
|
13
13
|
- 🔄 **Pipeline 编排** - 复杂任务自动拆分为多阶段流程(分析→设计→编码→测试→审查),支持纯事件溯源架构和状态机约束,确保状态一致性,daemon 启动时自动迁移历史数据,阶段产物统一输出到 docs/时间戳/ 目录,支持动态节点系统(Convention 定义节点类型,Skill 作为执行策略,NodeTypeRegistry 聚合节点类型,DynamicNodeExecutor 驱动执行,INodeExecutor 接口统一 PhaseManager 和 DynamicNodeExecutor,DynamicAggregator 支持动态节点事件聚合,启发式完成检测增强支持 file_patterns 和 keywords,Web API 支持动态流水线创建和手动推进),管理后台深度审查与修复完成(9个核心页面4750行代码,发现28个问题,修复13个P1/P2问题,新增质量问题上下文查询接口,优化事件展开性能和UX体验),节点类型管理页面和动态流水线节点展示组件已实现,NodeTypes 页面和 PipelineDetail 动态节点展示已集成,Legacy Pipeline 迁移脚本已完成,节点类型 API 路由已注册,动态节点系统全栈集成完成,全栈集成验证通过(NodeTypes页面正常展示节点类型,PipelineDetail页面正常展示动态节点,API路由正常响应),节点类型持久化到数据库(node_types表),启动时自动恢复到内存注册表,Convention加载时同步节点类型定义,流水线节点产物约束设计与实现完成(ArtifactType定义、ArtifactConstraint约束、ArtifactCollector收集器、ArtifactValidator验证器支持复杂度驱动约束、NodeOutput结构化输出、启发式完成检测集成产物验证、Web前端展示产物列表和验证状态),DynamicPipelineRepository 支持动态流水线和节点的完整 CRUD 操作,Web 管理后台集成动态流水线 API 路由和前端展示,产物约束验证支持复杂度驱动(simple/moderate/complex 动态调整约束严格度),git 操作强制归类为 simple 复杂度,Analyzer 集成 Convention 上下文到 pipeline-decompose 提示词,产物验证器支持复杂度驱动约束动态调整 [x] 2026-04-23
|
|
14
14
|
- 🛡️ **质量门禁** - 每个阶段自动 AI 审查,支持需求规格、安全性、代码质量、测试覆盖、性能等多维度检查,问题追踪和解决状态管理,支持上下文查询 [x] 2025-01-18
|
|
15
15
|
- 📊 **Web 管理后台** - 实时监控会话、Pipeline、质量问题(支持上下文查询和批量解决)、知识图谱、项目管理、自定义规范管理、技能管理、CLAUDE.md 管理(支持模块化查看和蒸馏压缩)、项目规范绑定管理、项目元数据管理(标签/备注/归档)、全局规范管理(同步/安装/删除/进化/YAML编辑/使用统计/进化历史)、阶段产物统一管理(docs/时间戳/目录结构+INDEX.md索引)、动态节点类型管理(NodeTypeRegistry 可视化)、TemplateRegistry 支持三种来源(builtin/user/convention)、动态流水线创建和手动推进操作、事件日志管理(查看/搜索/导出/清理)、数据库维护功能(备份/恢复/历史记录/诊断修复)、数据分析页面(会话统计、事件统计、API使用统计、成本分析、趋势图表),深度代码审查完成(9个核心页面28个问题,修复13个P1/P2问题,包括运行时错误、性能优化、竞态条件、UX改进),节点类型管理页面和动态流水线节点展示组件已实现,NodeTypes 页面和 PipelineDetail 动态节点展示已集成,Legacy Pipeline 数据迁移支持已完成,节点类型 API 路由已注册,动态节点系统全栈集成完成,全栈集成验证通过(NodeTypes页面正常展示节点类型,PipelineDetail页面正常展示动态节点,API路由正常响应),节点类型持久化和恢复机制已实现,DynamicPipelineNodes组件支持产物展示(artifacts列表、验证状态、类型图标、路径链接),知识图谱页面集成完成(搜索/概览/邻居/图谱可视化/CRUD操作),Analytics 页面支持会话统计、事件统计、API使用统计和成本分析,动态流水线 API 路由完整集成(创建/查询/更新/删除/手动推进) [x] 2026-04-23
|
|
@@ -24,7 +24,7 @@ Claude Forge 是一个为 Claude Code 设计的智能编排引擎,通过透明
|
|
|
24
24
|
|
|
25
25
|
| 功能 | 说明 |
|
|
26
26
|
|------|------|
|
|
27
|
-
| 意图识别 | 自动分析任务复杂度(simple/moderate/complex
|
|
27
|
+
| 意图识别 | 自动分析任务复杂度(simple/moderate/complex),决定执行策略,三层架构(Ground Truth 规则 + 学习规则 + AI 降级层),支持上下文感知和活跃计划检测 [x] 2026-04-24 |
|
|
28
28
|
| Pipeline 编排 | 复杂任务自动拆分为多阶段流程,支持纯事件溯源、状态机约束、质量门禁、阶段产物生成(统一输出到 docs/时间戳/ 目录+INDEX.md索引)、daemon 启动时自动迁移历史数据、动态节点系统(Convention 定义节点类型,NodeTypeRegistry 聚合,DynamicNodeExecutor 驱动,Skill 作为执行策略,INodeExecutor 接口统一,TemplateRegistry 支持三种来源,启发式完成检测增强,Web API 操作端点),管理后台深度审查与修复完成(修复运行时错误、性能问题、竞态条件、UX体验等13个P1/P2问题),节点类型管理页面和动态流水线节点展示组件已实现,NodeTypes 页面和 PipelineDetail 动态节点展示已集成,Legacy Pipeline 迁移脚本已完成,节点类型 API 路由已注册,动态节点系统全栈集成完成,全栈集成验证通过(NodeTypes页面正常展示节点类型,PipelineDetail页面正常展示动态节点,API路由正常响应),节点类型持久化到数据库(node_types表+NodeTypeRepository),启动时自动恢复到内存注册表,Convention加载时同步节点类型定义,流水线节点产物约束系统完成(ArtifactCollector追踪Write/Edit工具调用、ArtifactValidator验证产物约束支持复杂度驱动、NodeOutput结构化输出、DynamicPipelineNodes组件展示产物列表和验证状态),DynamicPipelineRepository 支持动态流水线和节点的完整 CRUD 操作,Web 管理后台动态流水线 API 路由完整注册,产物约束验证支持复杂度驱动(simple/moderate/complex 动态调整约束严格度),git 操作强制归类为 simple 复杂度,Analyzer 集成 Convention 上下文到 pipeline-decompose 提示词,产物验证器支持复杂度驱动约束动态调整 [x] 2026-04-23 |
|
|
29
29
|
| 质量门禁 | 每个阶段自动 AI 审查(需求规格、安全性、代码质量、测试、性能),不合格则阻止推进 [x] 2025-01-18 |
|
|
30
30
|
| 技能编排 | 根据意图自动匹配并注入最佳实践,支持关键词映射和命中率统计 [x] 2025-01-18 |
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact-collector.d.ts","sourceRoot":"","sources":["../../src/pipeline/artifact-collector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAgB,MAAM,wBAAwB,CAAC;AAKrE,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,SAAS,CAAsC;IAEvD;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"artifact-collector.d.ts","sourceRoot":"","sources":["../../src/pipeline/artifact-collector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAgB,MAAM,wBAAwB,CAAC;AAKrE,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,SAAS,CAAsC;IAEvD;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI;IAuD/C;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE;IAIzC;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI5B;;OAEG;IACH,QAAQ,IAAI,IAAI;IAIhB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAoC1B"}
|
|
@@ -20,8 +20,17 @@ export class ArtifactCollector {
|
|
|
20
20
|
if (!filePath || typeof filePath !== 'string') {
|
|
21
21
|
return;
|
|
22
22
|
}
|
|
23
|
+
// 将绝对路径转换为相对路径(相对于项目根目录),以便与 path_pattern 匹配
|
|
24
|
+
let normalizedPath = filePath;
|
|
25
|
+
if (event.project_path && path.isAbsolute(filePath)) {
|
|
26
|
+
const rel = path.relative(event.project_path, filePath);
|
|
27
|
+
// 只有在文件位于项目目录内时才使用相对路径
|
|
28
|
+
if (!rel.startsWith('..')) {
|
|
29
|
+
normalizedPath = rel;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
23
32
|
// 推断产物类型
|
|
24
|
-
const artifactType = this.inferArtifactType(
|
|
33
|
+
const artifactType = this.inferArtifactType(normalizedPath);
|
|
25
34
|
// 读取文件内容摘要(前 200 字符)
|
|
26
35
|
let contentPreview;
|
|
27
36
|
let sizeBytes;
|
|
@@ -37,18 +46,18 @@ export class ArtifactCollector {
|
|
|
37
46
|
}
|
|
38
47
|
const artifact = {
|
|
39
48
|
type: artifactType,
|
|
40
|
-
path:
|
|
49
|
+
path: normalizedPath,
|
|
41
50
|
created_at: new Date().toISOString(),
|
|
42
51
|
size_bytes: sizeBytes,
|
|
43
52
|
content_preview: contentPreview,
|
|
44
53
|
};
|
|
45
54
|
// 添加到产物列表(去重)
|
|
46
55
|
const existing = this.artifacts.get(nodeKey) || [];
|
|
47
|
-
const isDuplicate = existing.some(a => a.path ===
|
|
56
|
+
const isDuplicate = existing.some(a => a.path === normalizedPath);
|
|
48
57
|
if (!isDuplicate) {
|
|
49
58
|
existing.push(artifact);
|
|
50
59
|
this.artifacts.set(nodeKey, existing);
|
|
51
|
-
logger.debug(`[ArtifactCollector] 收集产物:${
|
|
60
|
+
logger.debug(`[ArtifactCollector] 收集产物:${normalizedPath} (${artifactType})`);
|
|
52
61
|
}
|
|
53
62
|
}
|
|
54
63
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact-collector.js","sourceRoot":"","sources":["../../src/pipeline/artifact-collector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,OAAO,iBAAiB;IACpB,SAAS,GAA4B,IAAI,GAAG,EAAE,CAAC;IAEvD;;OAEG;IACH,KAAK,CAAC,OAAe,EAAE,KAAiB;QACtC,sBAAsB;QACtB,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;YAC9D,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,EAAE,SAAS,CAAC;QAC7C,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,SAAS;QACT,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,
|
|
1
|
+
{"version":3,"file":"artifact-collector.js","sourceRoot":"","sources":["../../src/pipeline/artifact-collector.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;IA2GrB;;OAEG;IACH,OAAO,CAAC,cAAc;CASvB"}
|
|
@@ -0,0 +1,131 @@
|
|
|
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
|
+
let hasRequiredArtifacts = false;
|
|
49
|
+
let artifactValidationPassed = false;
|
|
50
|
+
if (nodeType.expected_artifacts) {
|
|
51
|
+
const requiredArtifacts = nodeType.expected_artifacts.filter(a => a.required !== false);
|
|
52
|
+
hasRequiredArtifacts = requiredArtifacts.length > 0 && complexity !== 'simple';
|
|
53
|
+
const validation = this.artifactValidator.validate(artifacts, nodeType.expected_artifacts, complexity);
|
|
54
|
+
artifactValidationPassed = validation.passed;
|
|
55
|
+
if (validation.passed) {
|
|
56
|
+
reasons.push('产物完整');
|
|
57
|
+
confidence += 30;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// 第二层:智能推断
|
|
61
|
+
if (this.detector.detectSemanticCompletion(event)) {
|
|
62
|
+
reasons.push('语义完成信号');
|
|
63
|
+
confidence += 20;
|
|
64
|
+
}
|
|
65
|
+
if (this.detector.detectVerificationPhase(recentEvents)) {
|
|
66
|
+
reasons.push('验证阶段模式');
|
|
67
|
+
confidence += 15;
|
|
68
|
+
}
|
|
69
|
+
// 第三层:强制保护
|
|
70
|
+
if (this.detector.checkAbsoluteTimeout(node, 30)) {
|
|
71
|
+
reasons.push('绝对超时(30 分钟)');
|
|
72
|
+
confidence = 100; // 强制完成
|
|
73
|
+
}
|
|
74
|
+
if (this.detector.checkStagnation(lastActivityAt, 5)) {
|
|
75
|
+
reasons.push('停滞超时(5 分钟无活动)');
|
|
76
|
+
confidence += 50;
|
|
77
|
+
}
|
|
78
|
+
if (this.detector.checkArtifactStagnation(lastArtifactAt, 5)) {
|
|
79
|
+
reasons.push('产物停滞(5 分钟无新产物)');
|
|
80
|
+
confidence += 30;
|
|
81
|
+
}
|
|
82
|
+
// 活动阈值
|
|
83
|
+
const threshold = nodeType.activity_threshold.min_tool_calls;
|
|
84
|
+
if (eventCount >= threshold) {
|
|
85
|
+
reasons.push(`活动阈值(${eventCount}/${threshold})`);
|
|
86
|
+
confidence += 40;
|
|
87
|
+
}
|
|
88
|
+
// 产物门禁:有必需产物但验证失败时,阻断软信号推进
|
|
89
|
+
// 只允许显式信号(FORGE_NODE_DONE)或绝对超时(30 分钟)推进
|
|
90
|
+
if (hasRequiredArtifacts && !artifactValidationPassed) {
|
|
91
|
+
const hasExplicitSignal = reasons.includes('显式信号');
|
|
92
|
+
const hasAbsoluteTimeout = reasons.includes('绝对超时(30 分钟)');
|
|
93
|
+
if (!hasExplicitSignal && !hasAbsoluteTimeout) {
|
|
94
|
+
logger.debug(`[CompletionEngine] 🔒 产物门禁:必需产物未生成,阻断推进(当前置信度 ${confidence}%)`);
|
|
95
|
+
return {
|
|
96
|
+
shouldAdvance: false,
|
|
97
|
+
confidence: Math.min(confidence, 59),
|
|
98
|
+
reasons: [...reasons, '产物门禁(必需产物未生成)'],
|
|
99
|
+
method: 'precise',
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// 决策:confidence >= 60 即推进
|
|
104
|
+
const shouldAdvance = confidence >= 60;
|
|
105
|
+
if (shouldAdvance) {
|
|
106
|
+
logger.info(`[CompletionEngine] ✅ 决策推进(置信度 ${confidence}%):${reasons.join('、')}`);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
logger.debug(`[CompletionEngine] ⏸️ 决策不推进(置信度 ${confidence}%):${reasons.join('、')}`);
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
shouldAdvance,
|
|
113
|
+
confidence,
|
|
114
|
+
reasons,
|
|
115
|
+
method: this.classifyMethod(reasons),
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* 分类决策方法
|
|
120
|
+
*/
|
|
121
|
+
classifyMethod(reasons) {
|
|
122
|
+
if (reasons.some(r => r.includes('显式信号') || r.includes('产物完整'))) {
|
|
123
|
+
return 'precise';
|
|
124
|
+
}
|
|
125
|
+
if (reasons.some(r => r.includes('超时') || r.includes('阈值'))) {
|
|
126
|
+
return 'forced';
|
|
127
|
+
}
|
|
128
|
+
return 'inferred';
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
//# 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,26 +63,14 @@ 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
|
|
68
|
+
* @param completingNodeId 即将完成的节点 ID(视为已完成,用于依赖检查)
|
|
74
69
|
*/
|
|
75
70
|
private getNextNodeId;
|
|
76
71
|
/**
|
|
77
72
|
* 检查节点依赖是否满足
|
|
73
|
+
* @param completingNodeId 即将完成的节点 ID,依赖检查时视为已完成
|
|
78
74
|
*/
|
|
79
75
|
private areDependenciesMet;
|
|
80
76
|
}
|
|
@@ -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;;;OAGG;IACH,OAAO,CAAC,aAAa;IAkBrB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;CAW3B"}
|