@hongmaple0820/scale-engine 0.5.0 → 0.6.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 -15
- package/README.md +35 -7
- package/dist/adapters/CodexAdapter.js +28 -28
- package/dist/api/cli.js +6 -5
- package/dist/api/cli.js.map +1 -1
- package/dist/artifact/fsm.d.ts +5 -0
- package/dist/artifact/fsm.js +24 -0
- package/dist/artifact/fsm.js.map +1 -1
- package/dist/artifact/sqliteStore.js +89 -89
- package/dist/evolution/EvolutionEngine.js +31 -31
- package/dist/guardrails/advancedDetectors.d.ts +12 -0
- package/dist/guardrails/advancedDetectors.js +50 -2
- package/dist/guardrails/advancedDetectors.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/knowledge/SQLiteKnowledgeBase.d.ts +28 -0
- package/dist/knowledge/SQLiteKnowledgeBase.js +177 -0
- package/dist/knowledge/SQLiteKnowledgeBase.js.map +1 -0
- package/dist/tasks/TaskEngine.js +24 -0
- package/dist/tasks/TaskEngine.js.map +1 -1
- package/package.json +8 -2
|
@@ -17,67 +17,67 @@ import { dirname, join } from 'node:path';
|
|
|
17
17
|
// ============================================================================
|
|
18
18
|
// Schema DDL
|
|
19
19
|
// ============================================================================
|
|
20
|
-
const SCHEMA_DDL = `
|
|
21
|
-
-- Artifacts 主表
|
|
22
|
-
CREATE TABLE IF NOT EXISTS artifacts (
|
|
23
|
-
id TEXT PRIMARY KEY,
|
|
24
|
-
type TEXT NOT NULL,
|
|
25
|
-
version INTEGER NOT NULL DEFAULT 1,
|
|
26
|
-
status TEXT NOT NULL DEFAULT 'DRAFT',
|
|
27
|
-
status_history TEXT NOT NULL DEFAULT '[]', -- JSON array of StatusChange
|
|
28
|
-
parents TEXT NOT NULL DEFAULT '[]', -- JSON array of ArtifactId
|
|
29
|
-
children TEXT NOT NULL DEFAULT '[]', -- JSON array of ArtifactId
|
|
30
|
-
supersedes TEXT,
|
|
31
|
-
title TEXT NOT NULL,
|
|
32
|
-
content_ref TEXT NOT NULL DEFAULT '',
|
|
33
|
-
payload TEXT NOT NULL DEFAULT '{}', -- JSON
|
|
34
|
-
gates TEXT NOT NULL DEFAULT '[]', -- JSON array of Gate
|
|
35
|
-
created_by TEXT NOT NULL DEFAULT '{}', -- JSON Actor
|
|
36
|
-
created_at INTEGER NOT NULL,
|
|
37
|
-
updated_at INTEGER NOT NULL,
|
|
38
|
-
closed_at INTEGER,
|
|
39
|
-
tags TEXT NOT NULL DEFAULT '[]', -- JSON array
|
|
40
|
-
labels TEXT NOT NULL DEFAULT '{}' -- JSON object
|
|
41
|
-
);
|
|
42
|
-
|
|
43
|
-
CREATE INDEX IF NOT EXISTS idx_artifacts_type ON artifacts(type);
|
|
44
|
-
CREATE INDEX IF NOT EXISTS idx_artifacts_status ON artifacts(status);
|
|
45
|
-
CREATE INDEX IF NOT EXISTS idx_artifacts_created_at ON artifacts(created_at);
|
|
46
|
-
|
|
47
|
-
-- Events 表(事件溯源的持久化副本)
|
|
48
|
-
CREATE TABLE IF NOT EXISTS events (
|
|
49
|
-
id TEXT PRIMARY KEY,
|
|
50
|
-
type TEXT NOT NULL,
|
|
51
|
-
timestamp INTEGER NOT NULL,
|
|
52
|
-
session_id TEXT,
|
|
53
|
-
artifact_id TEXT,
|
|
54
|
-
actor TEXT DEFAULT '{}',
|
|
55
|
-
payload TEXT NOT NULL DEFAULT '{}',
|
|
56
|
-
metadata TEXT DEFAULT '{}'
|
|
57
|
-
);
|
|
58
|
-
|
|
59
|
-
CREATE INDEX IF NOT EXISTS idx_events_type ON events(type);
|
|
60
|
-
CREATE INDEX IF NOT EXISTS idx_events_artifact_id ON events(artifact_id);
|
|
61
|
-
CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp);
|
|
62
|
-
|
|
63
|
-
-- Artifact 关系边表(加速 parent/child 查询)
|
|
64
|
-
CREATE TABLE IF NOT EXISTS artifact_edges (
|
|
65
|
-
parent_id TEXT NOT NULL,
|
|
66
|
-
child_id TEXT NOT NULL,
|
|
67
|
-
PRIMARY KEY (parent_id, child_id)
|
|
68
|
-
);
|
|
69
|
-
|
|
70
|
-
CREATE INDEX IF NOT EXISTS idx_edges_parent ON artifact_edges(parent_id);
|
|
71
|
-
CREATE INDEX IF NOT EXISTS idx_edges_child ON artifact_edges(child_id);
|
|
72
|
-
|
|
73
|
-
-- 元信息表
|
|
74
|
-
CREATE TABLE IF NOT EXISTS meta (
|
|
75
|
-
key TEXT PRIMARY KEY,
|
|
76
|
-
value TEXT NOT NULL
|
|
77
|
-
);
|
|
78
|
-
|
|
79
|
-
-- 初始化 schema version
|
|
80
|
-
INSERT OR IGNORE INTO meta (key, value) VALUES ('schema_version', '1');
|
|
20
|
+
const SCHEMA_DDL = `
|
|
21
|
+
-- Artifacts 主表
|
|
22
|
+
CREATE TABLE IF NOT EXISTS artifacts (
|
|
23
|
+
id TEXT PRIMARY KEY,
|
|
24
|
+
type TEXT NOT NULL,
|
|
25
|
+
version INTEGER NOT NULL DEFAULT 1,
|
|
26
|
+
status TEXT NOT NULL DEFAULT 'DRAFT',
|
|
27
|
+
status_history TEXT NOT NULL DEFAULT '[]', -- JSON array of StatusChange
|
|
28
|
+
parents TEXT NOT NULL DEFAULT '[]', -- JSON array of ArtifactId
|
|
29
|
+
children TEXT NOT NULL DEFAULT '[]', -- JSON array of ArtifactId
|
|
30
|
+
supersedes TEXT,
|
|
31
|
+
title TEXT NOT NULL,
|
|
32
|
+
content_ref TEXT NOT NULL DEFAULT '',
|
|
33
|
+
payload TEXT NOT NULL DEFAULT '{}', -- JSON
|
|
34
|
+
gates TEXT NOT NULL DEFAULT '[]', -- JSON array of Gate
|
|
35
|
+
created_by TEXT NOT NULL DEFAULT '{}', -- JSON Actor
|
|
36
|
+
created_at INTEGER NOT NULL,
|
|
37
|
+
updated_at INTEGER NOT NULL,
|
|
38
|
+
closed_at INTEGER,
|
|
39
|
+
tags TEXT NOT NULL DEFAULT '[]', -- JSON array
|
|
40
|
+
labels TEXT NOT NULL DEFAULT '{}' -- JSON object
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_type ON artifacts(type);
|
|
44
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_status ON artifacts(status);
|
|
45
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_created_at ON artifacts(created_at);
|
|
46
|
+
|
|
47
|
+
-- Events 表(事件溯源的持久化副本)
|
|
48
|
+
CREATE TABLE IF NOT EXISTS events (
|
|
49
|
+
id TEXT PRIMARY KEY,
|
|
50
|
+
type TEXT NOT NULL,
|
|
51
|
+
timestamp INTEGER NOT NULL,
|
|
52
|
+
session_id TEXT,
|
|
53
|
+
artifact_id TEXT,
|
|
54
|
+
actor TEXT DEFAULT '{}',
|
|
55
|
+
payload TEXT NOT NULL DEFAULT '{}',
|
|
56
|
+
metadata TEXT DEFAULT '{}'
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
CREATE INDEX IF NOT EXISTS idx_events_type ON events(type);
|
|
60
|
+
CREATE INDEX IF NOT EXISTS idx_events_artifact_id ON events(artifact_id);
|
|
61
|
+
CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp);
|
|
62
|
+
|
|
63
|
+
-- Artifact 关系边表(加速 parent/child 查询)
|
|
64
|
+
CREATE TABLE IF NOT EXISTS artifact_edges (
|
|
65
|
+
parent_id TEXT NOT NULL,
|
|
66
|
+
child_id TEXT NOT NULL,
|
|
67
|
+
PRIMARY KEY (parent_id, child_id)
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
CREATE INDEX IF NOT EXISTS idx_edges_parent ON artifact_edges(parent_id);
|
|
71
|
+
CREATE INDEX IF NOT EXISTS idx_edges_child ON artifact_edges(child_id);
|
|
72
|
+
|
|
73
|
+
-- 元信息表
|
|
74
|
+
CREATE TABLE IF NOT EXISTS meta (
|
|
75
|
+
key TEXT PRIMARY KEY,
|
|
76
|
+
value TEXT NOT NULL
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
-- 初始化 schema version
|
|
80
|
+
INSERT OR IGNORE INTO meta (key, value) VALUES ('schema_version', '1');
|
|
81
81
|
`;
|
|
82
82
|
// ============================================================================
|
|
83
83
|
// SQLiteArtifactStore
|
|
@@ -131,38 +131,38 @@ export class SQLiteArtifactStore {
|
|
|
131
131
|
});
|
|
132
132
|
}
|
|
133
133
|
prepareStatements() {
|
|
134
|
-
this.stmtInsert = this.db.prepare(`
|
|
135
|
-
INSERT INTO artifacts (id, type, version, status, status_history, parents, children, supersedes,
|
|
136
|
-
title, content_ref, payload, gates, created_by, created_at, updated_at, closed_at, tags, labels)
|
|
137
|
-
VALUES (@id, @type, @version, @status, @statusHistory, @parents, @children, @supersedes,
|
|
138
|
-
@title, @contentRef, @payload, @gates, @createdBy, @createdAt, @updatedAt, @closedAt, @tags, @labels)
|
|
134
|
+
this.stmtInsert = this.db.prepare(`
|
|
135
|
+
INSERT INTO artifacts (id, type, version, status, status_history, parents, children, supersedes,
|
|
136
|
+
title, content_ref, payload, gates, created_by, created_at, updated_at, closed_at, tags, labels)
|
|
137
|
+
VALUES (@id, @type, @version, @status, @statusHistory, @parents, @children, @supersedes,
|
|
138
|
+
@title, @contentRef, @payload, @gates, @createdBy, @createdAt, @updatedAt, @closedAt, @tags, @labels)
|
|
139
139
|
`);
|
|
140
140
|
this.stmtGet = this.db.prepare(`SELECT * FROM artifacts WHERE id = ?`);
|
|
141
|
-
this.stmtUpdate = this.db.prepare(`
|
|
142
|
-
UPDATE artifacts SET
|
|
143
|
-
version = @version, status = @status, status_history = @statusHistory,
|
|
144
|
-
parents = @parents, children = @children, supersedes = @supersedes,
|
|
145
|
-
title = @title, content_ref = @contentRef, payload = @payload,
|
|
146
|
-
gates = @gates, updated_at = @updatedAt, closed_at = @closedAt,
|
|
147
|
-
tags = @tags, labels = @labels
|
|
148
|
-
WHERE id = @id
|
|
141
|
+
this.stmtUpdate = this.db.prepare(`
|
|
142
|
+
UPDATE artifacts SET
|
|
143
|
+
version = @version, status = @status, status_history = @statusHistory,
|
|
144
|
+
parents = @parents, children = @children, supersedes = @supersedes,
|
|
145
|
+
title = @title, content_ref = @contentRef, payload = @payload,
|
|
146
|
+
gates = @gates, updated_at = @updatedAt, closed_at = @closedAt,
|
|
147
|
+
tags = @tags, labels = @labels
|
|
148
|
+
WHERE id = @id
|
|
149
149
|
`);
|
|
150
150
|
this.stmtDelete = this.db.prepare(`DELETE FROM artifacts WHERE id = ?`);
|
|
151
151
|
this.stmtInsertEdge = this.db.prepare(`INSERT OR IGNORE INTO artifact_edges (parent_id, child_id) VALUES (?, ?)`);
|
|
152
152
|
this.stmtDeleteEdges = this.db.prepare(`DELETE FROM artifact_edges WHERE child_id = ?`);
|
|
153
|
-
this.stmtFindChildren = this.db.prepare(`
|
|
154
|
-
SELECT a.* FROM artifacts a
|
|
155
|
-
INNER JOIN artifact_edges e ON a.id = e.child_id
|
|
156
|
-
WHERE e.parent_id = ?
|
|
153
|
+
this.stmtFindChildren = this.db.prepare(`
|
|
154
|
+
SELECT a.* FROM artifacts a
|
|
155
|
+
INNER JOIN artifact_edges e ON a.id = e.child_id
|
|
156
|
+
WHERE e.parent_id = ?
|
|
157
157
|
`);
|
|
158
|
-
this.stmtFindParents = this.db.prepare(`
|
|
159
|
-
SELECT a.* FROM artifacts a
|
|
160
|
-
INNER JOIN artifact_edges e ON a.id = e.parent_id
|
|
161
|
-
WHERE e.child_id = ?
|
|
158
|
+
this.stmtFindParents = this.db.prepare(`
|
|
159
|
+
SELECT a.* FROM artifacts a
|
|
160
|
+
INNER JOIN artifact_edges e ON a.id = e.parent_id
|
|
161
|
+
WHERE e.child_id = ?
|
|
162
162
|
`);
|
|
163
|
-
this.stmtInsertEvent = this.db.prepare(`
|
|
164
|
-
INSERT OR IGNORE INTO events (id, type, timestamp, session_id, artifact_id, actor, payload, metadata)
|
|
165
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
163
|
+
this.stmtInsertEvent = this.db.prepare(`
|
|
164
|
+
INSERT OR IGNORE INTO events (id, type, timestamp, session_id, artifact_id, actor, payload, metadata)
|
|
165
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
166
166
|
`);
|
|
167
167
|
}
|
|
168
168
|
// ===== CRUD =====
|
|
@@ -276,10 +276,10 @@ export class SQLiteArtifactStore {
|
|
|
276
276
|
}
|
|
277
277
|
async findChildren(parentId, type) {
|
|
278
278
|
if (type) {
|
|
279
|
-
const rows = this.db.prepare(`
|
|
280
|
-
SELECT a.* FROM artifacts a
|
|
281
|
-
INNER JOIN artifact_edges e ON a.id = e.child_id
|
|
282
|
-
WHERE e.parent_id = ? AND a.type = ?
|
|
279
|
+
const rows = this.db.prepare(`
|
|
280
|
+
SELECT a.* FROM artifacts a
|
|
281
|
+
INNER JOIN artifact_edges e ON a.id = e.child_id
|
|
282
|
+
WHERE e.parent_id = ? AND a.type = ?
|
|
283
283
|
`).all(parentId, type);
|
|
284
284
|
return rows.map((r) => this.fromRow(r));
|
|
285
285
|
}
|
|
@@ -165,20 +165,20 @@ export class RuleProposer {
|
|
|
165
165
|
mkdirSync(rulesDir, { recursive: true });
|
|
166
166
|
const filename = `${rule.id}.md`;
|
|
167
167
|
const path = join(rulesDir, filename);
|
|
168
|
-
const content = `# ${rule.title}
|
|
169
|
-
|
|
170
|
-
> Source: ${rule.sourceLesson}
|
|
171
|
-
> Enforcement: ${rule.enforcement}
|
|
172
|
-
> Approved: ${rule.approved ? `Yes (by ${rule.approvedBy})` : 'Pending'}
|
|
173
|
-
> Created: ${new Date(rule.createdAt).toISOString()}
|
|
174
|
-
|
|
175
|
-
## Description
|
|
176
|
-
|
|
177
|
-
${rule.description}
|
|
178
|
-
|
|
179
|
-
## Pattern
|
|
180
|
-
|
|
181
|
-
\`${rule.pattern}\`
|
|
168
|
+
const content = `# ${rule.title}
|
|
169
|
+
|
|
170
|
+
> Source: ${rule.sourceLesson}
|
|
171
|
+
> Enforcement: ${rule.enforcement}
|
|
172
|
+
> Approved: ${rule.approved ? `Yes (by ${rule.approvedBy})` : 'Pending'}
|
|
173
|
+
> Created: ${new Date(rule.createdAt).toISOString()}
|
|
174
|
+
|
|
175
|
+
## Description
|
|
176
|
+
|
|
177
|
+
${rule.description}
|
|
178
|
+
|
|
179
|
+
## Pattern
|
|
180
|
+
|
|
181
|
+
\`${rule.pattern}\`
|
|
182
182
|
`;
|
|
183
183
|
writeFileSync(path, content, 'utf-8');
|
|
184
184
|
return path;
|
|
@@ -205,23 +205,23 @@ export class HookGenerator {
|
|
|
205
205
|
const scriptName = `${rule.id}.sh`;
|
|
206
206
|
const scriptPath = join(hooksDir, scriptName);
|
|
207
207
|
// Generate shell script
|
|
208
|
-
const script = `#!/bin/bash
|
|
209
|
-
# Auto-generated hook from Rule: ${rule.id}
|
|
210
|
-
# Source lesson: ${rule.sourceLesson}
|
|
211
|
-
# Pattern: ${rule.pattern}
|
|
212
|
-
# Hook type: ${hookType} | Matcher: ${matcher}
|
|
213
|
-
#
|
|
214
|
-
# This hook was automatically promoted from a recurring lesson.
|
|
215
|
-
# Edit with caution — it enforces a hard constraint.
|
|
216
|
-
|
|
217
|
-
# Read tool input from stdin
|
|
218
|
-
INPUT=$(cat)
|
|
219
|
-
|
|
220
|
-
# Check condition
|
|
221
|
-
# TODO: Implement specific check for pattern "${rule.pattern}"
|
|
222
|
-
# For now, this is a placeholder that always passes.
|
|
223
|
-
echo "Hook ${rule.id} checked (pattern: ${rule.pattern})" >&2
|
|
224
|
-
exit 0
|
|
208
|
+
const script = `#!/bin/bash
|
|
209
|
+
# Auto-generated hook from Rule: ${rule.id}
|
|
210
|
+
# Source lesson: ${rule.sourceLesson}
|
|
211
|
+
# Pattern: ${rule.pattern}
|
|
212
|
+
# Hook type: ${hookType} | Matcher: ${matcher}
|
|
213
|
+
#
|
|
214
|
+
# This hook was automatically promoted from a recurring lesson.
|
|
215
|
+
# Edit with caution — it enforces a hard constraint.
|
|
216
|
+
|
|
217
|
+
# Read tool input from stdin
|
|
218
|
+
INPUT=$(cat)
|
|
219
|
+
|
|
220
|
+
# Check condition
|
|
221
|
+
# TODO: Implement specific check for pattern "${rule.pattern}"
|
|
222
|
+
# For now, this is a placeholder that always passes.
|
|
223
|
+
echo "Hook ${rule.id} checked (pattern: ${rule.pattern})" >&2
|
|
224
|
+
exit 0
|
|
225
225
|
`;
|
|
226
226
|
writeFileSync(scriptPath, script, 'utf-8');
|
|
227
227
|
const hook = {
|
|
@@ -24,3 +24,15 @@ export declare class RoleGateDetector implements IDetector {
|
|
|
24
24
|
getRole(): RoleDefinition;
|
|
25
25
|
check(input: ToolUseInput, _ctx: DetectorContext): Promise<DetectorResult>;
|
|
26
26
|
}
|
|
27
|
+
export declare class ScopeCreepDetector implements IDetector {
|
|
28
|
+
name: string;
|
|
29
|
+
/** Max distinct files allowed per session before warning */
|
|
30
|
+
private maxFiles;
|
|
31
|
+
/** Window in ms to track file edits */
|
|
32
|
+
private windowMs;
|
|
33
|
+
constructor(opts?: {
|
|
34
|
+
maxFiles?: number;
|
|
35
|
+
windowMs?: number;
|
|
36
|
+
});
|
|
37
|
+
check(input: ToolUseInput, ctx: DetectorContext): Promise<DetectorResult>;
|
|
38
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
// SCALE Engine — 危险命令检测 + Role 权限网关
|
|
2
|
-
// W5 补充检测器
|
|
1
|
+
// SCALE Engine — 危险命令检测 + Role 权限网关 + ScopeCreep 检测
|
|
2
|
+
// W5 补充检测器 + 9th detector
|
|
3
3
|
// 设计参考:docs/01-ARCHITECTURE.md §二 L2
|
|
4
4
|
// ============================================================================
|
|
5
5
|
// 6. 危险命令检测器
|
|
@@ -135,4 +135,52 @@ export class RoleGateDetector {
|
|
|
135
135
|
return { triggered: false };
|
|
136
136
|
}
|
|
137
137
|
}
|
|
138
|
+
// ============================================================================
|
|
139
|
+
// 9. ScopeCreep 检测器
|
|
140
|
+
// ============================================================================
|
|
141
|
+
export class ScopeCreepDetector {
|
|
142
|
+
name = 'scope-creep';
|
|
143
|
+
/** Max distinct files allowed per session before warning */
|
|
144
|
+
maxFiles;
|
|
145
|
+
/** Window in ms to track file edits */
|
|
146
|
+
windowMs;
|
|
147
|
+
constructor(opts = {}) {
|
|
148
|
+
this.maxFiles = opts.maxFiles ?? 15;
|
|
149
|
+
this.windowMs = opts.windowMs ?? 10 * 60 * 1000; // 10 minutes
|
|
150
|
+
}
|
|
151
|
+
async check(input, ctx) {
|
|
152
|
+
if (!['Edit', 'Write', 'MultiEdit'].includes(input.tool))
|
|
153
|
+
return { triggered: false };
|
|
154
|
+
const file = input.args.file_path;
|
|
155
|
+
if (!file)
|
|
156
|
+
return { triggered: false };
|
|
157
|
+
const key = `scope-creep:${input.sessionId}`;
|
|
158
|
+
const record = ctx.cache.get(key)
|
|
159
|
+
?? { files: new Set(), timestamps: [] };
|
|
160
|
+
const now = Date.now();
|
|
161
|
+
// Prune old timestamps outside window
|
|
162
|
+
record.timestamps = record.timestamps.filter((t) => now - t < this.windowMs);
|
|
163
|
+
// Track new file
|
|
164
|
+
const isNew = !record.files.has(file);
|
|
165
|
+
record.files.add(file);
|
|
166
|
+
record.timestamps.push(now);
|
|
167
|
+
ctx.cache.set(key, record);
|
|
168
|
+
// Only warn when a NEW file is added and we exceed the threshold
|
|
169
|
+
if (isNew && record.files.size > this.maxFiles) {
|
|
170
|
+
ctx.eventBus.emit('tool.blocked', {
|
|
171
|
+
tool: input.tool,
|
|
172
|
+
detector: this.name,
|
|
173
|
+
reason: `scope_creep:${record.files.size}_files`,
|
|
174
|
+
file,
|
|
175
|
+
}, { sessionId: input.sessionId });
|
|
176
|
+
return {
|
|
177
|
+
triggered: true,
|
|
178
|
+
severity: 'warn',
|
|
179
|
+
reason: `⚠️ 检测到「范围蔓延」:本会话已编辑 ${record.files.size} 个不同文件(阈值 ${this.maxFiles})。请确认这些修改都在当前任务范围内,而非越界修改。`,
|
|
180
|
+
suggestion: '请检查是否偏离了原始任务范围。考虑收窄修改范围或拆分为多个任务。',
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
return { triggered: false };
|
|
184
|
+
}
|
|
185
|
+
}
|
|
138
186
|
//# sourceMappingURL=advancedDetectors.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"advancedDetectors.js","sourceRoot":"","sources":["../../src/guardrails/advancedDetectors.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"advancedDetectors.js","sourceRoot":"","sources":["../../src/guardrails/advancedDetectors.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -8,11 +8,14 @@ export { Container, container, createToken } from './core/container.js';
|
|
|
8
8
|
export { logger } from './core/logger.js';
|
|
9
9
|
export { TaskEngine } from './tasks/TaskEngine.js';
|
|
10
10
|
export { KnowledgeBase } from './knowledge/KnowledgeBase.js';
|
|
11
|
+
export { SQLiteKnowledgeBase } from './knowledge/SQLiteKnowledgeBase.js';
|
|
12
|
+
export type { IKnowledgeBase } from './knowledge/KnowledgeBase.js';
|
|
11
13
|
export { BehaviorTracker } from './evolution/BehaviorTracker.js';
|
|
12
14
|
export { LessonExtractor, RuleProposer, HookGenerator, EvolutionEngine } from './evolution/EvolutionEngine.js';
|
|
13
15
|
export { Gateway } from './guardrails/Gateway.js';
|
|
14
16
|
export { ROLES, getRole, listRoles } from './guardrails/roles.js';
|
|
15
17
|
export { BruteRetryDetector, IdleToolDetector, BusyLoopDetector, PrematureDoneDetector, BlameShiftDetector, } from './guardrails/detectors.js';
|
|
18
|
+
export { DangerousCommandDetector, SecretLeakDetector, RoleGateDetector, ScopeCreepDetector, BUILT_IN_ROLES, } from './guardrails/advancedDetectors.js';
|
|
16
19
|
export { ContextBuilder } from './context/ContextBuilder.js';
|
|
17
20
|
export { wireEffects } from './orchestration/EffectsWiring.js';
|
|
18
21
|
export { ModelRouter, DEFAULT_MODELS } from './routing/ModelRouter.js';
|
package/dist/index.js
CHANGED
|
@@ -14,6 +14,7 @@ export { logger } from './core/logger.js';
|
|
|
14
14
|
export { TaskEngine } from './tasks/TaskEngine.js';
|
|
15
15
|
// Knowledge Base
|
|
16
16
|
export { KnowledgeBase } from './knowledge/KnowledgeBase.js';
|
|
17
|
+
export { SQLiteKnowledgeBase } from './knowledge/SQLiteKnowledgeBase.js';
|
|
17
18
|
// Evolution
|
|
18
19
|
export { BehaviorTracker } from './evolution/BehaviorTracker.js';
|
|
19
20
|
export { LessonExtractor, RuleProposer, HookGenerator, EvolutionEngine } from './evolution/EvolutionEngine.js';
|
|
@@ -21,6 +22,7 @@ export { LessonExtractor, RuleProposer, HookGenerator, EvolutionEngine } from '.
|
|
|
21
22
|
export { Gateway } from './guardrails/Gateway.js';
|
|
22
23
|
export { ROLES, getRole, listRoles } from './guardrails/roles.js';
|
|
23
24
|
export { BruteRetryDetector, IdleToolDetector, BusyLoopDetector, PrematureDoneDetector, BlameShiftDetector, } from './guardrails/detectors.js';
|
|
25
|
+
export { DangerousCommandDetector, SecretLeakDetector, RoleGateDetector, ScopeCreepDetector, BUILT_IN_ROLES, } from './guardrails/advancedDetectors.js';
|
|
24
26
|
// Context
|
|
25
27
|
export { ContextBuilder } from './context/ContextBuilder.js';
|
|
26
28
|
// Orchestration
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,oEAAoE;AAEpE,aAAa;AACb,cAAc,qBAAqB,CAAA;AAEnC,MAAM;AACN,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAEhD,iBAAiB;AACjB,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAG3D,sBAAsB;AACtB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAE7C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACvE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAEzC,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAElD,iBAAiB;AACjB,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,oEAAoE;AAEpE,aAAa;AACb,cAAc,qBAAqB,CAAA;AAEnC,MAAM;AACN,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAEhD,iBAAiB;AACjB,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAG3D,sBAAsB;AACtB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAE7C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACvE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAEzC,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAElD,iBAAiB;AACjB,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAA;AAGxE,YAAY;AACZ,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAE9G,aAAa;AACb,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;AACjD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjE,OAAO,EACL,kBAAkB,EAAE,gBAAgB,EAAE,gBAAgB,EACtD,qBAAqB,EAAE,kBAAkB,GAC1C,MAAM,2BAA2B,CAAA;AAClC,OAAO,EACL,wBAAwB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,kBAAkB,EAClF,cAAc,GACf,MAAM,mCAAmC,CAAA;AAE1C,UAAU;AACV,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAE5D,gBAAgB;AAChB,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AAE9D,UAAU;AACV,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAEtE,6BAA6B;AAC7B,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,aAAa,EACb,aAAa,EACb,eAAe,EACf,aAAa,EACb,aAAa,EACb,gBAAgB,GACjB,MAAM,qBAAqB,CAAA;AAG5B,kBAAkB;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAE3D,mBAAmB;AACnB,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,SAAS,EACT,OAAO,EACP,OAAO,EACP,GAAG,EACH,WAAW,EACX,cAAc,EACd,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,aAAa,GACd,MAAM,wBAAwB,CAAA;AAE/B,MAAM;AACN,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { KnowledgeEntry, KnowledgeQuery } from '../artifact/types.js';
|
|
2
|
+
import type { IEventBus } from '../core/eventBus.js';
|
|
3
|
+
import type { IKnowledgeBase } from './KnowledgeBase.js';
|
|
4
|
+
export declare class SQLiteKnowledgeBase implements IKnowledgeBase {
|
|
5
|
+
private eventBus;
|
|
6
|
+
private db;
|
|
7
|
+
private seq;
|
|
8
|
+
constructor(eventBus: IEventBus, opts?: {
|
|
9
|
+
dbPath?: string;
|
|
10
|
+
});
|
|
11
|
+
add(input: Omit<KnowledgeEntry, 'id' | 'createdAt' | 'accessCount' | 'relevance'>): Promise<KnowledgeEntry>;
|
|
12
|
+
recall(query: KnowledgeQuery): Promise<KnowledgeEntry[]>;
|
|
13
|
+
recallByVector(text: string, topK: number): Promise<KnowledgeEntry[]>;
|
|
14
|
+
markHelpful(id: string, sessionId: string): Promise<void>;
|
|
15
|
+
markUseless(id: string, sessionId: string): Promise<void>;
|
|
16
|
+
verify(id: string, verifiedBy: string): Promise<void>;
|
|
17
|
+
decay(): Promise<void>;
|
|
18
|
+
/** Close database connection */
|
|
19
|
+
close(): void;
|
|
20
|
+
/** Get stats */
|
|
21
|
+
stats(): {
|
|
22
|
+
entryCount: number;
|
|
23
|
+
verifiedCount: number;
|
|
24
|
+
byType: Record<string, number>;
|
|
25
|
+
};
|
|
26
|
+
private generateId;
|
|
27
|
+
private fromRow;
|
|
28
|
+
}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
// SCALE Engine — SQLite Knowledge Base
|
|
2
|
+
// Persistent version of KnowledgeBase using better-sqlite3
|
|
3
|
+
// Design ref: docs/03-CORE-MODULES.md §3.4
|
|
4
|
+
import Database from 'better-sqlite3';
|
|
5
|
+
import { logger } from '../core/logger.js';
|
|
6
|
+
import { mkdirSync } from 'node:fs';
|
|
7
|
+
import { dirname } from 'node:path';
|
|
8
|
+
const KB_SCHEMA = `
|
|
9
|
+
CREATE TABLE IF NOT EXISTS knowledge_entries (
|
|
10
|
+
id TEXT PRIMARY KEY,
|
|
11
|
+
type TEXT NOT NULL,
|
|
12
|
+
title TEXT NOT NULL,
|
|
13
|
+
tags TEXT NOT NULL DEFAULT '[]',
|
|
14
|
+
content_ref TEXT NOT NULL DEFAULT '',
|
|
15
|
+
embedding_id TEXT,
|
|
16
|
+
relevance REAL NOT NULL DEFAULT 0.5,
|
|
17
|
+
access_count INTEGER NOT NULL DEFAULT 0,
|
|
18
|
+
last_accessed INTEGER,
|
|
19
|
+
verified INTEGER NOT NULL DEFAULT 0,
|
|
20
|
+
verified_by TEXT,
|
|
21
|
+
verified_at INTEGER,
|
|
22
|
+
created_at INTEGER NOT NULL,
|
|
23
|
+
source_artifact TEXT
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
CREATE INDEX IF NOT EXISTS idx_kb_type ON knowledge_entries(type);
|
|
27
|
+
CREATE INDEX IF NOT EXISTS idx_kb_relevance ON knowledge_entries(relevance);
|
|
28
|
+
CREATE INDEX IF NOT EXISTS idx_kb_verified ON knowledge_entries(verified);
|
|
29
|
+
CREATE INDEX IF NOT EXISTS idx_kb_created ON knowledge_entries(created_at);
|
|
30
|
+
`;
|
|
31
|
+
export class SQLiteKnowledgeBase {
|
|
32
|
+
eventBus;
|
|
33
|
+
db;
|
|
34
|
+
seq = 0;
|
|
35
|
+
constructor(eventBus, opts = {}) {
|
|
36
|
+
this.eventBus = eventBus;
|
|
37
|
+
const dbPath = opts.dbPath ?? '.scale/knowledge.db';
|
|
38
|
+
mkdirSync(dirname(dbPath), { recursive: true });
|
|
39
|
+
this.db = new Database(dbPath);
|
|
40
|
+
this.db.pragma('journal_mode = WAL');
|
|
41
|
+
this.db.pragma('busy_timeout = 5000');
|
|
42
|
+
this.db.exec(KB_SCHEMA);
|
|
43
|
+
// Restore seq from max id
|
|
44
|
+
const maxRow = this.db.prepare('SELECT id FROM knowledge_entries ORDER BY created_at DESC LIMIT 1').get();
|
|
45
|
+
if (maxRow) {
|
|
46
|
+
const parts = maxRow.id.split('-');
|
|
47
|
+
this.seq = parseInt(parts[parts.length - 1], 10) || 0;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async add(input) {
|
|
51
|
+
const entry = {
|
|
52
|
+
...input,
|
|
53
|
+
id: this.generateId(),
|
|
54
|
+
createdAt: Date.now(),
|
|
55
|
+
accessCount: 0,
|
|
56
|
+
relevance: 0.5,
|
|
57
|
+
};
|
|
58
|
+
this.db.prepare(`
|
|
59
|
+
INSERT INTO knowledge_entries
|
|
60
|
+
(id, type, title, tags, content_ref, embedding_id, relevance,
|
|
61
|
+
access_count, last_accessed, verified, verified_by, verified_at,
|
|
62
|
+
created_at, source_artifact)
|
|
63
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
64
|
+
`).run(entry.id, entry.type, entry.title, JSON.stringify(entry.tags), entry.contentRef, entry.embeddingId ?? null, entry.relevance, entry.accessCount, entry.lastAccessed ?? null, entry.verified ? 1 : 0, entry.verifiedBy ?? null, entry.verifiedAt ?? null, entry.createdAt, entry.sourceArtifact ?? null);
|
|
65
|
+
this.eventBus.emit('lesson.proposed', { lessonId: entry.id }, { artifactId: input.sourceArtifact });
|
|
66
|
+
return entry;
|
|
67
|
+
}
|
|
68
|
+
async recall(query) {
|
|
69
|
+
const conditions = ['1=1'];
|
|
70
|
+
const params = [];
|
|
71
|
+
if (query.type) {
|
|
72
|
+
const types = Array.isArray(query.type) ? query.type : [query.type];
|
|
73
|
+
conditions.push(`type IN (${types.map(() => '?').join(',')})`);
|
|
74
|
+
params.push(...types);
|
|
75
|
+
}
|
|
76
|
+
if (query.tags && query.tags.length > 0) {
|
|
77
|
+
for (const tag of query.tags) {
|
|
78
|
+
conditions.push(`tags LIKE ?`);
|
|
79
|
+
params.push(`%"${tag}"%`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (query.minRelevance !== undefined) {
|
|
83
|
+
conditions.push('relevance >= ?');
|
|
84
|
+
params.push(query.minRelevance);
|
|
85
|
+
}
|
|
86
|
+
if (query.verifiedOnly) {
|
|
87
|
+
conditions.push('verified = 1');
|
|
88
|
+
}
|
|
89
|
+
const limit = query.limit ?? 10;
|
|
90
|
+
const sql = `SELECT * FROM knowledge_entries WHERE ${conditions.join(' AND ')} ORDER BY relevance DESC LIMIT ?`;
|
|
91
|
+
params.push(limit);
|
|
92
|
+
const rows = this.db.prepare(sql).all(...params);
|
|
93
|
+
return rows.map((r) => this.fromRow(r));
|
|
94
|
+
}
|
|
95
|
+
async recallByVector(text, topK) {
|
|
96
|
+
// Qdrant integration placeholder — falls back to recall
|
|
97
|
+
logger.debug({ text, topK }, 'recallByVector (SQLite fallback to recall)');
|
|
98
|
+
return this.recall({ verifiedOnly: true, limit: topK });
|
|
99
|
+
}
|
|
100
|
+
async markHelpful(id, sessionId) {
|
|
101
|
+
const row = this.db.prepare('SELECT * FROM knowledge_entries WHERE id = ?').get(id);
|
|
102
|
+
if (!row)
|
|
103
|
+
return;
|
|
104
|
+
const newRelevance = Math.min(1, row.relevance + 0.05);
|
|
105
|
+
const newCount = row.access_count + 1;
|
|
106
|
+
const now = Date.now();
|
|
107
|
+
this.db.prepare('UPDATE knowledge_entries SET relevance = ?, access_count = ?, last_accessed = ? WHERE id = ?').run(newRelevance, newCount, now, id);
|
|
108
|
+
this.eventBus.emit('lesson.helpful', { lessonId: id }, { sessionId });
|
|
109
|
+
}
|
|
110
|
+
async markUseless(id, sessionId) {
|
|
111
|
+
const row = this.db.prepare('SELECT * FROM knowledge_entries WHERE id = ?').get(id);
|
|
112
|
+
if (!row)
|
|
113
|
+
return;
|
|
114
|
+
const newRelevance = Math.max(0.05, row.relevance - 0.1);
|
|
115
|
+
this.db.prepare('UPDATE knowledge_entries SET relevance = ? WHERE id = ?').run(newRelevance, id);
|
|
116
|
+
this.eventBus.emit('lesson.useless', { lessonId: id }, { sessionId });
|
|
117
|
+
}
|
|
118
|
+
async verify(id, verifiedBy) {
|
|
119
|
+
const now = Date.now();
|
|
120
|
+
const result = this.db.prepare('UPDATE knowledge_entries SET verified = 1, verified_by = ?, verified_at = ? WHERE id = ?').run(verifiedBy, now, id);
|
|
121
|
+
if (result.changes > 0) {
|
|
122
|
+
this.eventBus.emit('lesson.approved', { lessonId: id, verifiedBy });
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async decay() {
|
|
126
|
+
const DAY = 24 * 60 * 60 * 1000;
|
|
127
|
+
const now = Date.now();
|
|
128
|
+
const rows = this.db.prepare('SELECT id, relevance, last_accessed FROM knowledge_entries').all();
|
|
129
|
+
const stmt = this.db.prepare('UPDATE knowledge_entries SET relevance = ? WHERE id = ?');
|
|
130
|
+
const updateAll = this.db.transaction(() => {
|
|
131
|
+
for (const row of rows) {
|
|
132
|
+
const days = row.last_accessed ? (now - row.last_accessed) / DAY : 90;
|
|
133
|
+
const recency = Math.exp(-days / 30);
|
|
134
|
+
const newRelevance = Math.max(0.05, row.relevance * 0.95 + recency * 0.05);
|
|
135
|
+
stmt.run(newRelevance, row.id);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
updateAll();
|
|
139
|
+
}
|
|
140
|
+
/** Close database connection */
|
|
141
|
+
close() {
|
|
142
|
+
this.db.close();
|
|
143
|
+
}
|
|
144
|
+
/** Get stats */
|
|
145
|
+
stats() {
|
|
146
|
+
const entryCount = this.db.prepare('SELECT COUNT(*) as c FROM knowledge_entries').get().c;
|
|
147
|
+
const verifiedCount = this.db.prepare('SELECT COUNT(*) as c FROM knowledge_entries WHERE verified = 1').get().c;
|
|
148
|
+
const rows = this.db.prepare('SELECT type, COUNT(*) as c FROM knowledge_entries GROUP BY type').all();
|
|
149
|
+
const byType = {};
|
|
150
|
+
for (const r of rows)
|
|
151
|
+
byType[r.type] = r.c;
|
|
152
|
+
return { entryCount, verifiedCount, byType };
|
|
153
|
+
}
|
|
154
|
+
generateId() {
|
|
155
|
+
this.seq = (this.seq + 1) % 10000;
|
|
156
|
+
return `KB-${Date.now()}-${this.seq.toString().padStart(4, '0')}`;
|
|
157
|
+
}
|
|
158
|
+
fromRow(row) {
|
|
159
|
+
return {
|
|
160
|
+
id: row.id,
|
|
161
|
+
type: row.type,
|
|
162
|
+
title: row.title,
|
|
163
|
+
tags: JSON.parse(row.tags),
|
|
164
|
+
contentRef: row.content_ref,
|
|
165
|
+
embeddingId: row.embedding_id ?? undefined,
|
|
166
|
+
relevance: row.relevance,
|
|
167
|
+
accessCount: row.access_count,
|
|
168
|
+
lastAccessed: row.last_accessed ?? undefined,
|
|
169
|
+
verified: row.verified === 1,
|
|
170
|
+
verifiedBy: row.verified_by ?? undefined,
|
|
171
|
+
verifiedAt: row.verified_at ?? undefined,
|
|
172
|
+
createdAt: row.created_at,
|
|
173
|
+
sourceArtifact: row.source_artifact ?? undefined,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=SQLiteKnowledgeBase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SQLiteKnowledgeBase.js","sourceRoot":"","sources":["../../src/knowledge/SQLiteKnowledgeBase.ts"],"names":[],"mappings":"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"}
|