@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.
Files changed (78) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +64 -0
  3. package/dist/adapters/ClaudeCodeAdapter.d.ts +48 -0
  4. package/dist/adapters/ClaudeCodeAdapter.js +188 -0
  5. package/dist/adapters/ClaudeCodeAdapter.js.map +1 -0
  6. package/dist/adapters/CodexAdapter.d.ts +14 -0
  7. package/dist/adapters/CodexAdapter.js +153 -0
  8. package/dist/adapters/CodexAdapter.js.map +1 -0
  9. package/dist/api/cli.d.ts +2 -0
  10. package/dist/api/cli.js +396 -0
  11. package/dist/api/cli.js.map +1 -0
  12. package/dist/api/doctor.d.ts +28 -0
  13. package/dist/api/doctor.js +182 -0
  14. package/dist/api/doctor.js.map +1 -0
  15. package/dist/api/mcp.d.ts +32 -0
  16. package/dist/api/mcp.js +227 -0
  17. package/dist/api/mcp.js.map +1 -0
  18. package/dist/artifact/fsm.d.ts +36 -0
  19. package/dist/artifact/fsm.js +199 -0
  20. package/dist/artifact/fsm.js.map +1 -0
  21. package/dist/artifact/fsmDefinitions.d.ts +18 -0
  22. package/dist/artifact/fsmDefinitions.js +243 -0
  23. package/dist/artifact/fsmDefinitions.js.map +1 -0
  24. package/dist/artifact/sqliteStore.d.ts +61 -0
  25. package/dist/artifact/sqliteStore.js +394 -0
  26. package/dist/artifact/sqliteStore.js.map +1 -0
  27. package/dist/artifact/store.d.ts +49 -0
  28. package/dist/artifact/store.js +118 -0
  29. package/dist/artifact/store.js.map +1 -0
  30. package/dist/artifact/types.d.ts +333 -0
  31. package/dist/artifact/types.js +50 -0
  32. package/dist/artifact/types.js.map +1 -0
  33. package/dist/context/ContextBuilder.d.ts +36 -0
  34. package/dist/context/ContextBuilder.js +53 -0
  35. package/dist/context/ContextBuilder.js.map +1 -0
  36. package/dist/core/container.d.ts +14 -0
  37. package/dist/core/container.js +33 -0
  38. package/dist/core/container.js.map +1 -0
  39. package/dist/core/eventBus.d.ts +60 -0
  40. package/dist/core/eventBus.js +158 -0
  41. package/dist/core/eventBus.js.map +1 -0
  42. package/dist/core/logger.d.ts +3 -0
  43. package/dist/core/logger.js +12 -0
  44. package/dist/core/logger.js.map +1 -0
  45. package/dist/evolution/BehaviorTracker.d.ts +38 -0
  46. package/dist/evolution/BehaviorTracker.js +52 -0
  47. package/dist/evolution/BehaviorTracker.js.map +1 -0
  48. package/dist/evolution/EvolutionEngine.d.ts +99 -0
  49. package/dist/evolution/EvolutionEngine.js +321 -0
  50. package/dist/evolution/EvolutionEngine.js.map +1 -0
  51. package/dist/guardrails/Gateway.d.ts +26 -0
  52. package/dist/guardrails/Gateway.js +57 -0
  53. package/dist/guardrails/Gateway.js.map +1 -0
  54. package/dist/guardrails/advancedDetectors.d.ts +26 -0
  55. package/dist/guardrails/advancedDetectors.js +138 -0
  56. package/dist/guardrails/advancedDetectors.js.map +1 -0
  57. package/dist/guardrails/detectors.d.ts +25 -0
  58. package/dist/guardrails/detectors.js +170 -0
  59. package/dist/guardrails/detectors.js.map +1 -0
  60. package/dist/guardrails/roles.d.ts +4 -0
  61. package/dist/guardrails/roles.js +54 -0
  62. package/dist/guardrails/roles.js.map +1 -0
  63. package/dist/index.d.ts +22 -0
  64. package/dist/index.js +22 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/knowledge/KnowledgeBase.d.ts +25 -0
  67. package/dist/knowledge/KnowledgeBase.js +81 -0
  68. package/dist/knowledge/KnowledgeBase.js.map +1 -0
  69. package/dist/orchestration/EffectsWiring.d.ts +8 -0
  70. package/dist/orchestration/EffectsWiring.js +87 -0
  71. package/dist/orchestration/EffectsWiring.js.map +1 -0
  72. package/dist/routing/ModelRouter.d.ts +30 -0
  73. package/dist/routing/ModelRouter.js +69 -0
  74. package/dist/routing/ModelRouter.js.map +1 -0
  75. package/dist/tasks/TaskEngine.d.ts +97 -0
  76. package/dist/tasks/TaskEngine.js +269 -0
  77. package/dist/tasks/TaskEngine.js.map +1 -0
  78. 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,3 @@
1
+ import pino from 'pino';
2
+ export declare const logger: pino.Logger<never, boolean>;
3
+ export type Logger = typeof logger;
@@ -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
+ }