@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.
@@ -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":"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"}
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;AAE5D,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;AAElC,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"}
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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"}