@hongmaple0820/scale-engine 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/LICENSE +15 -0
- package/README.md +64 -0
- package/dist/adapters/ClaudeCodeAdapter.d.ts +48 -0
- package/dist/adapters/ClaudeCodeAdapter.js +188 -0
- package/dist/adapters/ClaudeCodeAdapter.js.map +1 -0
- package/dist/adapters/CodexAdapter.d.ts +14 -0
- package/dist/adapters/CodexAdapter.js +153 -0
- package/dist/adapters/CodexAdapter.js.map +1 -0
- package/dist/api/cli.d.ts +2 -0
- package/dist/api/cli.js +396 -0
- package/dist/api/cli.js.map +1 -0
- package/dist/api/doctor.d.ts +28 -0
- package/dist/api/doctor.js +182 -0
- package/dist/api/doctor.js.map +1 -0
- package/dist/api/mcp.d.ts +32 -0
- package/dist/api/mcp.js +227 -0
- package/dist/api/mcp.js.map +1 -0
- package/dist/artifact/fsm.d.ts +36 -0
- package/dist/artifact/fsm.js +199 -0
- package/dist/artifact/fsm.js.map +1 -0
- package/dist/artifact/fsmDefinitions.d.ts +18 -0
- package/dist/artifact/fsmDefinitions.js +243 -0
- package/dist/artifact/fsmDefinitions.js.map +1 -0
- package/dist/artifact/sqliteStore.d.ts +61 -0
- package/dist/artifact/sqliteStore.js +394 -0
- package/dist/artifact/sqliteStore.js.map +1 -0
- package/dist/artifact/store.d.ts +49 -0
- package/dist/artifact/store.js +118 -0
- package/dist/artifact/store.js.map +1 -0
- package/dist/artifact/types.d.ts +333 -0
- package/dist/artifact/types.js +50 -0
- package/dist/artifact/types.js.map +1 -0
- package/dist/context/ContextBuilder.d.ts +36 -0
- package/dist/context/ContextBuilder.js +53 -0
- package/dist/context/ContextBuilder.js.map +1 -0
- package/dist/core/container.d.ts +14 -0
- package/dist/core/container.js +33 -0
- package/dist/core/container.js.map +1 -0
- package/dist/core/eventBus.d.ts +60 -0
- package/dist/core/eventBus.js +158 -0
- package/dist/core/eventBus.js.map +1 -0
- package/dist/core/logger.d.ts +3 -0
- package/dist/core/logger.js +12 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/evolution/BehaviorTracker.d.ts +38 -0
- package/dist/evolution/BehaviorTracker.js +52 -0
- package/dist/evolution/BehaviorTracker.js.map +1 -0
- package/dist/evolution/EvolutionEngine.d.ts +99 -0
- package/dist/evolution/EvolutionEngine.js +321 -0
- package/dist/evolution/EvolutionEngine.js.map +1 -0
- package/dist/guardrails/Gateway.d.ts +26 -0
- package/dist/guardrails/Gateway.js +57 -0
- package/dist/guardrails/Gateway.js.map +1 -0
- package/dist/guardrails/advancedDetectors.d.ts +26 -0
- package/dist/guardrails/advancedDetectors.js +138 -0
- package/dist/guardrails/advancedDetectors.js.map +1 -0
- package/dist/guardrails/detectors.d.ts +25 -0
- package/dist/guardrails/detectors.js +170 -0
- package/dist/guardrails/detectors.js.map +1 -0
- package/dist/guardrails/roles.d.ts +4 -0
- package/dist/guardrails/roles.js +54 -0
- package/dist/guardrails/roles.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge/KnowledgeBase.d.ts +25 -0
- package/dist/knowledge/KnowledgeBase.js +81 -0
- package/dist/knowledge/KnowledgeBase.js.map +1 -0
- package/dist/orchestration/EffectsWiring.d.ts +8 -0
- package/dist/orchestration/EffectsWiring.js +87 -0
- package/dist/orchestration/EffectsWiring.js.map +1 -0
- package/dist/routing/ModelRouter.d.ts +30 -0
- package/dist/routing/ModelRouter.js +69 -0
- package/dist/routing/ModelRouter.js.map +1 -0
- package/dist/tasks/TaskEngine.d.ts +97 -0
- package/dist/tasks/TaskEngine.js +269 -0
- package/dist/tasks/TaskEngine.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
// SCALE Engine — Event Bus
|
|
2
|
+
// 系统的"神经系统"。所有模块通过它解耦。
|
|
3
|
+
// 内存 pub/sub + JSONL 持久化 + 重放能力。
|
|
4
|
+
// 设计参考:docs/03-CORE-MODULES.md §3.1
|
|
5
|
+
import { logger } from './logger.js';
|
|
6
|
+
import { appendFileSync, existsSync, mkdirSync, readFileSync, readdirSync } from 'node:fs';
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
export class EventBus {
|
|
9
|
+
handlers = new Map();
|
|
10
|
+
middlewares = [];
|
|
11
|
+
memoryRing = [];
|
|
12
|
+
maxRingSize = 1000;
|
|
13
|
+
seq = 0;
|
|
14
|
+
eventsDir;
|
|
15
|
+
constructor(opts = {}) {
|
|
16
|
+
this.eventsDir = opts.eventsDir ?? '.scale/events';
|
|
17
|
+
if (!existsSync(this.eventsDir))
|
|
18
|
+
mkdirSync(this.eventsDir, { recursive: true });
|
|
19
|
+
}
|
|
20
|
+
on(type, handler) {
|
|
21
|
+
if (!this.handlers.has(type))
|
|
22
|
+
this.handlers.set(type, new Set());
|
|
23
|
+
const handlers = this.handlers.get(type);
|
|
24
|
+
handlers.add(handler);
|
|
25
|
+
return { unsubscribe: () => { handlers.delete(handler); if (handlers.size === 0)
|
|
26
|
+
this.handlers.delete(type); } };
|
|
27
|
+
}
|
|
28
|
+
once(type, handler) {
|
|
29
|
+
const sub = this.on(type, (e) => { sub.unsubscribe(); handler(e); });
|
|
30
|
+
}
|
|
31
|
+
use(mw) { this.middlewares.push(mw); }
|
|
32
|
+
emit(type, payload, opts = {}) {
|
|
33
|
+
const event = Object.freeze({
|
|
34
|
+
id: this.generateId(),
|
|
35
|
+
type, timestamp: Date.now(),
|
|
36
|
+
sessionId: opts.sessionId ?? 'system',
|
|
37
|
+
actor: opts.actor ?? { kind: 'system', component: 'EventBus' },
|
|
38
|
+
artifactId: opts.artifactId, payload,
|
|
39
|
+
causedBy: opts.causedBy, correlationId: opts.correlationId,
|
|
40
|
+
});
|
|
41
|
+
let processed = event;
|
|
42
|
+
for (const mw of this.middlewares) {
|
|
43
|
+
processed = mw(processed);
|
|
44
|
+
if (!processed)
|
|
45
|
+
return event;
|
|
46
|
+
}
|
|
47
|
+
this.persist(processed);
|
|
48
|
+
this.pushToRing(processed);
|
|
49
|
+
this.dispatchAsync(processed);
|
|
50
|
+
return processed;
|
|
51
|
+
}
|
|
52
|
+
async emitAsync(type, payload, opts) {
|
|
53
|
+
const event = this.emit(type, payload, opts);
|
|
54
|
+
await this.dispatchSync(event);
|
|
55
|
+
return event;
|
|
56
|
+
}
|
|
57
|
+
async replay(filter, handler) {
|
|
58
|
+
for (const file of this.getEventFiles(filter)) {
|
|
59
|
+
const lines = readFileSync(file, 'utf-8').split('\n').filter(Boolean);
|
|
60
|
+
for (const line of lines) {
|
|
61
|
+
try {
|
|
62
|
+
const event = JSON.parse(line);
|
|
63
|
+
if (this.matchesFilter(event, filter))
|
|
64
|
+
await handler(event);
|
|
65
|
+
}
|
|
66
|
+
catch (e) {
|
|
67
|
+
logger.warn({ file, error: e.message }, 'Failed to parse event');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async query(filter) {
|
|
73
|
+
const results = [];
|
|
74
|
+
const limit = filter.limit ?? 1000;
|
|
75
|
+
for (let i = this.memoryRing.length - 1; i >= 0; i--) {
|
|
76
|
+
const event = this.memoryRing[i];
|
|
77
|
+
if (this.matchesFilter(event, filter) && (!filter.filter || filter.filter(event))) {
|
|
78
|
+
results.push(event);
|
|
79
|
+
if (results.length >= limit)
|
|
80
|
+
return results;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (results.length < limit) {
|
|
84
|
+
await this.replay(filter, (event) => {
|
|
85
|
+
if (results.length >= limit)
|
|
86
|
+
return;
|
|
87
|
+
if (!filter.filter || filter.filter(event)) {
|
|
88
|
+
if (!results.find((r) => r.id === event.id))
|
|
89
|
+
results.push(event);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
return results.slice(0, limit);
|
|
94
|
+
}
|
|
95
|
+
async flush() { }
|
|
96
|
+
generateId() {
|
|
97
|
+
this.seq = (this.seq + 1) % 100000;
|
|
98
|
+
return `EVT-${Date.now()}-${this.seq.toString().padStart(5, '0')}`;
|
|
99
|
+
}
|
|
100
|
+
persist(event) {
|
|
101
|
+
const date = new Date(event.timestamp).toISOString().slice(0, 10);
|
|
102
|
+
const file = join(this.eventsDir, `${date}.jsonl`);
|
|
103
|
+
try {
|
|
104
|
+
appendFileSync(file, JSON.stringify(event) + '\n', 'utf-8');
|
|
105
|
+
}
|
|
106
|
+
catch (e) {
|
|
107
|
+
logger.error({ event: event.id, error: e.message }, 'Failed to persist event');
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
pushToRing(event) {
|
|
111
|
+
this.memoryRing.push(event);
|
|
112
|
+
if (this.memoryRing.length > this.maxRingSize)
|
|
113
|
+
this.memoryRing.shift();
|
|
114
|
+
}
|
|
115
|
+
dispatchAsync(event) { setImmediate(() => this.dispatchSync(event)); }
|
|
116
|
+
async dispatchSync(event) {
|
|
117
|
+
const handlers = [...(this.handlers.get(event.type) ?? []), ...(this.handlers.get('*') ?? [])];
|
|
118
|
+
for (const handler of handlers) {
|
|
119
|
+
try {
|
|
120
|
+
await handler(event);
|
|
121
|
+
}
|
|
122
|
+
catch (e) {
|
|
123
|
+
logger.error({ event: event.id, type: event.type, error: e.message }, 'Event handler threw');
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
getEventFiles(filter) {
|
|
128
|
+
if (!existsSync(this.eventsDir))
|
|
129
|
+
return [];
|
|
130
|
+
const all = readdirSync(this.eventsDir).filter((f) => f.endsWith('.jsonl')).sort();
|
|
131
|
+
if (!filter.fromTimestamp && !filter.toTimestamp)
|
|
132
|
+
return all.map((f) => join(this.eventsDir, f));
|
|
133
|
+
return all.filter((f) => {
|
|
134
|
+
const date = f.replace('.jsonl', '');
|
|
135
|
+
const fileStart = new Date(date).getTime();
|
|
136
|
+
const fileEnd = fileStart + 24 * 60 * 60 * 1000;
|
|
137
|
+
if (filter.fromTimestamp && fileEnd < filter.fromTimestamp)
|
|
138
|
+
return false;
|
|
139
|
+
if (filter.toTimestamp && fileStart > filter.toTimestamp)
|
|
140
|
+
return false;
|
|
141
|
+
return true;
|
|
142
|
+
}).map((f) => join(this.eventsDir, f));
|
|
143
|
+
}
|
|
144
|
+
matchesFilter(event, filter) {
|
|
145
|
+
if (filter.fromTimestamp && event.timestamp < filter.fromTimestamp)
|
|
146
|
+
return false;
|
|
147
|
+
if (filter.toTimestamp && event.timestamp > filter.toTimestamp)
|
|
148
|
+
return false;
|
|
149
|
+
if (filter.types && !filter.types.includes(event.type))
|
|
150
|
+
return false;
|
|
151
|
+
if (filter.sessionId && event.sessionId !== filter.sessionId)
|
|
152
|
+
return false;
|
|
153
|
+
if (filter.artifactId && event.artifactId !== filter.artifactId)
|
|
154
|
+
return false;
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=eventBus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventBus.js","sourceRoot":"","sources":["../../src/core/eventBus.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// SCALE Engine — Logger
|
|
2
|
+
import pino from 'pino';
|
|
3
|
+
export const logger = pino({
|
|
4
|
+
level: process.env.SCALE_LOG_LEVEL ?? 'info',
|
|
5
|
+
transport: process.env.NODE_ENV === 'production'
|
|
6
|
+
? undefined
|
|
7
|
+
: {
|
|
8
|
+
target: 'pino-pretty',
|
|
9
|
+
options: { colorize: true, translateTime: 'HH:MM:ss.l' },
|
|
10
|
+
},
|
|
11
|
+
});
|
|
12
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,MAAM;IAC5C,SAAS,EACP,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;QACnC,CAAC,CAAC,SAAS;QACX,CAAC,CAAC;YACE,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE;SACzD;CACR,CAAC,CAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { IEventBus } from '../core/eventBus.js';
|
|
2
|
+
export interface SessionMetrics {
|
|
3
|
+
sessionId: string;
|
|
4
|
+
duration: number;
|
|
5
|
+
toolCalls: number;
|
|
6
|
+
toolFailures: number;
|
|
7
|
+
bruteRetryCount: number;
|
|
8
|
+
blameShiftCount: number;
|
|
9
|
+
prematureDoneCount: number;
|
|
10
|
+
artifactsCreated: number;
|
|
11
|
+
rolesUsed: string[];
|
|
12
|
+
modelsUsed: Record<string, number>;
|
|
13
|
+
}
|
|
14
|
+
export interface IBehaviorTracker {
|
|
15
|
+
start(): void;
|
|
16
|
+
stop(): void;
|
|
17
|
+
getSessionMetrics(sessionId: string): Promise<SessionMetrics>;
|
|
18
|
+
detectPatterns(): Promise<unknown[]>;
|
|
19
|
+
}
|
|
20
|
+
export declare class BehaviorTracker implements IBehaviorTracker {
|
|
21
|
+
private eventBus;
|
|
22
|
+
private subs;
|
|
23
|
+
private metrics;
|
|
24
|
+
constructor(eventBus: IEventBus);
|
|
25
|
+
start(): void;
|
|
26
|
+
stop(): void;
|
|
27
|
+
getSessionMetrics(sessionId: string): Promise<SessionMetrics>;
|
|
28
|
+
detectPatterns(): Promise<unknown[]>;
|
|
29
|
+
private getOrCreate;
|
|
30
|
+
private createEmptyMetrics;
|
|
31
|
+
private onToolCalled;
|
|
32
|
+
private onToolFailed;
|
|
33
|
+
private onBruteRetry;
|
|
34
|
+
private onBlameShift;
|
|
35
|
+
private onPrematureDone;
|
|
36
|
+
private onArtifactCreated;
|
|
37
|
+
private onRoleActivated;
|
|
38
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// SCALE Engine — Behavior Tracker (W10 完整实现)
|
|
2
|
+
// 订阅事件流,统计指标,发现模式
|
|
3
|
+
// 设计参考:docs/03-CORE-MODULES.md §3.7
|
|
4
|
+
import { logger } from '../core/logger.js';
|
|
5
|
+
export class BehaviorTracker {
|
|
6
|
+
eventBus;
|
|
7
|
+
subs = [];
|
|
8
|
+
metrics = new Map();
|
|
9
|
+
constructor(eventBus) {
|
|
10
|
+
this.eventBus = eventBus;
|
|
11
|
+
}
|
|
12
|
+
start() {
|
|
13
|
+
this.subs.push(this.eventBus.on('tool.called', (e) => this.onToolCalled(e.sessionId, e.payload)), this.eventBus.on('tool.failed', (e) => this.onToolFailed(e.sessionId)), this.eventBus.on('behavior.brute_retry', (e) => this.onBruteRetry(e.sessionId)), this.eventBus.on('behavior.blame_shift', (e) => this.onBlameShift(e.sessionId)), this.eventBus.on('behavior.premature_done', (e) => this.onPrematureDone(e.sessionId)), this.eventBus.on('artifact.created', (e) => this.onArtifactCreated(e.sessionId)), this.eventBus.on('role.activated', (e) => this.onRoleActivated(e.sessionId, e.payload.role)));
|
|
14
|
+
logger.info('BehaviorTracker started');
|
|
15
|
+
}
|
|
16
|
+
stop() {
|
|
17
|
+
for (const sub of this.subs)
|
|
18
|
+
sub.unsubscribe();
|
|
19
|
+
this.subs = [];
|
|
20
|
+
}
|
|
21
|
+
async getSessionMetrics(sessionId) {
|
|
22
|
+
return this.metrics.get(sessionId) ?? this.createEmptyMetrics(sessionId);
|
|
23
|
+
}
|
|
24
|
+
async detectPatterns() {
|
|
25
|
+
// W10 实现
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
getOrCreate(sessionId) {
|
|
29
|
+
if (!this.metrics.has(sessionId))
|
|
30
|
+
this.metrics.set(sessionId, this.createEmptyMetrics(sessionId));
|
|
31
|
+
return this.metrics.get(sessionId);
|
|
32
|
+
}
|
|
33
|
+
createEmptyMetrics(sessionId) {
|
|
34
|
+
return {
|
|
35
|
+
sessionId, duration: 0, toolCalls: 0, toolFailures: 0,
|
|
36
|
+
bruteRetryCount: 0, blameShiftCount: 0, prematureDoneCount: 0,
|
|
37
|
+
artifactsCreated: 0, rolesUsed: [], modelsUsed: {},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
onToolCalled(sessionId, _payload) { this.getOrCreate(sessionId).toolCalls += 1; }
|
|
41
|
+
onToolFailed(sessionId) { this.getOrCreate(sessionId).toolFailures += 1; }
|
|
42
|
+
onBruteRetry(sessionId) { this.getOrCreate(sessionId).bruteRetryCount += 1; }
|
|
43
|
+
onBlameShift(sessionId) { this.getOrCreate(sessionId).blameShiftCount += 1; }
|
|
44
|
+
onPrematureDone(sessionId) { this.getOrCreate(sessionId).prematureDoneCount += 1; }
|
|
45
|
+
onArtifactCreated(sessionId) { this.getOrCreate(sessionId).artifactsCreated += 1; }
|
|
46
|
+
onRoleActivated(sessionId, role) {
|
|
47
|
+
const m = this.getOrCreate(sessionId);
|
|
48
|
+
if (!m.rolesUsed.includes(role))
|
|
49
|
+
m.rolesUsed.push(role);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=BehaviorTracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BehaviorTracker.js","sourceRoot":"","sources":["../../src/evolution/BehaviorTracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import type { IEventBus } from '../core/eventBus.js';
|
|
2
|
+
import type { IKnowledgeBase } from '../knowledge/KnowledgeBase.js';
|
|
3
|
+
import type { IArtifactStore } from '../artifact/store.js';
|
|
4
|
+
import type { ArtifactId, KnowledgeEntry } from '../artifact/types.js';
|
|
5
|
+
export interface ProposedRule {
|
|
6
|
+
id: string;
|
|
7
|
+
title: string;
|
|
8
|
+
description: string;
|
|
9
|
+
sourceLesson: string;
|
|
10
|
+
pattern: string;
|
|
11
|
+
enforcement: 'prompt' | 'hook';
|
|
12
|
+
createdAt: number;
|
|
13
|
+
approved: boolean;
|
|
14
|
+
approvedBy?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface GeneratedHook {
|
|
17
|
+
id: string;
|
|
18
|
+
ruleId: string;
|
|
19
|
+
hookType: 'PreToolUse' | 'PostToolUse' | 'Stop';
|
|
20
|
+
matcher: string;
|
|
21
|
+
scriptPath: string;
|
|
22
|
+
createdAt: number;
|
|
23
|
+
}
|
|
24
|
+
export interface EvolutionStats {
|
|
25
|
+
lessonsExtracted: number;
|
|
26
|
+
rulesProposed: number;
|
|
27
|
+
rulesApproved: number;
|
|
28
|
+
hooksGenerated: number;
|
|
29
|
+
}
|
|
30
|
+
export interface ILessonExtractor {
|
|
31
|
+
extract(defectId: ArtifactId): Promise<KnowledgeEntry | null>;
|
|
32
|
+
scanForPatterns(): Promise<KnowledgeEntry[]>;
|
|
33
|
+
}
|
|
34
|
+
export declare class LessonExtractor implements ILessonExtractor {
|
|
35
|
+
private store;
|
|
36
|
+
private kb;
|
|
37
|
+
private eventBus;
|
|
38
|
+
constructor(store: IArtifactStore, kb: IKnowledgeBase, eventBus: IEventBus);
|
|
39
|
+
/**
|
|
40
|
+
* 从已关闭的 Defect 中提取 Lesson
|
|
41
|
+
* Gate 1: Defect 必须在 DIAGNOSED/FIXED/CLOSED 状态
|
|
42
|
+
* Gate 2: 必须有 rootCauseCategory
|
|
43
|
+
* Gate 3: 不重复(标题相似度检查)
|
|
44
|
+
*/
|
|
45
|
+
extract(defectId: ArtifactId): Promise<KnowledgeEntry | null>;
|
|
46
|
+
/**
|
|
47
|
+
* 扫描所有已关闭的 Defect,批量提取 lessons
|
|
48
|
+
*/
|
|
49
|
+
scanForPatterns(): Promise<KnowledgeEntry[]>;
|
|
50
|
+
private similarity;
|
|
51
|
+
}
|
|
52
|
+
export interface IRuleProposer {
|
|
53
|
+
proposeFromLesson(lessonId: string): Promise<ProposedRule | null>;
|
|
54
|
+
scanAndPropose(): Promise<ProposedRule[]>;
|
|
55
|
+
approve(ruleId: string, approvedBy: string): Promise<ProposedRule>;
|
|
56
|
+
getProposedRules(): ProposedRule[];
|
|
57
|
+
writeRuleFile(rule: ProposedRule, rulesDir: string): string;
|
|
58
|
+
}
|
|
59
|
+
export declare class RuleProposer implements IRuleProposer {
|
|
60
|
+
private kb;
|
|
61
|
+
private eventBus;
|
|
62
|
+
private rules;
|
|
63
|
+
private seq;
|
|
64
|
+
constructor(kb: IKnowledgeBase, eventBus: IEventBus);
|
|
65
|
+
proposeFromLesson(lessonId: string): Promise<ProposedRule | null>;
|
|
66
|
+
scanAndPropose(): Promise<ProposedRule[]>;
|
|
67
|
+
approve(ruleId: string, approvedBy: string): Promise<ProposedRule>;
|
|
68
|
+
getProposedRules(): ProposedRule[];
|
|
69
|
+
writeRuleFile(rule: ProposedRule, rulesDir: string): string;
|
|
70
|
+
}
|
|
71
|
+
export interface IHookGenerator {
|
|
72
|
+
generate(rule: ProposedRule, hooksDir: string): GeneratedHook | null;
|
|
73
|
+
getGeneratedHooks(): GeneratedHook[];
|
|
74
|
+
}
|
|
75
|
+
export declare class HookGenerator implements IHookGenerator {
|
|
76
|
+
private eventBus;
|
|
77
|
+
private hooks;
|
|
78
|
+
constructor(eventBus: IEventBus);
|
|
79
|
+
generate(rule: ProposedRule, hooksDir: string): GeneratedHook | null;
|
|
80
|
+
getGeneratedHooks(): GeneratedHook[];
|
|
81
|
+
private inferHookType;
|
|
82
|
+
private inferMatcher;
|
|
83
|
+
}
|
|
84
|
+
export declare class EvolutionEngine {
|
|
85
|
+
private extractor;
|
|
86
|
+
private proposer;
|
|
87
|
+
private generator;
|
|
88
|
+
private scaleDir;
|
|
89
|
+
private eventBus;
|
|
90
|
+
constructor(extractor: ILessonExtractor, proposer: IRuleProposer, generator: IHookGenerator, eventBus: IEventBus, scaleDir?: string);
|
|
91
|
+
/**
|
|
92
|
+
* 完整进化周期:
|
|
93
|
+
* 1. 扫描 Defects → 提取 Lessons
|
|
94
|
+
* 2. 扫描 Lessons → 提议 Rules
|
|
95
|
+
* 3. (人审后) 已批准 Rules → 生成 Hooks
|
|
96
|
+
*/
|
|
97
|
+
runCycle(): Promise<EvolutionStats>;
|
|
98
|
+
getStats(): EvolutionStats;
|
|
99
|
+
}
|