@hongmaple0820/scale-engine 0.7.0 → 0.7.2
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 +31 -5
- package/dist/adapters/ClaudeCodeAdapter.js +4 -6
- package/dist/adapters/ClaudeCodeAdapter.js.map +1 -1
- package/dist/adapters/CodexAdapter.js +3 -5
- package/dist/adapters/CodexAdapter.js.map +1 -1
- package/dist/adapters/CursorAdapter.js +3 -5
- package/dist/adapters/CursorAdapter.js.map +1 -1
- package/dist/adapters/GeminiAdapter.js +3 -5
- package/dist/adapters/GeminiAdapter.js.map +1 -1
- package/dist/adapters/HermesAdapter.js +3 -5
- package/dist/adapters/HermesAdapter.js.map +1 -1
- package/dist/adapters/OpenClawAdapter.js +3 -5
- package/dist/adapters/OpenClawAdapter.js.map +1 -1
- package/dist/adapters/OpenCodeAdapter.js +3 -5
- package/dist/adapters/OpenCodeAdapter.js.map +1 -1
- package/dist/adapters/QCoderAdapter.js +3 -5
- package/dist/adapters/QCoderAdapter.js.map +1 -1
- package/dist/adapters/TraeAdapter.js +3 -5
- package/dist/adapters/TraeAdapter.js.map +1 -1
- package/dist/adapters/VSCAdapter.js +3 -5
- package/dist/adapters/VSCAdapter.js.map +1 -1
- package/dist/adapters/WorkBuddyAdapter.js +3 -5
- package/dist/adapters/WorkBuddyAdapter.js.map +1 -1
- package/dist/api/cli.js +58 -2
- package/dist/api/cli.js.map +1 -1
- package/dist/api/doctor.js +2 -0
- package/dist/api/doctor.js.map +1 -1
- package/dist/api/mcp.js +5 -0
- package/dist/api/mcp.js.map +1 -1
- package/dist/artifact/fsm.js +5 -3
- package/dist/artifact/fsm.js.map +1 -1
- package/dist/artifact/sqliteStore.js +14 -1
- package/dist/artifact/sqliteStore.js.map +1 -1
- package/dist/artifact/store.js +4 -2
- package/dist/artifact/store.js.map +1 -1
- package/dist/artifact/types.d.ts +1 -1
- package/dist/artifact/types.js +3 -0
- package/dist/artifact/types.js.map +1 -1
- package/dist/context/ContextBuilder.d.ts +4 -0
- package/dist/context/ContextBuilder.js +47 -10
- package/dist/context/ContextBuilder.js.map +1 -1
- package/dist/core/container.js +2 -4
- package/dist/core/container.js.map +1 -1
- package/dist/core/eventBus.js +6 -5
- package/dist/core/eventBus.js.map +1 -1
- package/dist/dashboard/DashboardServer.d.ts +80 -0
- package/dist/dashboard/DashboardServer.js +216 -0
- package/dist/dashboard/DashboardServer.js.map +1 -0
- package/dist/evolution/AutoDefectCreator.d.ts +34 -0
- package/dist/evolution/AutoDefectCreator.js +115 -0
- package/dist/evolution/AutoDefectCreator.js.map +1 -0
- package/dist/evolution/BehaviorTracker.d.ts +8 -0
- package/dist/evolution/BehaviorTracker.js +21 -3
- package/dist/evolution/BehaviorTracker.js.map +1 -1
- package/dist/evolution/EvolutionEngine.js +14 -3
- package/dist/evolution/EvolutionEngine.js.map +1 -1
- package/dist/evolution/EvolutionEvaluator.d.ts +59 -0
- package/dist/evolution/EvolutionEvaluator.js +115 -0
- package/dist/evolution/EvolutionEvaluator.js.map +1 -0
- package/dist/evolution/LessonValidator.d.ts +36 -0
- package/dist/evolution/LessonValidator.js +136 -0
- package/dist/evolution/LessonValidator.js.map +1 -0
- package/dist/fsm/FSMAgentBridge.d.ts +59 -0
- package/dist/fsm/FSMAgentBridge.js +195 -0
- package/dist/fsm/FSMAgentBridge.js.map +1 -0
- package/dist/fsm/index.d.ts +2 -0
- package/dist/fsm/index.js +3 -0
- package/dist/fsm/index.js.map +1 -0
- package/dist/guardrails/DetectorEnhanced.d.ts +111 -0
- package/dist/guardrails/DetectorEnhanced.js +200 -0
- package/dist/guardrails/DetectorEnhanced.js.map +1 -0
- package/dist/guardrails/Gateway.js +7 -6
- package/dist/guardrails/Gateway.js.map +1 -1
- package/dist/guardrails/advancedDetectors.js +31 -33
- package/dist/guardrails/advancedDetectors.js.map +1 -1
- package/dist/guardrails/detectors.js +14 -24
- package/dist/guardrails/detectors.js.map +1 -1
- package/dist/hooks/HookDeployer.d.ts +44 -0
- package/dist/hooks/HookDeployer.js +145 -0
- package/dist/hooks/HookDeployer.js.map +1 -0
- package/dist/hooks/HookGeneratorEnhanced.d.ts +67 -0
- package/dist/hooks/HookGeneratorEnhanced.js +238 -0
- package/dist/hooks/HookGeneratorEnhanced.js.map +1 -0
- package/dist/hooks/index.d.ts +4 -0
- package/dist/hooks/index.js +4 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.d.ts +25 -9
- package/dist/index.js +19 -10
- package/dist/index.js.map +1 -1
- package/dist/knowledge/KnowledgeBase.js +3 -2
- package/dist/knowledge/KnowledgeBase.js.map +1 -1
- package/dist/knowledge/SQLiteKnowledgeBase.js +3 -1
- package/dist/knowledge/SQLiteKnowledgeBase.js.map +1 -1
- package/dist/routing/ModelRouter.js +2 -0
- package/dist/routing/ModelRouter.js.map +1 -1
- package/dist/skills/SkillDiscovery.js +1 -0
- package/dist/skills/SkillDiscovery.js.map +1 -1
- package/dist/skills/SkillExecutor.d.ts +28 -0
- package/dist/skills/SkillExecutor.js +84 -0
- package/dist/skills/SkillExecutor.js.map +1 -0
- package/dist/skills/SkillRegistry.d.ts +93 -0
- package/dist/skills/SkillRegistry.js +130 -0
- package/dist/skills/SkillRegistry.js.map +1 -0
- package/dist/skills/TriggerEngine.d.ts +43 -0
- package/dist/skills/TriggerEngine.js +144 -0
- package/dist/skills/TriggerEngine.js.map +1 -0
- package/dist/skills/coreSkills.d.ts +6 -0
- package/dist/skills/coreSkills.js +41 -0
- package/dist/skills/coreSkills.js.map +1 -0
- package/dist/skills/index.d.ts +4 -0
- package/dist/skills/index.js +6 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/tasks/TaskEngine.js +5 -1
- package/dist/tasks/TaskEngine.js.map +1 -1
- package/dist/workflows/GateParser.d.ts +55 -0
- package/dist/workflows/GateParser.js +73 -0
- package/dist/workflows/GateParser.js.map +1 -0
- package/dist/workflows/WorkflowExecutor.d.ts +56 -0
- package/dist/workflows/WorkflowExecutor.js +145 -0
- package/dist/workflows/WorkflowExecutor.js.map +1 -0
- package/dist/workflows/index.d.ts +4 -0
- package/dist/workflows/index.js +5 -0
- package/dist/workflows/index.js.map +1 -0
- package/package.json +5 -2
- package/dist/agents/AgentManager.d.ts +0 -14
- package/dist/agents/AgentManager.js +0 -85
- package/dist/agents/AgentManager.js.map +0 -1
- package/dist/agents/IAgent.d.ts +0 -53
- package/dist/agents/IAgent.js +0 -4
- package/dist/agents/IAgent.js.map +0 -1
- package/dist/agents/definitions/debugger.d.ts +0 -2
- package/dist/agents/definitions/debugger.js +0 -6
- package/dist/agents/definitions/debugger.js.map +0 -1
- package/dist/agents/definitions/doc-writer.d.ts +0 -2
- package/dist/agents/definitions/doc-writer.js +0 -6
- package/dist/agents/definitions/doc-writer.js.map +0 -1
- package/dist/agents/definitions/implementer.d.ts +0 -2
- package/dist/agents/definitions/implementer.js +0 -6
- package/dist/agents/definitions/implementer.js.map +0 -1
- package/dist/agents/definitions/planner.d.ts +0 -2
- package/dist/agents/definitions/planner.js +0 -6
- package/dist/agents/definitions/planner.js.map +0 -1
- package/dist/agents/definitions/researcher.d.ts +0 -2
- package/dist/agents/definitions/researcher.js +0 -6
- package/dist/agents/definitions/researcher.js.map +0 -1
- package/dist/agents/definitions/reviewer.d.ts +0 -2
- package/dist/agents/definitions/reviewer.js +0 -6
- package/dist/agents/definitions/reviewer.js.map +0 -1
- package/dist/agents/definitions/security.d.ts +0 -2
- package/dist/agents/definitions/security.js +0 -6
- package/dist/agents/definitions/security.js.map +0 -1
- package/dist/agents/definitions/tester.d.ts +0 -2
- package/dist/agents/definitions/tester.js +0 -6
- package/dist/agents/definitions/tester.js.map +0 -1
- package/dist/agents/definitions${file}.d.ts +0 -1
- package/dist/agents/definitions${file}.js +0 -14
- package/dist/agents/definitions${file}.js.map +0 -1
- package/dist/agents/index.d.ts +0 -15
- package/dist/agents/index.js +0 -34
- package/dist/agents/index.js.map +0 -1
- package/dist/dashboard/index.d.ts +0 -2
- package/dist/dashboard/index.js +0 -2
- package/dist/dashboard/index.js.map +0 -1
- package/dist/dashboard/server.d.ts +0 -52
- package/dist/dashboard/server.js +0 -83
- package/dist/dashboard/server.js.map +0 -1
- package/dist/evolution/PatternExtractor.d.ts +0 -40
- package/dist/evolution/PatternExtractor.js +0 -83
- package/dist/evolution/PatternExtractor.js.map +0 -1
- package/dist/evolution/SkillCreator.d.ts +0 -40
- package/dist/evolution/SkillCreator.js +0 -118
- package/dist/evolution/SkillCreator.js.map +0 -1
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// SCALE Engine — Skill Executor (v0.7.0)
|
|
2
|
+
// 技能执行器:执行不同类型的技能
|
|
3
|
+
// import { logger } from "../core/logger.js" // unused - kept for future use
|
|
4
|
+
import { spawn } from "node:child_process";
|
|
5
|
+
export class SkillExecutor {
|
|
6
|
+
skillRegistry;
|
|
7
|
+
eventBus;
|
|
8
|
+
builtinFunctions = {};
|
|
9
|
+
constructor(skillRegistry, eventBus) {
|
|
10
|
+
this.skillRegistry = skillRegistry;
|
|
11
|
+
this.eventBus = eventBus;
|
|
12
|
+
this.registerDefaultBuiltinFunctions();
|
|
13
|
+
}
|
|
14
|
+
async execute(skillId, input) {
|
|
15
|
+
const skill = this.skillRegistry.get(skillId);
|
|
16
|
+
if (!skill)
|
|
17
|
+
return { skillId, type: "builtin-function", success: false, error: "Skill not found", durationMs: 0 };
|
|
18
|
+
const start = Date.now();
|
|
19
|
+
try {
|
|
20
|
+
let result;
|
|
21
|
+
switch (skill.execution.type) {
|
|
22
|
+
case "cli-command":
|
|
23
|
+
result = await this.executeCliCommand(skill.execution.config.command ?? "", input);
|
|
24
|
+
break;
|
|
25
|
+
case "builtin-function":
|
|
26
|
+
result = await this.executeBuiltinFunction(skill.execution.config.functionName ?? "", input);
|
|
27
|
+
break;
|
|
28
|
+
case "agent-delegate":
|
|
29
|
+
result = { skillId: "", type: "agent-delegate", success: true, output: { agentType: skill.execution.config.agentType }, durationMs: 0 };
|
|
30
|
+
break;
|
|
31
|
+
case "mcp-tool":
|
|
32
|
+
result = { skillId: "", type: "mcp-tool", success: true, output: { toolName: skill.execution.config.toolName }, durationMs: 0 };
|
|
33
|
+
break;
|
|
34
|
+
default: throw new Error("Unknown execution type");
|
|
35
|
+
}
|
|
36
|
+
result.skillId = skillId;
|
|
37
|
+
result.durationMs = Date.now() - start;
|
|
38
|
+
this.eventBus.emit("skill.executed", { skillId, success: result.success });
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
return { skillId, type: skill.execution.type, success: false, error: String(err), durationMs: Date.now() - start };
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async executeCliCommand(command, _parameters) {
|
|
46
|
+
try {
|
|
47
|
+
const output = await this.runCommand(command, 30000);
|
|
48
|
+
return { skillId: "", type: "cli-command", success: true, output, durationMs: 0 };
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
return { skillId: "", type: "cli-command", success: false, error: String(err), durationMs: 0 };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async executeBuiltinFunction(functionName, input) {
|
|
55
|
+
const fn = this.builtinFunctions[functionName];
|
|
56
|
+
if (!fn)
|
|
57
|
+
return { skillId: "", type: "builtin-function", success: false, error: "Function not found", durationMs: 0 };
|
|
58
|
+
try {
|
|
59
|
+
const output = await fn(input);
|
|
60
|
+
return { skillId: "", type: "builtin-function", success: true, output, durationMs: 0 };
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
return { skillId: "", type: "builtin-function", success: false, error: String(err), durationMs: 0 };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
registerBuiltinFunction(name, fn) {
|
|
67
|
+
this.builtinFunctions[name] = fn;
|
|
68
|
+
}
|
|
69
|
+
registerDefaultBuiltinFunctions() {
|
|
70
|
+
this.registerBuiltinFunction("tdd_check", async (_input) => ({ checked: true, hasTest: true }));
|
|
71
|
+
this.registerBuiltinFunction("debug_suggest", async (_input) => ({ suggestions: ["Check error message"] }));
|
|
72
|
+
this.registerBuiltinFunction("verify_status", async (_input) => ({ verified: true }));
|
|
73
|
+
}
|
|
74
|
+
runCommand(command, timeout) {
|
|
75
|
+
return new Promise((resolve, reject) => {
|
|
76
|
+
const proc = spawn("sh", ["-c", command], { timeout });
|
|
77
|
+
let stdout = "";
|
|
78
|
+
proc.stdout.on("data", (d) => stdout += d);
|
|
79
|
+
proc.on("close", (c) => c === 0 ? resolve(stdout) : reject(new Error("Command failed")));
|
|
80
|
+
proc.on("error", reject);
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=SkillExecutor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SkillExecutor.js","sourceRoot":"","sources":["../../src/skills/SkillExecutor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { IEventBus } from '../core/eventBus.js';
|
|
2
|
+
export type SkillDomain = 'context' | 'planning' | 'execution' | 'verification' | 'evolution' | 'deployment';
|
|
3
|
+
export type SkillExecutionType = 'cli-command' | 'agent-delegate' | 'mcp-tool' | 'skill-file' | 'builtin-function';
|
|
4
|
+
export type SkillTriggerType = 'taskType' | 'phase' | 'detectorTriggered' | 'complexity' | 'keyword' | 'manual' | 'artifactType' | 'artifactStatus';
|
|
5
|
+
export interface SkillTrigger {
|
|
6
|
+
type: SkillTriggerType;
|
|
7
|
+
value: string | string[];
|
|
8
|
+
weight: number;
|
|
9
|
+
}
|
|
10
|
+
export interface SkillExecution {
|
|
11
|
+
type: SkillExecutionType;
|
|
12
|
+
config: {
|
|
13
|
+
command?: string;
|
|
14
|
+
agentType?: string;
|
|
15
|
+
toolName?: string;
|
|
16
|
+
skillPath?: string;
|
|
17
|
+
functionName?: string;
|
|
18
|
+
parameters?: Record<string, unknown>;
|
|
19
|
+
};
|
|
20
|
+
timeout?: number;
|
|
21
|
+
retryPolicy?: {
|
|
22
|
+
maxRetries: number;
|
|
23
|
+
backoffMs: number;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export interface SkillDefinition {
|
|
27
|
+
id: string;
|
|
28
|
+
name: string;
|
|
29
|
+
description: string;
|
|
30
|
+
domain: SkillDomain;
|
|
31
|
+
triggers: SkillTrigger[];
|
|
32
|
+
execution: SkillExecution;
|
|
33
|
+
prerequisites?: string[];
|
|
34
|
+
conflicts?: string[];
|
|
35
|
+
priority: number;
|
|
36
|
+
installed: boolean;
|
|
37
|
+
installedAt?: number;
|
|
38
|
+
source?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface SkillRecommendation {
|
|
41
|
+
skillId: string;
|
|
42
|
+
priority: number;
|
|
43
|
+
reason: string;
|
|
44
|
+
triggeredBy: SkillTrigger[];
|
|
45
|
+
executionType: SkillExecutionType;
|
|
46
|
+
}
|
|
47
|
+
export interface SkillTriggerCondition {
|
|
48
|
+
taskType?: string;
|
|
49
|
+
phase?: 'explore' | 'plan' | 'implement' | 'verify' | 'evolve';
|
|
50
|
+
detectorTriggered?: string;
|
|
51
|
+
complexity?: 'simple' | 'medium' | 'complex';
|
|
52
|
+
keywords?: string[];
|
|
53
|
+
artifactType?: string;
|
|
54
|
+
artifactStatus?: string;
|
|
55
|
+
}
|
|
56
|
+
export interface ISkillRegistry {
|
|
57
|
+
register(skill: SkillDefinition): void;
|
|
58
|
+
unregister(skillId: string): void;
|
|
59
|
+
get(skillId: string): SkillDefinition | undefined;
|
|
60
|
+
listAll(domain?: SkillDomain): SkillDefinition[];
|
|
61
|
+
listInstalled(): SkillDefinition[];
|
|
62
|
+
recommend(context: SkillTriggerCondition): SkillRecommendation[];
|
|
63
|
+
evaluateTriggers(skill: SkillDefinition, context: SkillTriggerCondition): {
|
|
64
|
+
matched: SkillTrigger[];
|
|
65
|
+
score: number;
|
|
66
|
+
};
|
|
67
|
+
setInstalled(skillId: string, installed: boolean): void;
|
|
68
|
+
getDependencies(skillId: string): SkillDefinition[];
|
|
69
|
+
checkConflicts(skillId: string): string[];
|
|
70
|
+
}
|
|
71
|
+
export declare class SkillRegistry implements ISkillRegistry {
|
|
72
|
+
private skills;
|
|
73
|
+
private eventBus;
|
|
74
|
+
constructor(eventBus: IEventBus);
|
|
75
|
+
register(skill: SkillDefinition): void;
|
|
76
|
+
unregister(skillId: string): void;
|
|
77
|
+
get(skillId: string): SkillDefinition | undefined;
|
|
78
|
+
listAll(domain?: SkillDomain): SkillDefinition[];
|
|
79
|
+
listInstalled(): SkillDefinition[];
|
|
80
|
+
recommend(context: SkillTriggerCondition): SkillRecommendation[];
|
|
81
|
+
evaluateTriggers(skill: SkillDefinition, context: SkillTriggerCondition): {
|
|
82
|
+
matched: SkillTrigger[];
|
|
83
|
+
score: number;
|
|
84
|
+
};
|
|
85
|
+
setInstalled(skillId: string, installed: boolean): void;
|
|
86
|
+
getDependencies(skillId: string): SkillDefinition[];
|
|
87
|
+
checkConflicts(skillId: string): string[];
|
|
88
|
+
private matchesTrigger;
|
|
89
|
+
private calculatePriority;
|
|
90
|
+
private generateReason;
|
|
91
|
+
registerBatch(skills: SkillDefinition[]): void;
|
|
92
|
+
clear(): void;
|
|
93
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
// SCALE Engine — Skill Registry (v0.7.0)
|
|
2
|
+
// 技能注册表:存储、查询、推荐技能
|
|
3
|
+
import { logger } from '../core/logger.js';
|
|
4
|
+
// ============================================================================
|
|
5
|
+
// SkillRegistry Implementation
|
|
6
|
+
// ============================================================================
|
|
7
|
+
export class SkillRegistry {
|
|
8
|
+
skills = new Map();
|
|
9
|
+
eventBus;
|
|
10
|
+
constructor(eventBus) {
|
|
11
|
+
this.eventBus = eventBus;
|
|
12
|
+
}
|
|
13
|
+
register(skill) {
|
|
14
|
+
if (!skill.id || !skill.name || !skill.execution) {
|
|
15
|
+
throw new Error('Invalid skill definition: missing required fields');
|
|
16
|
+
}
|
|
17
|
+
if (this.skills.has(skill.id) && !skill.installed) {
|
|
18
|
+
logger.warn({ skillId: skill.id }, 'Skill already registered, skipping');
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
this.skills.set(skill.id, skill);
|
|
22
|
+
this.eventBus.emit('skill.registered', { skillId: skill.id, domain: skill.domain, installed: skill.installed });
|
|
23
|
+
logger.info({ skillId: skill.id, domain: skill.domain }, 'Skill registered');
|
|
24
|
+
}
|
|
25
|
+
unregister(skillId) {
|
|
26
|
+
const skill = this.skills.get(skillId);
|
|
27
|
+
if (!skill)
|
|
28
|
+
return;
|
|
29
|
+
this.skills.delete(skillId);
|
|
30
|
+
this.eventBus.emit('skill.unregistered', { skillId });
|
|
31
|
+
logger.info({ skillId }, 'Skill unregistered');
|
|
32
|
+
}
|
|
33
|
+
get(skillId) {
|
|
34
|
+
return this.skills.get(skillId);
|
|
35
|
+
}
|
|
36
|
+
listAll(domain) {
|
|
37
|
+
const all = [...this.skills.values()];
|
|
38
|
+
if (domain)
|
|
39
|
+
return all.filter(s => s.domain === domain);
|
|
40
|
+
return all.sort((a, b) => b.priority - a.priority);
|
|
41
|
+
}
|
|
42
|
+
listInstalled() {
|
|
43
|
+
return [...this.skills.values()].filter(s => s.installed).sort((a, b) => b.priority - a.priority);
|
|
44
|
+
}
|
|
45
|
+
recommend(context) {
|
|
46
|
+
const candidates = [];
|
|
47
|
+
for (const skill of this.skills.values()) {
|
|
48
|
+
if (!skill.installed)
|
|
49
|
+
continue;
|
|
50
|
+
const { matched, score } = this.evaluateTriggers(skill, context);
|
|
51
|
+
if (matched.length > 0 && score > 0.3) {
|
|
52
|
+
const priority = this.calculatePriority(skill, score, context);
|
|
53
|
+
candidates.push({
|
|
54
|
+
skillId: skill.id, priority, reason: this.generateReason(skill, matched),
|
|
55
|
+
triggeredBy: matched, executionType: skill.execution.type,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return candidates.sort((a, b) => b.priority - a.priority).slice(0, 5);
|
|
60
|
+
}
|
|
61
|
+
evaluateTriggers(skill, context) {
|
|
62
|
+
const matched = [];
|
|
63
|
+
let totalWeight = 0, matchedWeight = 0;
|
|
64
|
+
for (const trigger of skill.triggers) {
|
|
65
|
+
totalWeight += trigger.weight;
|
|
66
|
+
if (this.matchesTrigger(trigger, context)) {
|
|
67
|
+
matched.push(trigger);
|
|
68
|
+
matchedWeight += trigger.weight;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return { matched, score: totalWeight > 0 ? matchedWeight / totalWeight : 0 };
|
|
72
|
+
}
|
|
73
|
+
setInstalled(skillId, installed) {
|
|
74
|
+
const skill = this.skills.get(skillId);
|
|
75
|
+
if (!skill)
|
|
76
|
+
return;
|
|
77
|
+
skill.installed = installed;
|
|
78
|
+
skill.installedAt = installed ? Date.now() : undefined;
|
|
79
|
+
this.eventBus.emit('skill.installation_changed', { skillId, installed });
|
|
80
|
+
}
|
|
81
|
+
getDependencies(skillId) {
|
|
82
|
+
const skill = this.skills.get(skillId);
|
|
83
|
+
if (!skill?.prerequisites)
|
|
84
|
+
return [];
|
|
85
|
+
return skill.prerequisites.map(id => this.skills.get(id)).filter(Boolean);
|
|
86
|
+
}
|
|
87
|
+
checkConflicts(skillId) {
|
|
88
|
+
const skill = this.skills.get(skillId);
|
|
89
|
+
if (!skill?.conflicts)
|
|
90
|
+
return [];
|
|
91
|
+
return skill.conflicts.filter(id => this.skills.get(id)?.installed);
|
|
92
|
+
}
|
|
93
|
+
matchesTrigger(trigger, context) {
|
|
94
|
+
switch (trigger.type) {
|
|
95
|
+
case 'taskType':
|
|
96
|
+
return context.taskType === trigger.value || (Array.isArray(trigger.value) && trigger.value.includes(context.taskType ?? ''));
|
|
97
|
+
case 'phase': return context.phase === trigger.value;
|
|
98
|
+
case 'detectorTriggered':
|
|
99
|
+
return context.detectorTriggered === trigger.value || (Array.isArray(trigger.value) && trigger.value.includes(context.detectorTriggered ?? ''));
|
|
100
|
+
case 'complexity': return context.complexity === trigger.value;
|
|
101
|
+
case 'keyword':
|
|
102
|
+
if (!context.keywords)
|
|
103
|
+
return false;
|
|
104
|
+
const triggerKeywords = Array.isArray(trigger.value) ? trigger.value : [trigger.value];
|
|
105
|
+
return triggerKeywords.some(k => context.keywords.some(ck => ck.toLowerCase().includes(k.toLowerCase())));
|
|
106
|
+
case 'manual': return false;
|
|
107
|
+
default: return false;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
calculatePriority(skill, triggerScore, context) {
|
|
111
|
+
let priority = skill.priority + triggerScore * 30;
|
|
112
|
+
if (context.complexity === 'complex' && skill.domain === 'planning')
|
|
113
|
+
priority += 10;
|
|
114
|
+
if (context.phase === 'verify' && skill.domain === 'verification')
|
|
115
|
+
priority += 15;
|
|
116
|
+
if (context.phase === 'implement' && skill.domain === 'execution')
|
|
117
|
+
priority += 15;
|
|
118
|
+
if (context.detectorTriggered && skill.domain === 'verification')
|
|
119
|
+
priority += 20;
|
|
120
|
+
return Math.min(100, Math.max(0, priority));
|
|
121
|
+
}
|
|
122
|
+
generateReason(skill, matched) {
|
|
123
|
+
const triggerNames = matched.map(t => t.type).join(', ');
|
|
124
|
+
return matched.length === 1 ? `${skill.name} 触发条件匹配: ${triggerNames}` : `${skill.name} 多条件匹配: ${triggerNames} (${matched.length} 个触发器)`;
|
|
125
|
+
}
|
|
126
|
+
registerBatch(skills) { for (const skill of skills)
|
|
127
|
+
this.register(skill); }
|
|
128
|
+
clear() { this.skills.clear(); this.eventBus.emit('skills.cleared', { clearedAt: Date.now() }); }
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=SkillRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SkillRegistry.js","sourceRoot":"","sources":["../../src/skills/SkillRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { IEventBus } from '../core/eventBus.js';
|
|
2
|
+
import type { ISkillRegistry, SkillTriggerCondition, SkillRecommendation } from './SkillRegistry.js';
|
|
3
|
+
export interface TriggerEvent {
|
|
4
|
+
type: 'tool_used' | 'artifact_created' | 'artifact_transitioned' | 'detector_triggered' | 'phase_changed' | 'error_occurred';
|
|
5
|
+
payload: Record<string, unknown>;
|
|
6
|
+
sessionId: string;
|
|
7
|
+
timestamp: number;
|
|
8
|
+
}
|
|
9
|
+
export interface ITriggerEngine {
|
|
10
|
+
start(): void;
|
|
11
|
+
stop(): void;
|
|
12
|
+
subscribe(eventType: string, handler: (event: TriggerEvent) => void): void;
|
|
13
|
+
emit(event: TriggerEvent): void;
|
|
14
|
+
triggerSkillRecommendation(context: SkillTriggerCondition): Promise<SkillRecommendation[]>;
|
|
15
|
+
injectRecommendationToContext(sessionId: string, recommendations: SkillRecommendation[]): void;
|
|
16
|
+
updateSessionContext(sessionId: string, updates: Partial<SkillTriggerCondition>): void;
|
|
17
|
+
getSessionContext(sessionId: string): SkillTriggerCondition | undefined;
|
|
18
|
+
}
|
|
19
|
+
export declare class TriggerEngine implements ITriggerEngine {
|
|
20
|
+
private eventBus;
|
|
21
|
+
private skillRegistry;
|
|
22
|
+
private subscriptions;
|
|
23
|
+
private sessionContexts;
|
|
24
|
+
private running;
|
|
25
|
+
constructor(eventBus: IEventBus, skillRegistry: ISkillRegistry);
|
|
26
|
+
start(): void;
|
|
27
|
+
stop(): void;
|
|
28
|
+
subscribe(eventType: string, handler: (event: TriggerEvent) => void): void;
|
|
29
|
+
emit(event: TriggerEvent): void;
|
|
30
|
+
triggerSkillRecommendation(context: SkillTriggerCondition): Promise<SkillRecommendation[]>;
|
|
31
|
+
injectRecommendationToContext(sessionId: string, recommendations: SkillRecommendation[]): void;
|
|
32
|
+
private handleToolUsed;
|
|
33
|
+
private handleArtifactCreated;
|
|
34
|
+
private handleArtifactTransitioned;
|
|
35
|
+
private handleDetectorTriggered;
|
|
36
|
+
private triggerAndInject;
|
|
37
|
+
private formatRecommendationBlock;
|
|
38
|
+
private extractKeywords;
|
|
39
|
+
private mapArtifactToTask;
|
|
40
|
+
private mapStatusToPhase;
|
|
41
|
+
updateSessionContext(sessionId: string, updates: Partial<SkillTriggerCondition>): void;
|
|
42
|
+
getSessionContext(sessionId: string): SkillTriggerCondition | undefined;
|
|
43
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
// SCALE Engine — Trigger Engine (v0.7.0)
|
|
2
|
+
// 技能触发引擎:监听事件,触发技能推荐
|
|
3
|
+
import { logger } from '../core/logger.js';
|
|
4
|
+
export class TriggerEngine {
|
|
5
|
+
eventBus;
|
|
6
|
+
skillRegistry;
|
|
7
|
+
subscriptions = new Map();
|
|
8
|
+
sessionContexts = new Map();
|
|
9
|
+
running = false;
|
|
10
|
+
constructor(eventBus, skillRegistry) {
|
|
11
|
+
this.eventBus = eventBus;
|
|
12
|
+
this.skillRegistry = skillRegistry;
|
|
13
|
+
}
|
|
14
|
+
start() {
|
|
15
|
+
if (this.running)
|
|
16
|
+
return;
|
|
17
|
+
this.running = true;
|
|
18
|
+
this.eventBus.on('tool.used', (e) => this.handleToolUsed(e.payload));
|
|
19
|
+
this.eventBus.on('artifact.created', (e) => this.handleArtifactCreated(e.payload));
|
|
20
|
+
this.eventBus.on('artifact.transitioned', (e) => this.handleArtifactTransitioned(e.payload));
|
|
21
|
+
this.eventBus.on('detector.triggered', (e) => this.handleDetectorTriggered(e.payload));
|
|
22
|
+
logger.info('TriggerEngine started');
|
|
23
|
+
}
|
|
24
|
+
stop() {
|
|
25
|
+
this.running = false;
|
|
26
|
+
this.subscriptions.clear();
|
|
27
|
+
this.sessionContexts.clear();
|
|
28
|
+
logger.info('TriggerEngine stopped');
|
|
29
|
+
}
|
|
30
|
+
subscribe(eventType, handler) {
|
|
31
|
+
const subs = this.subscriptions.get(eventType) ?? [];
|
|
32
|
+
subs.push(handler);
|
|
33
|
+
this.subscriptions.set(eventType, subs);
|
|
34
|
+
}
|
|
35
|
+
emit(event) {
|
|
36
|
+
const subs = this.subscriptions.get(event.type);
|
|
37
|
+
if (!subs)
|
|
38
|
+
return;
|
|
39
|
+
for (const handler of subs) {
|
|
40
|
+
try {
|
|
41
|
+
handler(event);
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
logger.error({ err }, 'Trigger handler error');
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async triggerSkillRecommendation(context) {
|
|
49
|
+
const recommendations = this.skillRegistry.recommend(context);
|
|
50
|
+
if (recommendations.length > 0) {
|
|
51
|
+
logger.info({ count: recommendations.length, topSkill: recommendations[0]?.skillId }, 'Skills recommended');
|
|
52
|
+
this.eventBus.emit('skill.recommended', { recommendations, context });
|
|
53
|
+
}
|
|
54
|
+
return recommendations;
|
|
55
|
+
}
|
|
56
|
+
injectRecommendationToContext(sessionId, recommendations) {
|
|
57
|
+
if (recommendations.length === 0)
|
|
58
|
+
return;
|
|
59
|
+
const block = this.formatRecommendationBlock(recommendations);
|
|
60
|
+
this.eventBus.emit('context.inject', { sessionId, block, type: 'skill_recommendations' });
|
|
61
|
+
}
|
|
62
|
+
handleToolUsed(data) {
|
|
63
|
+
const sessionId = data.sessionId ?? 'default';
|
|
64
|
+
const tool = data.tool;
|
|
65
|
+
const context = this.sessionContexts.get(sessionId) ?? {};
|
|
66
|
+
if (tool === 'Bash') {
|
|
67
|
+
const cmd = (data.args?.command) ?? '';
|
|
68
|
+
context.keywords = this.extractKeywords(cmd);
|
|
69
|
+
}
|
|
70
|
+
this.sessionContexts.set(sessionId, context);
|
|
71
|
+
this.emit({ type: 'tool_used', payload: { tool }, sessionId, timestamp: Date.now() });
|
|
72
|
+
this.triggerAndInject(sessionId, context);
|
|
73
|
+
}
|
|
74
|
+
handleArtifactCreated(data) {
|
|
75
|
+
const sessionId = data.sessionId ?? 'default';
|
|
76
|
+
const artifactType = data.type;
|
|
77
|
+
const context = this.sessionContexts.get(sessionId) ?? {};
|
|
78
|
+
context.artifactType = artifactType;
|
|
79
|
+
context.taskType = this.mapArtifactToTask(artifactType);
|
|
80
|
+
this.sessionContexts.set(sessionId, context);
|
|
81
|
+
this.emit({ type: 'artifact_created', payload: { artifactId: data.id, type: artifactType }, sessionId, timestamp: Date.now() });
|
|
82
|
+
this.triggerAndInject(sessionId, context);
|
|
83
|
+
}
|
|
84
|
+
handleArtifactTransitioned(data) {
|
|
85
|
+
const sessionId = data.sessionId ?? 'default';
|
|
86
|
+
const newStatus = data.newStatus;
|
|
87
|
+
const context = this.sessionContexts.get(sessionId) ?? {};
|
|
88
|
+
context.artifactStatus = newStatus;
|
|
89
|
+
context.phase = this.mapStatusToPhase(newStatus);
|
|
90
|
+
this.sessionContexts.set(sessionId, context);
|
|
91
|
+
this.emit({ type: 'artifact_transitioned', payload: { artifactId: data.id, newStatus }, sessionId, timestamp: Date.now() });
|
|
92
|
+
this.triggerAndInject(sessionId, context);
|
|
93
|
+
}
|
|
94
|
+
handleDetectorTriggered(data) {
|
|
95
|
+
const sessionId = data.sessionId ?? 'default';
|
|
96
|
+
const detector = data.detector;
|
|
97
|
+
const context = this.sessionContexts.get(sessionId) ?? {};
|
|
98
|
+
context.detectorTriggered = detector;
|
|
99
|
+
this.sessionContexts.set(sessionId, context);
|
|
100
|
+
this.emit({ type: 'detector_triggered', payload: { detector }, sessionId, timestamp: Date.now() });
|
|
101
|
+
this.triggerAndInject(sessionId, context);
|
|
102
|
+
}
|
|
103
|
+
async triggerAndInject(sessionId, context) {
|
|
104
|
+
const recommendations = await this.triggerSkillRecommendation(context);
|
|
105
|
+
this.injectRecommendationToContext(sessionId, recommendations);
|
|
106
|
+
}
|
|
107
|
+
formatRecommendationBlock(recommendations) {
|
|
108
|
+
const lines = recommendations.map((r, i) => `${i + 1}. **${r.skillId}** (priority ${r.priority}) - ${r.reason}`);
|
|
109
|
+
return `\n## Recommended Skills\n\n${lines.join('\n')}\n`;
|
|
110
|
+
}
|
|
111
|
+
extractKeywords(cmd) {
|
|
112
|
+
const keywords = [];
|
|
113
|
+
if (/test|spec|verify/i.test(cmd))
|
|
114
|
+
keywords.push('test');
|
|
115
|
+
if (/build|compile|make/i.test(cmd))
|
|
116
|
+
keywords.push('build');
|
|
117
|
+
if (/lint|check|audit/i.test(cmd))
|
|
118
|
+
keywords.push('lint');
|
|
119
|
+
if (/fix|bug|error|issue/i.test(cmd))
|
|
120
|
+
keywords.push('bug-fix');
|
|
121
|
+
if (/refactor|clean|optimize/i.test(cmd))
|
|
122
|
+
keywords.push('refactor');
|
|
123
|
+
if (/add|create|new|implement/i.test(cmd))
|
|
124
|
+
keywords.push('feature');
|
|
125
|
+
return keywords;
|
|
126
|
+
}
|
|
127
|
+
mapArtifactToTask(type) {
|
|
128
|
+
const map = { Spec: 'planning', Plan: 'planning', Task: 'execution', Change: 'execution', Defect: 'bug-fix', Evidence: 'verification', Lesson: 'evolution' };
|
|
129
|
+
return map[type] ?? 'unknown';
|
|
130
|
+
}
|
|
131
|
+
mapStatusToPhase(status) {
|
|
132
|
+
const map = { DRAFT: 'plan', REVIEWING: 'plan', FROZEN: 'plan', APPROVED: 'implement', IN_PROGRESS: 'implement', BLOCKED: 'implement', DONE: 'verify', CLOSED: 'evolve' };
|
|
133
|
+
return map[status] ?? 'explore';
|
|
134
|
+
}
|
|
135
|
+
updateSessionContext(sessionId, updates) {
|
|
136
|
+
const ctx = this.sessionContexts.get(sessionId) ?? {};
|
|
137
|
+
Object.assign(ctx, updates);
|
|
138
|
+
this.sessionContexts.set(sessionId, ctx);
|
|
139
|
+
}
|
|
140
|
+
getSessionContext(sessionId) {
|
|
141
|
+
return this.sessionContexts.get(sessionId);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=TriggerEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TriggerEngine.js","sourceRoot":"","sources":["../../src/skills/TriggerEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { SkillDefinition } from "./SkillRegistry.js";
|
|
2
|
+
export declare const CORE_SKILLS: SkillDefinition[];
|
|
3
|
+
export declare function getCoreSkill(id: string): SkillDefinition | undefined;
|
|
4
|
+
export declare function registerCoreSkills(registry: {
|
|
5
|
+
registerBatch: (skills: SkillDefinition[]) => void;
|
|
6
|
+
}): void;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// SCALE Engine — Core Skills (v0.7.0)
|
|
2
|
+
// 10 个内置技能定义
|
|
3
|
+
export const CORE_SKILLS = [
|
|
4
|
+
{ id: "brainstorming", name: "Brainstorming", description: "需求精炼与方案探索", domain: "planning",
|
|
5
|
+
triggers: [{ type: "taskType", value: "feature", weight: 0.8 }, { type: "phase", value: "plan", weight: 0.9 }],
|
|
6
|
+
execution: { type: "agent-delegate", config: { agentType: "planner" } }, priority: 80, installed: true },
|
|
7
|
+
{ id: "tdd-guide", name: "TDD Guide", description: "测试驱动开发指导", domain: "execution",
|
|
8
|
+
triggers: [{ type: "taskType", value: ["feature", "bug-fix"], weight: 0.7 }, { type: "phase", value: "implement", weight: 0.8 }],
|
|
9
|
+
execution: { type: "builtin-function", config: { functionName: "tdd_check" } }, priority: 75, installed: true },
|
|
10
|
+
{ id: "systematic-debugging", name: "Systematic Debugging", description: "系统性调试", domain: "verification",
|
|
11
|
+
triggers: [{ type: "detectorTriggered", value: "brute-retry", weight: 0.9 }, { type: "keyword", value: ["bug", "error", "fix"], weight: 0.6 }],
|
|
12
|
+
execution: { type: "agent-delegate", config: { agentType: "debugger" } }, priority: 85, installed: true },
|
|
13
|
+
{ id: "code-review", name: "Code Review", description: "代码审查", domain: "verification",
|
|
14
|
+
triggers: [{ type: "phase", value: "verify", weight: 0.8 }, { type: "artifactStatus", value: "DONE", weight: 0.7 }],
|
|
15
|
+
execution: { type: "agent-delegate", config: { agentType: "reviewer" } }, priority: 70, installed: true },
|
|
16
|
+
{ id: "security-review", name: "Security Review", description: "安全审查", domain: "verification",
|
|
17
|
+
triggers: [{ type: "keyword", value: ["auth", "payment", "credential"], weight: 0.9 }],
|
|
18
|
+
execution: { type: "agent-delegate", config: { agentType: "security-reviewer" } }, priority: 90, installed: true },
|
|
19
|
+
{ id: "verification", name: "Verification Gate", description: "验证门控", domain: "verification",
|
|
20
|
+
triggers: [{ type: "phase", value: "verify", weight: 0.9 }],
|
|
21
|
+
execution: { type: "builtin-function", config: { functionName: "verify_status" } }, priority: 65, installed: true },
|
|
22
|
+
{ id: "lesson-extractor", name: "Lesson Extractor", description: "经验提取", domain: "evolution",
|
|
23
|
+
triggers: [{ type: "phase", value: "evolve", weight: 0.9 }, { type: "artifactType", value: "Defect", weight: 0.8 }],
|
|
24
|
+
execution: { type: "cli-command", config: { command: "scale evolve" } }, priority: 60, installed: true },
|
|
25
|
+
{ id: "context-builder", name: "Context Builder", description: "上下文构建", domain: "context",
|
|
26
|
+
triggers: [{ type: "complexity", value: "complex", weight: 0.7 }],
|
|
27
|
+
execution: { type: "cli-command", config: { command: "scale context build" } }, priority: 55, installed: true },
|
|
28
|
+
{ id: "workflow-guide", name: "Workflow Guide", description: "工作流指导", domain: "planning",
|
|
29
|
+
triggers: [{ type: "taskType", value: "planning", weight: 0.8 }],
|
|
30
|
+
execution: { type: "cli-command", config: { command: "scale workflow start" } }, priority: 50, installed: true },
|
|
31
|
+
{ id: "fsm-check", name: "FSM Status Check", description: "FSM状态检查", domain: "execution",
|
|
32
|
+
triggers: [{ type: "keyword", value: ["approve", "complete", "transition"], weight: 0.6 }],
|
|
33
|
+
execution: { type: "cli-command", config: { command: "scale fsm status" } }, priority: 45, installed: true },
|
|
34
|
+
];
|
|
35
|
+
export function getCoreSkill(id) {
|
|
36
|
+
return CORE_SKILLS.find(s => s.id === id);
|
|
37
|
+
}
|
|
38
|
+
export function registerCoreSkills(registry) {
|
|
39
|
+
registry.registerBatch(CORE_SKILLS);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=coreSkills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coreSkills.js","sourceRoot":"","sources":["../../src/skills/coreSkills.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,aAAa;AAIb,MAAM,CAAC,MAAM,WAAW,GAAsB;IAC5C,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU;QACxF,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAC9G,SAAS,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;IAE1G,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW;QAChF,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAChI,SAAS,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;IAEjH,EAAE,EAAE,EAAE,sBAAsB,EAAE,IAAI,EAAE,sBAAsB,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc;QACtG,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAC9I,SAAS,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;IAE3G,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc;QACnF,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QACnH,SAAS,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;IAE3G,EAAE,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc;QAC3F,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QACtF,SAAS,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,mBAAmB,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;IAEpH,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc;QAC1F,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAC3D,SAAS,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,eAAe,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;IAErH,EAAE,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW;QAC1F,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QACnH,SAAS,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;IAE1G,EAAE,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS;QACvF,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QACjE,SAAS,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;IAEjH,EAAE,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,gBAAgB,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU;QACtF,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAChE,SAAS,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,sBAAsB,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;IAElH,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,kBAAkB,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW;QACtF,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAC1F,SAAS,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;CAC/G,CAAA;AAED,MAAM,UAAU,YAAY,CAAC,EAAU;IACrC,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;AAC3C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAgE;IACjG,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAC,CAAA;AACrC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { SkillRegistry, type ISkillRegistry, type SkillDefinition, type SkillTrigger, type SkillExecution, type SkillRecommendation, type SkillTriggerCondition, type SkillDomain, type SkillExecutionType } from "./SkillRegistry.js";
|
|
2
|
+
export { TriggerEngine, type ITriggerEngine, type TriggerEvent } from "./TriggerEngine.js";
|
|
3
|
+
export { SkillExecutor, type ISkillExecutor, type SkillExecutionResult } from "./SkillExecutor.js";
|
|
4
|
+
export { CORE_SKILLS, getCoreSkill, registerCoreSkills } from "./coreSkills.js";
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// SCALE Engine — Skills Module Index (v0.7.0)
|
|
2
|
+
export { SkillRegistry } from "./SkillRegistry.js";
|
|
3
|
+
export { TriggerEngine } from "./TriggerEngine.js";
|
|
4
|
+
export { SkillExecutor } from "./SkillExecutor.js";
|
|
5
|
+
export { CORE_SKILLS, getCoreSkill, registerCoreSkills } from "./coreSkills.js";
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAE9C,OAAO,EAAE,aAAa,EAAsL,MAAM,oBAAoB,CAAA;AACtO,OAAO,EAAE,aAAa,EAA0C,MAAM,oBAAoB,CAAA;AAC1F,OAAO,EAAE,aAAa,EAAkD,MAAM,oBAAoB,CAAA;AAClG,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA"}
|
package/dist/tasks/TaskEngine.js
CHANGED
|
@@ -11,11 +11,15 @@ const MAX_STEP_TIMEOUT = 30 * 60 * 1000; // 30 minutes
|
|
|
11
11
|
// TaskEngine
|
|
12
12
|
// ============================================================================
|
|
13
13
|
export class TaskEngine {
|
|
14
|
+
store;
|
|
15
|
+
fsm;
|
|
16
|
+
eventBus;
|
|
17
|
+
runtimes = new Map();
|
|
18
|
+
checkpointsDir;
|
|
14
19
|
constructor(store, fsm, eventBus, opts = {}) {
|
|
15
20
|
this.store = store;
|
|
16
21
|
this.fsm = fsm;
|
|
17
22
|
this.eventBus = eventBus;
|
|
18
|
-
this.runtimes = new Map();
|
|
19
23
|
this.checkpointsDir = opts.checkpointsDir ?? '.scale/checkpoints';
|
|
20
24
|
if (!existsSync(this.checkpointsDir))
|
|
21
25
|
mkdirSync(this.checkpointsDir, { recursive: true });
|