evo-skills 0.1.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/.eslintrc.json +36 -0
- package/.prettierrc +11 -0
- package/README.md +227 -0
- package/USER-GUIDE.md +382 -0
- package/dist/cli/commands/diff.d.ts +7 -0
- package/dist/cli/commands/diff.d.ts.map +1 -0
- package/dist/cli/commands/diff.js +126 -0
- package/dist/cli/commands/diff.js.map +1 -0
- package/dist/cli/commands/freeze.d.ts +12 -0
- package/dist/cli/commands/freeze.d.ts.map +1 -0
- package/dist/cli/commands/freeze.js +93 -0
- package/dist/cli/commands/freeze.js.map +1 -0
- package/dist/cli/commands/log.d.ts +7 -0
- package/dist/cli/commands/log.d.ts.map +1 -0
- package/dist/cli/commands/log.js +76 -0
- package/dist/cli/commands/log.js.map +1 -0
- package/dist/cli/commands/rollback.d.ts +7 -0
- package/dist/cli/commands/rollback.d.ts.map +1 -0
- package/dist/cli/commands/rollback.js +92 -0
- package/dist/cli/commands/rollback.js.map +1 -0
- package/dist/cli/commands/status.d.ts +7 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +88 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +25 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/defaults.d.ts +6 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +31 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +68 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +195 -0
- package/dist/config/index.js.map +1 -0
- package/dist/core/evaluator/base-rule.d.ts +50 -0
- package/dist/core/evaluator/base-rule.d.ts.map +1 -0
- package/dist/core/evaluator/base-rule.js +69 -0
- package/dist/core/evaluator/base-rule.js.map +1 -0
- package/dist/core/evaluator/index.d.ts +33 -0
- package/dist/core/evaluator/index.d.ts.map +1 -0
- package/dist/core/evaluator/index.js +74 -0
- package/dist/core/evaluator/index.js.map +1 -0
- package/dist/core/evaluator/rules/repeated-drift.d.ts +19 -0
- package/dist/core/evaluator/rules/repeated-drift.d.ts.map +1 -0
- package/dist/core/evaluator/rules/repeated-drift.js +82 -0
- package/dist/core/evaluator/rules/repeated-drift.js.map +1 -0
- package/dist/core/evaluator/rules/repeated-manual-fix.d.ts +23 -0
- package/dist/core/evaluator/rules/repeated-manual-fix.d.ts.map +1 -0
- package/dist/core/evaluator/rules/repeated-manual-fix.js +97 -0
- package/dist/core/evaluator/rules/repeated-manual-fix.js.map +1 -0
- package/dist/core/journal/index.d.ts +76 -0
- package/dist/core/journal/index.d.ts.map +1 -0
- package/dist/core/journal/index.js +207 -0
- package/dist/core/journal/index.js.map +1 -0
- package/dist/core/observer/base-observer.d.ts +64 -0
- package/dist/core/observer/base-observer.d.ts.map +1 -0
- package/dist/core/observer/base-observer.js +142 -0
- package/dist/core/observer/base-observer.js.map +1 -0
- package/dist/core/observer/codex-observer.d.ts +71 -0
- package/dist/core/observer/codex-observer.d.ts.map +1 -0
- package/dist/core/observer/codex-observer.js +248 -0
- package/dist/core/observer/codex-observer.js.map +1 -0
- package/dist/core/observer/index.d.ts +7 -0
- package/dist/core/observer/index.d.ts.map +1 -0
- package/dist/core/observer/index.js +7 -0
- package/dist/core/observer/index.js.map +1 -0
- package/dist/core/observer/trace-manager.d.ts +82 -0
- package/dist/core/observer/trace-manager.d.ts.map +1 -0
- package/dist/core/observer/trace-manager.js +196 -0
- package/dist/core/observer/trace-manager.js.map +1 -0
- package/dist/core/origin-registry/index.d.ts +59 -0
- package/dist/core/origin-registry/index.d.ts.map +1 -0
- package/dist/core/origin-registry/index.js +235 -0
- package/dist/core/origin-registry/index.js.map +1 -0
- package/dist/core/patch-generator/base-strategy.d.ts +35 -0
- package/dist/core/patch-generator/base-strategy.d.ts.map +1 -0
- package/dist/core/patch-generator/base-strategy.js +55 -0
- package/dist/core/patch-generator/base-strategy.js.map +1 -0
- package/dist/core/patch-generator/index.d.ts +32 -0
- package/dist/core/patch-generator/index.d.ts.map +1 -0
- package/dist/core/patch-generator/index.js +101 -0
- package/dist/core/patch-generator/index.js.map +1 -0
- package/dist/core/patch-generator/strategies/add-fallback.d.ts +11 -0
- package/dist/core/patch-generator/strategies/add-fallback.d.ts.map +1 -0
- package/dist/core/patch-generator/strategies/add-fallback.js +57 -0
- package/dist/core/patch-generator/strategies/add-fallback.js.map +1 -0
- package/dist/core/patch-generator/strategies/prune-noise.d.ts +11 -0
- package/dist/core/patch-generator/strategies/prune-noise.d.ts.map +1 -0
- package/dist/core/patch-generator/strategies/prune-noise.js +48 -0
- package/dist/core/patch-generator/strategies/prune-noise.js.map +1 -0
- package/dist/core/shadow-manager/index.d.ts +65 -0
- package/dist/core/shadow-manager/index.d.ts.map +1 -0
- package/dist/core/shadow-manager/index.js +229 -0
- package/dist/core/shadow-manager/index.js.map +1 -0
- package/dist/core/shadow-registry/index.d.ts +68 -0
- package/dist/core/shadow-registry/index.d.ts.map +1 -0
- package/dist/core/shadow-registry/index.js +173 -0
- package/dist/core/shadow-registry/index.js.map +1 -0
- package/dist/daemon/index.d.ts +43 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +144 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/storage/index.d.ts +7 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +7 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/markdown.d.ts +66 -0
- package/dist/storage/markdown.d.ts.map +1 -0
- package/dist/storage/markdown.js +227 -0
- package/dist/storage/markdown.js.map +1 -0
- package/dist/storage/ndjson.d.ts +118 -0
- package/dist/storage/ndjson.d.ts.map +1 -0
- package/dist/storage/ndjson.js +238 -0
- package/dist/storage/ndjson.js.map +1 -0
- package/dist/storage/sqlite.d.ts +131 -0
- package/dist/storage/sqlite.d.ts.map +1 -0
- package/dist/storage/sqlite.js +415 -0
- package/dist/storage/sqlite.js.map +1 -0
- package/dist/types/index.d.ts +158 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/diff.d.ts +20 -0
- package/dist/utils/diff.d.ts.map +1 -0
- package/dist/utils/diff.js +47 -0
- package/dist/utils/diff.js.map +1 -0
- package/dist/utils/hash.d.ts +17 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +28 -0
- package/dist/utils/hash.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/logger.d.ts +11 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +64 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/path.d.ts +67 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +115 -0
- package/dist/utils/path.js.map +1 -0
- package/docs/ENGINEERING_PLAN.md +1065 -0
- package/docs/PRD.md +1004 -0
- package/docs/PROGRESS.md +523 -0
- package/package.json +60 -0
- package/src/cli/commands/diff.ts +158 -0
- package/src/cli/commands/freeze.ts +108 -0
- package/src/cli/commands/log.ts +87 -0
- package/src/cli/commands/rollback.ts +99 -0
- package/src/cli/commands/status.ts +101 -0
- package/src/cli/index.ts +31 -0
- package/src/config/defaults.ts +32 -0
- package/src/config/index.ts +220 -0
- package/src/core/evaluator/base-rule.ts +90 -0
- package/src/core/evaluator/index.ts +86 -0
- package/src/core/evaluator/rules/repeated-drift.ts +109 -0
- package/src/core/evaluator/rules/repeated-manual-fix.ts +129 -0
- package/src/core/journal/index.ts +286 -0
- package/src/core/observer/base-observer.ts +200 -0
- package/src/core/observer/codex-observer.ts +309 -0
- package/src/core/observer/index.ts +7 -0
- package/src/core/observer/trace-manager.ts +250 -0
- package/src/core/origin-registry/index.ts +264 -0
- package/src/core/patch-generator/base-strategy.ts +67 -0
- package/src/core/patch-generator/index.ts +118 -0
- package/src/core/patch-generator/strategies/add-fallback.ts +69 -0
- package/src/core/patch-generator/strategies/prune-noise.ts +65 -0
- package/src/core/shadow-manager/index.ts +278 -0
- package/src/core/shadow-registry/index.ts +200 -0
- package/src/daemon/index.ts +174 -0
- package/src/storage/index.ts +7 -0
- package/src/storage/markdown.ts +267 -0
- package/src/storage/ndjson.ts +273 -0
- package/src/storage/sqlite.ts +555 -0
- package/src/types/index.ts +212 -0
- package/src/utils/diff.ts +60 -0
- package/src/utils/hash.ts +31 -0
- package/src/utils/index.ts +8 -0
- package/src/utils/logger.ts +78 -0
- package/src/utils/path.ts +129 -0
- package/tests/unit/config.test.ts +65 -0
- package/tests/unit/path.test.ts +89 -0
- package/tests/unit/utils.test.ts +45 -0
- package/tsconfig.json +31 -0
- package/vitest.config.ts +19 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 默认配置
|
|
3
|
+
*/
|
|
4
|
+
export const DEFAULT_CONFIG = {
|
|
5
|
+
origin_paths: {
|
|
6
|
+
paths: ['~/.skills', '~/.claude/skills'],
|
|
7
|
+
},
|
|
8
|
+
observer: {
|
|
9
|
+
enabled_runtimes: ['codex', 'opencode', 'claude'],
|
|
10
|
+
trace_retention_days: 30,
|
|
11
|
+
},
|
|
12
|
+
evaluator: {
|
|
13
|
+
min_signal_count: 3,
|
|
14
|
+
min_source_sessions: 2,
|
|
15
|
+
min_confidence: 0.7,
|
|
16
|
+
},
|
|
17
|
+
patch: {
|
|
18
|
+
allowed_types: ['append_context', 'tighten_trigger', 'add_fallback', 'prune_noise'],
|
|
19
|
+
cooldown_hours: 24,
|
|
20
|
+
max_patches_per_day: 3,
|
|
21
|
+
},
|
|
22
|
+
journal: {
|
|
23
|
+
snapshot_interval: 5,
|
|
24
|
+
max_snapshots: 20,
|
|
25
|
+
},
|
|
26
|
+
daemon: {
|
|
27
|
+
auto_start: true,
|
|
28
|
+
log_level: 'info',
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAc;IACvC,YAAY,EAAE;QACZ,KAAK,EAAE,CAAC,WAAW,EAAE,kBAAkB,CAAC;KACzC;IACD,QAAQ,EAAE;QACR,gBAAgB,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC;QACjD,oBAAoB,EAAE,EAAE;KACzB;IACD,SAAS,EAAE;QACT,gBAAgB,EAAE,CAAC;QACnB,mBAAmB,EAAE,CAAC;QACtB,cAAc,EAAE,GAAG;KACpB;IACD,KAAK,EAAE;QACL,aAAa,EAAE,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,cAAc,EAAE,aAAa,CAAC;QACnF,cAAc,EAAE,EAAE;QAClB,mBAAmB,EAAE,CAAC;KACvB;IACD,OAAO,EAAE;QACP,iBAAiB,EAAE,CAAC;QACpB,aAAa,EAAE,EAAE;KAClB;IACD,MAAM,EAAE;QACN,UAAU,EAAE,IAAI;QAChB,SAAS,EAAE,MAAM;KAClB;CACF,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { EVOConfig, ProjectConfig } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* 配置管理器
|
|
4
|
+
*/
|
|
5
|
+
export declare class ConfigManager {
|
|
6
|
+
private globalConfig;
|
|
7
|
+
private projectConfig;
|
|
8
|
+
private projectRoot;
|
|
9
|
+
constructor();
|
|
10
|
+
/**
|
|
11
|
+
* 初始化配置管理器
|
|
12
|
+
*/
|
|
13
|
+
init(projectRoot?: string): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* 加载全局配置
|
|
16
|
+
*/
|
|
17
|
+
private loadGlobalConfig;
|
|
18
|
+
/**
|
|
19
|
+
* 加载项目配置
|
|
20
|
+
*/
|
|
21
|
+
private loadProjectConfig;
|
|
22
|
+
/**
|
|
23
|
+
* 深度合并配置对象
|
|
24
|
+
*/
|
|
25
|
+
private mergeConfig;
|
|
26
|
+
/**
|
|
27
|
+
* 获取全局配置
|
|
28
|
+
*/
|
|
29
|
+
getGlobalConfig(): EVOConfig;
|
|
30
|
+
/**
|
|
31
|
+
* 获取项目配置
|
|
32
|
+
*/
|
|
33
|
+
getProjectConfig(): ProjectConfig | null;
|
|
34
|
+
/**
|
|
35
|
+
* 获取 origin skill 路径列表
|
|
36
|
+
*/
|
|
37
|
+
getOriginPaths(): string[];
|
|
38
|
+
/**
|
|
39
|
+
* 获取评估器配置
|
|
40
|
+
*/
|
|
41
|
+
getEvaluatorConfig(): EVOConfig['evaluator'];
|
|
42
|
+
/**
|
|
43
|
+
* 获取 patch 配置
|
|
44
|
+
*/
|
|
45
|
+
getPatchConfig(): EVOConfig['patch'];
|
|
46
|
+
/**
|
|
47
|
+
* 获取 journal 配置
|
|
48
|
+
*/
|
|
49
|
+
getJournalConfig(): EVOConfig['journal'];
|
|
50
|
+
/**
|
|
51
|
+
* 检查 skill 是否在项目中被冻结
|
|
52
|
+
*/
|
|
53
|
+
isSkillFrozen(skillId: string): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* 获取 skill 允许的 patch 类型
|
|
56
|
+
*/
|
|
57
|
+
getAllowedPatchTypes(skillId: string): string[];
|
|
58
|
+
/**
|
|
59
|
+
* 创建默认全局配置文件
|
|
60
|
+
*/
|
|
61
|
+
ensureGlobalConfig(): void;
|
|
62
|
+
/**
|
|
63
|
+
* 简单的配置转 TOML(仅支持一层嵌套)
|
|
64
|
+
*/
|
|
65
|
+
private configToToml;
|
|
66
|
+
}
|
|
67
|
+
export declare const configManager: ConfigManager;
|
|
68
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAOlE;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,YAAY,CAAY;IAChC,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,WAAW,CAAuB;;IAM1C;;OAEG;IACG,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW/C;;OAEG;YACW,gBAAgB;IAsB9B;;OAEG;YACW,iBAAiB;IAkB/B;;OAEG;IACH,OAAO,CAAC,WAAW;IA6BnB;;OAEG;IACH,eAAe,IAAI,SAAS;IAI5B;;OAEG;IACH,gBAAgB,IAAI,aAAa,GAAG,IAAI;IAIxC;;OAEG;IACH,cAAc,IAAI,MAAM,EAAE;IAM1B;;OAEG;IACH,kBAAkB,IAAI,SAAS,CAAC,WAAW,CAAC;IAI5C;;OAEG;IACH,cAAc,IAAI,SAAS,CAAC,OAAO,CAAC;IAIpC;;OAEG;IACH,gBAAgB,IAAI,SAAS,CAAC,SAAS,CAAC;IAIxC;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAMvC;;OAEG;IACH,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAM/C;;OAEG;IACH,kBAAkB,IAAI,IAAI;IAW1B;;OAEG;IACH,OAAO,CAAC,YAAY;CAsBrB;AAGD,eAAO,MAAM,aAAa,eAAsB,CAAC"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { cosmiconfig } from 'cosmiconfig';
|
|
2
|
+
import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { join, resolve } from 'node:path';
|
|
5
|
+
import { DEFAULT_CONFIG } from './defaults.js';
|
|
6
|
+
const MODULE_NAME = 'evo';
|
|
7
|
+
const GLOBAL_CONFIG_DIR = join(homedir(), '.evo');
|
|
8
|
+
const GLOBAL_CONFIG_FILE = join(GLOBAL_CONFIG_DIR, 'settings.toml');
|
|
9
|
+
/**
|
|
10
|
+
* 配置管理器
|
|
11
|
+
*/
|
|
12
|
+
export class ConfigManager {
|
|
13
|
+
globalConfig;
|
|
14
|
+
projectConfig = null;
|
|
15
|
+
projectRoot = null;
|
|
16
|
+
constructor() {
|
|
17
|
+
this.globalConfig = { ...DEFAULT_CONFIG };
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 初始化配置管理器
|
|
21
|
+
*/
|
|
22
|
+
async init(projectRoot) {
|
|
23
|
+
// 加载全局配置
|
|
24
|
+
await this.loadGlobalConfig();
|
|
25
|
+
// 如果指定了项目根目录,加载项目配置
|
|
26
|
+
if (projectRoot) {
|
|
27
|
+
this.projectRoot = projectRoot;
|
|
28
|
+
await this.loadProjectConfig();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 加载全局配置
|
|
33
|
+
*/
|
|
34
|
+
async loadGlobalConfig() {
|
|
35
|
+
const explorer = cosmiconfig(MODULE_NAME, {
|
|
36
|
+
searchPlaces: [
|
|
37
|
+
'settings.toml',
|
|
38
|
+
'.eorc',
|
|
39
|
+
'.eorc.json',
|
|
40
|
+
'.eorc.yaml',
|
|
41
|
+
'.eorc.yml',
|
|
42
|
+
'package.json',
|
|
43
|
+
],
|
|
44
|
+
});
|
|
45
|
+
try {
|
|
46
|
+
const result = await explorer.search(GLOBAL_CONFIG_DIR);
|
|
47
|
+
if (result && !result.isEmpty) {
|
|
48
|
+
this.globalConfig = this.mergeConfig(DEFAULT_CONFIG, result.config);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// 配置文件不存在或格式错误,使用默认配置
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 加载项目配置
|
|
57
|
+
*/
|
|
58
|
+
async loadProjectConfig() {
|
|
59
|
+
if (!this.projectRoot)
|
|
60
|
+
return;
|
|
61
|
+
const projectConfigPath = join(this.projectRoot, '.evo', 'config', 'settings.toml');
|
|
62
|
+
const explorer = cosmiconfig(MODULE_NAME, {
|
|
63
|
+
searchPlaces: [projectConfigPath],
|
|
64
|
+
});
|
|
65
|
+
try {
|
|
66
|
+
const result = await explorer.search(this.projectRoot);
|
|
67
|
+
if (result && !result.isEmpty) {
|
|
68
|
+
this.projectConfig = result.config;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// 项目配置不存在
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* 深度合并配置对象
|
|
77
|
+
*/
|
|
78
|
+
mergeConfig(base, override) {
|
|
79
|
+
const result = { ...base };
|
|
80
|
+
for (const key in override) {
|
|
81
|
+
if (Object.prototype.hasOwnProperty.call(override, key)) {
|
|
82
|
+
const baseValue = base[key];
|
|
83
|
+
const overrideValue = override[key];
|
|
84
|
+
if (typeof baseValue === 'object' &&
|
|
85
|
+
baseValue !== null &&
|
|
86
|
+
!Array.isArray(baseValue) &&
|
|
87
|
+
typeof overrideValue === 'object' &&
|
|
88
|
+
overrideValue !== null &&
|
|
89
|
+
!Array.isArray(overrideValue)) {
|
|
90
|
+
result[key] = this.mergeConfig(baseValue, overrideValue);
|
|
91
|
+
}
|
|
92
|
+
else if (overrideValue !== undefined) {
|
|
93
|
+
result[key] = overrideValue;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* 获取全局配置
|
|
101
|
+
*/
|
|
102
|
+
getGlobalConfig() {
|
|
103
|
+
return { ...this.globalConfig };
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* 获取项目配置
|
|
107
|
+
*/
|
|
108
|
+
getProjectConfig() {
|
|
109
|
+
return this.projectConfig ? { ...this.projectConfig } : null;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* 获取 origin skill 路径列表
|
|
113
|
+
*/
|
|
114
|
+
getOriginPaths() {
|
|
115
|
+
return this.globalConfig.origin_paths.paths.map((p) => p.startsWith('~') ? p.replace('~', homedir()) : resolve(p));
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* 获取评估器配置
|
|
119
|
+
*/
|
|
120
|
+
getEvaluatorConfig() {
|
|
121
|
+
return { ...this.globalConfig.evaluator };
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* 获取 patch 配置
|
|
125
|
+
*/
|
|
126
|
+
getPatchConfig() {
|
|
127
|
+
return { ...this.globalConfig.patch };
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* 获取 journal 配置
|
|
131
|
+
*/
|
|
132
|
+
getJournalConfig() {
|
|
133
|
+
return { ...this.globalConfig.journal };
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* 检查 skill 是否在项目中被冻结
|
|
137
|
+
*/
|
|
138
|
+
isSkillFrozen(skillId) {
|
|
139
|
+
if (!this.projectConfig)
|
|
140
|
+
return false;
|
|
141
|
+
const skillConfig = this.projectConfig.skills[skillId];
|
|
142
|
+
return skillConfig?.auto_optimize === false;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* 获取 skill 允许的 patch 类型
|
|
146
|
+
*/
|
|
147
|
+
getAllowedPatchTypes(skillId) {
|
|
148
|
+
if (!this.projectConfig)
|
|
149
|
+
return this.globalConfig.patch.allowed_types;
|
|
150
|
+
const skillConfig = this.projectConfig.skills[skillId];
|
|
151
|
+
return skillConfig?.allowed_patch_types ?? this.globalConfig.patch.allowed_types;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* 创建默认全局配置文件
|
|
155
|
+
*/
|
|
156
|
+
ensureGlobalConfig() {
|
|
157
|
+
if (!existsSync(GLOBAL_CONFIG_DIR)) {
|
|
158
|
+
mkdirSync(GLOBAL_CONFIG_DIR, { recursive: true });
|
|
159
|
+
}
|
|
160
|
+
if (!existsSync(GLOBAL_CONFIG_FILE)) {
|
|
161
|
+
const tomlContent = this.configToToml(DEFAULT_CONFIG);
|
|
162
|
+
writeFileSync(GLOBAL_CONFIG_FILE, tomlContent, 'utf-8');
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* 简单的配置转 TOML(仅支持一层嵌套)
|
|
167
|
+
*/
|
|
168
|
+
configToToml(config, indent = 0) {
|
|
169
|
+
let result = '';
|
|
170
|
+
const prefix = ' '.repeat(indent);
|
|
171
|
+
for (const [key, value] of Object.entries(config)) {
|
|
172
|
+
if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
|
|
173
|
+
result += `${prefix}[${key}]\n`;
|
|
174
|
+
result += this.configToToml(value, indent + 1);
|
|
175
|
+
result += '\n';
|
|
176
|
+
}
|
|
177
|
+
else if (Array.isArray(value)) {
|
|
178
|
+
result += `${prefix}${key} = [${value.map((v) => `"${v}"`).join(', ')}]\n`;
|
|
179
|
+
}
|
|
180
|
+
else if (typeof value === 'string') {
|
|
181
|
+
result += `${prefix}${key} = "${value}"\n`;
|
|
182
|
+
}
|
|
183
|
+
else if (typeof value === 'boolean') {
|
|
184
|
+
result += `${prefix}${key} = ${value}\n`;
|
|
185
|
+
}
|
|
186
|
+
else if (typeof value === 'number') {
|
|
187
|
+
result += `${prefix}${key} = ${value}\n`;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return result;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// 导出单例实例
|
|
194
|
+
export const configManager = new ConfigManager();
|
|
195
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,WAAW,GAAG,KAAK,CAAC;AAC1B,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;AAClD,MAAM,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAC;AAEpE;;GAEG;AACH,MAAM,OAAO,aAAa;IAChB,YAAY,CAAY;IACxB,aAAa,GAAyB,IAAI,CAAC;IAC3C,WAAW,GAAkB,IAAI,CAAC;IAE1C;QACE,IAAI,CAAC,YAAY,GAAG,EAAE,GAAG,cAAc,EAAE,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,WAAoB;QAC7B,SAAS;QACT,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAE9B,oBAAoB;QACpB,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;YAC/B,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACjC,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB;QAC5B,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,EAAE;YACxC,YAAY,EAAE;gBACZ,eAAe;gBACf,OAAO;gBACP,YAAY;gBACZ,YAAY;gBACZ,WAAW;gBACX,cAAc;aACf;SACF,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;YACxD,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC9B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,MAAM,CAAC,MAAmB,CAAC,CAAC;YACnF,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,iBAAiB;QAC7B,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO;QAE9B,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;QACpF,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,EAAE;YACxC,YAAY,EAAE,CAAC,iBAAiB,CAAC;SAClC,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACvD,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC9B,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,MAAuB,CAAC;YACtD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,UAAU;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,WAAW,CAAmB,IAAO,EAAE,QAAoB;QACjE,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;QAE3B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC;gBACxD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC5B,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAEpC,IACE,OAAO,SAAS,KAAK,QAAQ;oBAC7B,SAAS,KAAK,IAAI;oBAClB,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;oBACzB,OAAO,aAAa,KAAK,QAAQ;oBACjC,aAAa,KAAK,IAAI;oBACtB,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAC7B,CAAC;oBACA,MAAkC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CACzD,SAAmB,EACnB,aAAuB,CACxB,CAAC;gBACJ,CAAC;qBAAM,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;oBACtC,MAAkC,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC;gBAC3D,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/D,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACpD,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAC3D,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,OAAO,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,OAAe;QAC3B,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,OAAO,KAAK,CAAC;QACtC,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvD,OAAO,WAAW,EAAE,aAAa,KAAK,KAAK,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,OAAe;QAClC,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,aAAa,CAAC;QACtE,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvD,OAAO,WAAW,EAAE,mBAAmB,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,aAAa,CAAC;IACnF,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACnC,SAAS,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACpC,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;YACtD,aAAa,CAAC,kBAAkB,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,MAAc,EAAE,MAAM,GAAG,CAAC;QAC7C,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEnC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzE,MAAM,IAAI,GAAG,MAAM,IAAI,GAAG,KAAK,CAAC;gBAChC,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,KAAe,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;gBACzD,MAAM,IAAI,IAAI,CAAC;YACjB,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChC,MAAM,IAAI,GAAG,MAAM,GAAG,GAAG,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YAC7E,CAAC;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACrC,MAAM,IAAI,GAAG,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,CAAC;YAC7C,CAAC;iBAAM,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;gBACtC,MAAM,IAAI,GAAG,MAAM,GAAG,GAAG,MAAM,KAAK,IAAI,CAAC;YAC3C,CAAC;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACrC,MAAM,IAAI,GAAG,MAAM,GAAG,GAAG,MAAM,KAAK,IAAI,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,SAAS;AACT,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { Trace, EvaluationResult } from '../../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* 评估规则基类
|
|
4
|
+
*/
|
|
5
|
+
export declare abstract class BaseRule {
|
|
6
|
+
protected name: string;
|
|
7
|
+
protected description: string;
|
|
8
|
+
constructor(name: string, description: string);
|
|
9
|
+
/**
|
|
10
|
+
* 评估 traces,返回评估结果
|
|
11
|
+
*/
|
|
12
|
+
abstract evaluate(traces: Trace[]): EvaluationResult | null;
|
|
13
|
+
/**
|
|
14
|
+
* 获取规则名称
|
|
15
|
+
*/
|
|
16
|
+
getName(): string;
|
|
17
|
+
/**
|
|
18
|
+
* 获取规则描述
|
|
19
|
+
*/
|
|
20
|
+
getDescription(): string;
|
|
21
|
+
/**
|
|
22
|
+
* 提取唯一的 session IDs
|
|
23
|
+
*/
|
|
24
|
+
protected extractSessionIds(traces: Trace[]): string[];
|
|
25
|
+
/**
|
|
26
|
+
* 按事件类型过滤 traces
|
|
27
|
+
*/
|
|
28
|
+
protected filterByEventType(traces: Trace[], eventType: string): Trace[];
|
|
29
|
+
/**
|
|
30
|
+
* 按状态过滤 traces
|
|
31
|
+
*/
|
|
32
|
+
protected filterByStatus(traces: Trace[], status: string): Trace[];
|
|
33
|
+
/**
|
|
34
|
+
* 获取失败的 traces
|
|
35
|
+
*/
|
|
36
|
+
protected getFailedTraces(traces: Trace[]): Trace[];
|
|
37
|
+
/**
|
|
38
|
+
* 获取重试的 traces
|
|
39
|
+
*/
|
|
40
|
+
protected getRetryTraces(traces: Trace[]): Trace[];
|
|
41
|
+
/**
|
|
42
|
+
* 获取文件变化的 traces
|
|
43
|
+
*/
|
|
44
|
+
protected getFileChangeTraces(traces: Trace[]): Trace[];
|
|
45
|
+
/**
|
|
46
|
+
* 计算置信度
|
|
47
|
+
*/
|
|
48
|
+
protected calculateConfidence(signalCount: number, sessionCount: number, minSignals?: number, minSessions?: number): number;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=base-rule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-rule.d.ts","sourceRoot":"","sources":["../../../src/core/evaluator/base-rule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAEpE;;GAEG;AACH,8BAAsB,QAAQ;IAC5B,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC;gBAElB,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAK7C;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,gBAAgB,GAAG,IAAI;IAE3D;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE;IAKtD;;OAEG;IACH,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,KAAK,EAAE;IAIxE;;OAEG;IACH,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE;IAIlE;;OAEG;IACH,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE;IAInD;;OAEG;IACH,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE;IAIlD;;OAEG;IACH,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE;IAIvD;;OAEG;IACH,SAAS,CAAC,mBAAmB,CAC3B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,UAAU,GAAE,MAAU,EACtB,WAAW,GAAE,MAAU,GACtB,MAAM;CAKV"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 评估规则基类
|
|
3
|
+
*/
|
|
4
|
+
export class BaseRule {
|
|
5
|
+
name;
|
|
6
|
+
description;
|
|
7
|
+
constructor(name, description) {
|
|
8
|
+
this.name = name;
|
|
9
|
+
this.description = description;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* 获取规则名称
|
|
13
|
+
*/
|
|
14
|
+
getName() {
|
|
15
|
+
return this.name;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 获取规则描述
|
|
19
|
+
*/
|
|
20
|
+
getDescription() {
|
|
21
|
+
return this.description;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 提取唯一的 session IDs
|
|
25
|
+
*/
|
|
26
|
+
extractSessionIds(traces) {
|
|
27
|
+
const sessionIds = new Set(traces.map((t) => t.session_id));
|
|
28
|
+
return Array.from(sessionIds);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 按事件类型过滤 traces
|
|
32
|
+
*/
|
|
33
|
+
filterByEventType(traces, eventType) {
|
|
34
|
+
return traces.filter((t) => t.event_type === eventType);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 按状态过滤 traces
|
|
38
|
+
*/
|
|
39
|
+
filterByStatus(traces, status) {
|
|
40
|
+
return traces.filter((t) => t.status === status);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 获取失败的 traces
|
|
44
|
+
*/
|
|
45
|
+
getFailedTraces(traces) {
|
|
46
|
+
return this.filterByStatus(traces, 'failure');
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 获取重试的 traces
|
|
50
|
+
*/
|
|
51
|
+
getRetryTraces(traces) {
|
|
52
|
+
return this.filterByEventType(traces, 'retry');
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 获取文件变化的 traces
|
|
56
|
+
*/
|
|
57
|
+
getFileChangeTraces(traces) {
|
|
58
|
+
return this.filterByEventType(traces, 'file_change');
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 计算置信度
|
|
62
|
+
*/
|
|
63
|
+
calculateConfidence(signalCount, sessionCount, minSignals = 3, minSessions = 2) {
|
|
64
|
+
const signalScore = Math.min(signalCount / minSignals, 1) * 0.6;
|
|
65
|
+
const sessionScore = Math.min(sessionCount / minSessions, 1) * 0.4;
|
|
66
|
+
return Math.min(signalScore + sessionScore, 1);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=base-rule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-rule.js","sourceRoot":"","sources":["../../../src/core/evaluator/base-rule.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,OAAgB,QAAQ;IAClB,IAAI,CAAS;IACb,WAAW,CAAS;IAE9B,YAAY,IAAY,EAAE,WAAmB;QAC3C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAOD;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;OAEG;IACO,iBAAiB,CAAC,MAAe;QACzC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QAC5D,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACO,iBAAiB,CAAC,MAAe,EAAE,SAAiB;QAC5D,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACO,cAAc,CAAC,MAAe,EAAE,MAAc;QACtD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACO,eAAe,CAAC,MAAe;QACvC,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACO,cAAc,CAAC,MAAe;QACtC,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAED;;OAEG;IACO,mBAAmB,CAAC,MAAe;QAC3C,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACO,mBAAmB,CAC3B,WAAmB,EACnB,YAAoB,EACpB,aAAqB,CAAC,EACtB,cAAsB,CAAC;QAEvB,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,UAAU,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;QAChE,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,WAAW,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;QACnE,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC;CACF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { BaseRule } from './base-rule.js';
|
|
2
|
+
import type { Trace, EvaluationResult } from '../../types/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Evaluator
|
|
5
|
+
* 负责评估 traces 并判断是否需要优化
|
|
6
|
+
*/
|
|
7
|
+
export declare class Evaluator {
|
|
8
|
+
private rules;
|
|
9
|
+
private minConfidence;
|
|
10
|
+
constructor();
|
|
11
|
+
/**
|
|
12
|
+
* 注册默认规则
|
|
13
|
+
*/
|
|
14
|
+
private registerDefaultRules;
|
|
15
|
+
/**
|
|
16
|
+
* 注册自定义规则
|
|
17
|
+
*/
|
|
18
|
+
registerRule(rule: BaseRule): void;
|
|
19
|
+
/**
|
|
20
|
+
* 评估 traces
|
|
21
|
+
*/
|
|
22
|
+
evaluate(traces: Trace[]): EvaluationResult | null;
|
|
23
|
+
/**
|
|
24
|
+
* 获取所有规则
|
|
25
|
+
*/
|
|
26
|
+
getRules(): BaseRule[];
|
|
27
|
+
/**
|
|
28
|
+
* 设置最小置信度
|
|
29
|
+
*/
|
|
30
|
+
setMinConfidence(confidence: number): void;
|
|
31
|
+
}
|
|
32
|
+
export declare const evaluator: Evaluator;
|
|
33
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/evaluator/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C,OAAO,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAIpE;;;GAGG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,aAAa,CAAS;;IAO9B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAM5B;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAKlC;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,gBAAgB,GAAG,IAAI;IA2BlD;;OAEG;IACH,QAAQ,IAAI,QAAQ,EAAE;IAItB;;OAEG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;CAG3C;AAGD,eAAO,MAAM,SAAS,WAAkB,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { createChildLogger } from '../../utils/logger.js';
|
|
2
|
+
import { configManager } from '../../config/index.js';
|
|
3
|
+
import { BaseRule } from './base-rule.js';
|
|
4
|
+
import { RepeatedManualFixRule } from './rules/repeated-manual-fix.js';
|
|
5
|
+
import { RepeatedDriftRule } from './rules/repeated-drift.js';
|
|
6
|
+
const logger = createChildLogger('evaluator');
|
|
7
|
+
/**
|
|
8
|
+
* Evaluator
|
|
9
|
+
* 负责评估 traces 并判断是否需要优化
|
|
10
|
+
*/
|
|
11
|
+
export class Evaluator {
|
|
12
|
+
rules = [];
|
|
13
|
+
minConfidence;
|
|
14
|
+
constructor() {
|
|
15
|
+
this.minConfidence = configManager.getEvaluatorConfig().min_confidence;
|
|
16
|
+
this.registerDefaultRules();
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 注册默认规则
|
|
20
|
+
*/
|
|
21
|
+
registerDefaultRules() {
|
|
22
|
+
this.rules.push(new RepeatedManualFixRule());
|
|
23
|
+
this.rules.push(new RepeatedDriftRule());
|
|
24
|
+
logger.info('Default evaluation rules registered');
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 注册自定义规则
|
|
28
|
+
*/
|
|
29
|
+
registerRule(rule) {
|
|
30
|
+
this.rules.push(rule);
|
|
31
|
+
logger.info(`Rule registered: ${rule.getName()}`);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 评估 traces
|
|
35
|
+
*/
|
|
36
|
+
evaluate(traces) {
|
|
37
|
+
if (traces.length === 0) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
logger.debug(`Evaluating ${traces.length} traces with ${this.rules.length} rules`);
|
|
41
|
+
// 运行所有规则
|
|
42
|
+
for (const rule of this.rules) {
|
|
43
|
+
try {
|
|
44
|
+
const result = rule.evaluate(traces);
|
|
45
|
+
if (result && result.confidence >= this.minConfidence) {
|
|
46
|
+
logger.info(`Rule "${rule.getName()}" triggered`, {
|
|
47
|
+
change_type: result.change_type,
|
|
48
|
+
confidence: result.confidence,
|
|
49
|
+
});
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
logger.warn(`Rule "${rule.getName()}" evaluation failed`, { error });
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* 获取所有规则
|
|
61
|
+
*/
|
|
62
|
+
getRules() {
|
|
63
|
+
return [...this.rules];
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 设置最小置信度
|
|
67
|
+
*/
|
|
68
|
+
setMinConfidence(confidence) {
|
|
69
|
+
this.minConfidence = confidence;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// 导出单例实例
|
|
73
|
+
export const evaluator = new Evaluator();
|
|
74
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/evaluator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAG9D,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;AAE9C;;;GAGG;AACH,MAAM,OAAO,SAAS;IACZ,KAAK,GAAe,EAAE,CAAC;IACvB,aAAa,CAAS;IAE9B;QACE,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC,kBAAkB,EAAE,CAAC,cAAc,CAAC;QACvE,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IACK,oBAAoB;QAC1B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,qBAAqB,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,IAAc;QACzB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,MAAe;QACtB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,cAAc,MAAM,CAAC,MAAM,gBAAgB,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;QAEnF,SAAS;QACT,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAErC,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;oBACtD,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE;wBAChD,WAAW,EAAE,MAAM,CAAC,WAAW;wBAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;qBAC9B,CAAC,CAAC;oBACH,OAAO,MAAM,CAAC;gBAChB,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,EAAE,qBAAqB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,UAAkB;QACjC,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC;IAClC,CAAC;CACF;AAED,SAAS;AACT,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { BaseRule } from '../base-rule.js';
|
|
2
|
+
import type { Trace, EvaluationResult } from '../../../types/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Repeated Drift 规则
|
|
5
|
+
* 检测 skill 被命中但执行反复绕过某一段
|
|
6
|
+
*/
|
|
7
|
+
export declare class RepeatedDriftRule extends BaseRule {
|
|
8
|
+
constructor();
|
|
9
|
+
evaluate(traces: Trace[]): EvaluationResult | null;
|
|
10
|
+
/**
|
|
11
|
+
* 找出被跳过的工具
|
|
12
|
+
*/
|
|
13
|
+
private findSkippedTools;
|
|
14
|
+
/**
|
|
15
|
+
* 统计跳过次数
|
|
16
|
+
*/
|
|
17
|
+
private countSkips;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=repeated-drift.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repeated-drift.d.ts","sourceRoot":"","sources":["../../../../src/core/evaluator/rules/repeated-drift.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEvE;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,QAAQ;;IAQ7C,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,gBAAgB,GAAG,IAAI;IAsClD;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA2BxB;;OAEG;IACH,OAAO,CAAC,UAAU;CAsBnB"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { BaseRule } from '../base-rule.js';
|
|
2
|
+
/**
|
|
3
|
+
* Repeated Drift 规则
|
|
4
|
+
* 检测 skill 被命中但执行反复绕过某一段
|
|
5
|
+
*/
|
|
6
|
+
export class RepeatedDriftRule extends BaseRule {
|
|
7
|
+
constructor() {
|
|
8
|
+
super('repeated-drift', 'Detects when skill is hit but execution repeatedly bypasses certain sections');
|
|
9
|
+
}
|
|
10
|
+
evaluate(traces) {
|
|
11
|
+
// 查找工具调用
|
|
12
|
+
const toolCalls = this.filterByEventType(traces, 'tool_call');
|
|
13
|
+
if (toolCalls.length === 0) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
// 找出被跳过的工具或步骤
|
|
17
|
+
const skippedTools = this.findSkippedTools(traces);
|
|
18
|
+
if (skippedTools.length === 0) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
// 统计跳过次数
|
|
22
|
+
const skipCount = this.countSkips(traces, skippedTools);
|
|
23
|
+
if (skipCount < 3) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
const sessionIds = this.extractSessionIds(traces);
|
|
27
|
+
const confidence = this.calculateConfidence(skipCount, sessionIds.length);
|
|
28
|
+
if (confidence < 0.7) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
should_patch: true,
|
|
33
|
+
change_type: 'prune_noise',
|
|
34
|
+
reason: `Skill section "${skippedTools[0]}" was skipped ${skipCount} times across ${sessionIds.length} sessions`,
|
|
35
|
+
source_sessions: sessionIds,
|
|
36
|
+
confidence,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 找出被跳过的工具
|
|
41
|
+
*/
|
|
42
|
+
findSkippedTools(traces) {
|
|
43
|
+
const skipped = [];
|
|
44
|
+
// 查找在工具调用后没有结果的情况
|
|
45
|
+
for (const trace of traces) {
|
|
46
|
+
if (trace.event_type === 'tool_call' && trace.tool_name) {
|
|
47
|
+
// 查找后续的工具结果
|
|
48
|
+
const subsequentResults = traces.filter((t) => t.event_type === 'tool_result' &&
|
|
49
|
+
t.tool_name === trace.tool_name &&
|
|
50
|
+
new Date(t.timestamp) > new Date(trace.timestamp) &&
|
|
51
|
+
new Date(t.timestamp).getTime() - new Date(trace.timestamp).getTime() < 5000);
|
|
52
|
+
if (subsequentResults.length === 0) {
|
|
53
|
+
// 没有找到对应的结果,可能是被跳过了
|
|
54
|
+
if (!skipped.includes(trace.tool_name)) {
|
|
55
|
+
skipped.push(trace.tool_name);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return skipped;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 统计跳过次数
|
|
64
|
+
*/
|
|
65
|
+
countSkips(traces, skippedTools) {
|
|
66
|
+
let count = 0;
|
|
67
|
+
for (const trace of traces) {
|
|
68
|
+
if (trace.event_type === 'tool_call' && skippedTools.includes(trace.tool_name ?? '')) {
|
|
69
|
+
// 检查是否有对应的工具结果
|
|
70
|
+
const hasResult = traces.some((t) => t.event_type === 'tool_result' &&
|
|
71
|
+
t.tool_name === trace.tool_name &&
|
|
72
|
+
new Date(t.timestamp) > new Date(trace.timestamp) &&
|
|
73
|
+
new Date(t.timestamp).getTime() - new Date(trace.timestamp).getTime() < 5000);
|
|
74
|
+
if (!hasResult) {
|
|
75
|
+
count++;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return count;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=repeated-drift.js.map
|