@hongmaple0820/scale-engine 0.5.0 → 0.7.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 +64 -13
- package/dist/adapters/ClaudeCodeAdapter.d.ts +1 -1
- package/dist/adapters/ClaudeCodeAdapter.js +5 -3
- package/dist/adapters/ClaudeCodeAdapter.js.map +1 -1
- package/dist/adapters/CodexAdapter.js +33 -31
- package/dist/adapters/CodexAdapter.js.map +1 -1
- package/dist/adapters/CursorAdapter.js +5 -3
- package/dist/adapters/CursorAdapter.js.map +1 -1
- package/dist/adapters/GeminiAdapter.js +5 -3
- package/dist/adapters/GeminiAdapter.js.map +1 -1
- package/dist/adapters/HermesAdapter.js +5 -3
- package/dist/adapters/HermesAdapter.js.map +1 -1
- package/dist/adapters/OpenClawAdapter.js +5 -3
- package/dist/adapters/OpenClawAdapter.js.map +1 -1
- package/dist/adapters/OpenCodeAdapter.js +5 -3
- package/dist/adapters/OpenCodeAdapter.js.map +1 -1
- package/dist/adapters/QCoderAdapter.d.ts +13 -0
- package/dist/adapters/QCoderAdapter.js +155 -0
- package/dist/adapters/QCoderAdapter.js.map +1 -0
- package/dist/adapters/TraeAdapter.d.ts +13 -0
- package/dist/adapters/TraeAdapter.js +155 -0
- package/dist/adapters/TraeAdapter.js.map +1 -0
- package/dist/adapters/VSCAdapter.d.ts +13 -0
- package/dist/adapters/VSCAdapter.js +155 -0
- package/dist/adapters/VSCAdapter.js.map +1 -0
- package/dist/adapters/WorkBuddyAdapter.d.ts +13 -0
- package/dist/adapters/WorkBuddyAdapter.js +155 -0
- package/dist/adapters/WorkBuddyAdapter.js.map +1 -0
- package/dist/adapters/index.d.ts +4 -0
- package/dist/adapters/index.js +13 -1
- package/dist/adapters/index.js.map +1 -1
- package/dist/agents/AgentManager.d.ts +14 -0
- package/dist/agents/AgentManager.js +85 -0
- package/dist/agents/AgentManager.js.map +1 -0
- package/dist/agents/IAgent.d.ts +53 -0
- package/dist/agents/IAgent.js +4 -0
- package/dist/agents/IAgent.js.map +1 -0
- package/dist/agents/definitions/debugger.d.ts +2 -0
- package/dist/agents/definitions/debugger.js +6 -0
- package/dist/agents/definitions/debugger.js.map +1 -0
- package/dist/agents/definitions/doc-writer.d.ts +2 -0
- package/dist/agents/definitions/doc-writer.js +6 -0
- package/dist/agents/definitions/doc-writer.js.map +1 -0
- package/dist/agents/definitions/implementer.d.ts +2 -0
- package/dist/agents/definitions/implementer.js +6 -0
- package/dist/agents/definitions/implementer.js.map +1 -0
- package/dist/agents/definitions/planner.d.ts +2 -0
- package/dist/agents/definitions/planner.js +6 -0
- package/dist/agents/definitions/planner.js.map +1 -0
- package/dist/agents/definitions/researcher.d.ts +2 -0
- package/dist/agents/definitions/researcher.js +6 -0
- package/dist/agents/definitions/researcher.js.map +1 -0
- package/dist/agents/definitions/reviewer.d.ts +2 -0
- package/dist/agents/definitions/reviewer.js +6 -0
- package/dist/agents/definitions/reviewer.js.map +1 -0
- package/dist/agents/definitions/security.d.ts +2 -0
- package/dist/agents/definitions/security.js +6 -0
- package/dist/agents/definitions/security.js.map +1 -0
- package/dist/agents/definitions/tester.d.ts +2 -0
- package/dist/agents/definitions/tester.js +6 -0
- package/dist/agents/definitions/tester.js.map +1 -0
- package/dist/agents/definitions${file}.d.ts +1 -0
- package/dist/agents/definitions${file}.js +14 -0
- package/dist/agents/definitions${file}.js.map +1 -0
- package/dist/agents/index.d.ts +15 -0
- package/dist/agents/index.js +34 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/api/cli.js +6 -5
- package/dist/api/cli.js.map +1 -1
- package/dist/api/doctor.js +29 -12
- package/dist/api/doctor.js.map +1 -1
- package/dist/api/mcp.js +0 -5
- package/dist/api/mcp.js.map +1 -1
- package/dist/artifact/fsm.d.ts +5 -0
- package/dist/artifact/fsm.js +25 -3
- package/dist/artifact/fsm.js.map +1 -1
- package/dist/artifact/sqliteStore.js +90 -103
- package/dist/artifact/sqliteStore.js.map +1 -1
- package/dist/artifact/store.js +2 -4
- package/dist/artifact/store.js.map +1 -1
- package/dist/artifact/types.d.ts +3 -3
- package/dist/artifact/types.js +0 -3
- package/dist/artifact/types.js.map +1 -1
- package/dist/context/ContextBuilder.js +1 -4
- package/dist/context/ContextBuilder.js.map +1 -1
- package/dist/core/container.js +4 -2
- package/dist/core/container.js.map +1 -1
- package/dist/core/eventBus.js +5 -6
- package/dist/core/eventBus.js.map +1 -1
- package/dist/dashboard/index.d.ts +2 -0
- package/dist/dashboard/index.js +2 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/dashboard/server.d.ts +52 -0
- package/dist/dashboard/server.js +83 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/evolution/BehaviorTracker.js +2 -3
- package/dist/evolution/BehaviorTracker.js.map +1 -1
- package/dist/evolution/EvolutionEngine.js +34 -45
- package/dist/evolution/EvolutionEngine.js.map +1 -1
- package/dist/evolution/PatternExtractor.d.ts +40 -0
- package/dist/evolution/PatternExtractor.js +83 -0
- package/dist/evolution/PatternExtractor.js.map +1 -0
- package/dist/evolution/SkillCreator.d.ts +40 -0
- package/dist/evolution/SkillCreator.js +118 -0
- package/dist/evolution/SkillCreator.js.map +1 -0
- package/dist/guardrails/Gateway.js +6 -7
- package/dist/guardrails/Gateway.js.map +1 -1
- package/dist/guardrails/advancedDetectors.d.ts +12 -0
- package/dist/guardrails/advancedDetectors.js +78 -28
- package/dist/guardrails/advancedDetectors.js.map +1 -1
- package/dist/guardrails/detectors.js +24 -14
- package/dist/guardrails/detectors.js.map +1 -1
- package/dist/index.d.ts +12 -1
- package/dist/index.js +11 -2
- package/dist/index.js.map +1 -1
- package/dist/knowledge/KnowledgeBase.js +2 -3
- package/dist/knowledge/KnowledgeBase.js.map +1 -1
- package/dist/knowledge/SQLiteKnowledgeBase.d.ts +28 -0
- package/dist/knowledge/SQLiteKnowledgeBase.js +175 -0
- package/dist/knowledge/SQLiteKnowledgeBase.js.map +1 -0
- package/dist/routing/ModelRouter.js +0 -2
- package/dist/routing/ModelRouter.js.map +1 -1
- package/dist/skills/SkillDiscovery.js +8 -1
- package/dist/skills/SkillDiscovery.js.map +1 -1
- package/dist/tasks/TaskEngine.js +25 -5
- package/dist/tasks/TaskEngine.js.map +1 -1
- package/package.json +8 -2
|
@@ -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,25 +1,27 @@
|
|
|
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. 危险命令检测器
|
|
6
6
|
// ============================================================================
|
|
7
7
|
export class DangerousCommandDetector {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
8
|
+
constructor() {
|
|
9
|
+
this.name = 'dangerous-command';
|
|
10
|
+
this.patterns = [
|
|
11
|
+
{ pattern: /rm\s+-rf\s+[\/~]/, description: 'rm -rf on root/home' },
|
|
12
|
+
{ pattern: /rm\s+-rf\s+\*/, description: 'rm -rf wildcard' },
|
|
13
|
+
{ pattern: /DROP\s+(TABLE|DATABASE|SCHEMA)/i, description: 'SQL DROP' },
|
|
14
|
+
{ pattern: /TRUNCATE\s+TABLE/i, description: 'SQL TRUNCATE' },
|
|
15
|
+
{ pattern: /DELETE\s+FROM\s+\w+\s*;/i, description: 'SQL DELETE without WHERE' },
|
|
16
|
+
{ pattern: /ALTER\s+TABLE\s+\w+\s+DROP/i, description: 'SQL ALTER DROP column' },
|
|
17
|
+
{ pattern: /curl\s+.*\|\s*(bash|sh)/i, description: 'curl pipe to shell' },
|
|
18
|
+
{ pattern: /chmod\s+777/, description: 'chmod 777' },
|
|
19
|
+
{ pattern: />\s*\/dev\/sda/, description: 'write to device' },
|
|
20
|
+
{ pattern: /mkfs\./, description: 'format filesystem' },
|
|
21
|
+
{ pattern: /:(){ :\|:& };:/, description: 'fork bomb' },
|
|
22
|
+
{ pattern: /dd\s+if=.*of=\/dev\//, description: 'dd to device' },
|
|
23
|
+
];
|
|
24
|
+
}
|
|
23
25
|
async check(input, ctx) {
|
|
24
26
|
if (input.tool !== 'Bash')
|
|
25
27
|
return { triggered: false };
|
|
@@ -47,15 +49,17 @@ export class DangerousCommandDetector {
|
|
|
47
49
|
// 7. 密钥泄露检测器
|
|
48
50
|
// ============================================================================
|
|
49
51
|
export class SecretLeakDetector {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
52
|
+
constructor() {
|
|
53
|
+
this.name = 'secret-leak';
|
|
54
|
+
this.patterns = [
|
|
55
|
+
{ pattern: /['"]?[A-Za-z0-9+\/]{40}['"]?/, description: 'possible API key (40 chars)' },
|
|
56
|
+
{ pattern: /AKIA[0-9A-Z]{16}/, description: 'AWS Access Key ID' },
|
|
57
|
+
{ pattern: /-----BEGIN (RSA |EC |DSA )?PRIVATE KEY-----/, description: 'Private key' },
|
|
58
|
+
{ pattern: /sk-[a-zA-Z0-9]{48}/, description: 'OpenAI API key' },
|
|
59
|
+
{ pattern: /ghp_[a-zA-Z0-9]{36}/, description: 'GitHub PAT' },
|
|
60
|
+
{ pattern: /password\s*[:=]\s*['"][^'"]{8,}['"]/, description: 'hardcoded password' },
|
|
61
|
+
];
|
|
62
|
+
}
|
|
59
63
|
async check(input, ctx) {
|
|
60
64
|
if (!['Edit', 'Write', 'MultiEdit'].includes(input.tool))
|
|
61
65
|
return { triggered: false };
|
|
@@ -104,8 +108,10 @@ export const BUILT_IN_ROLES = {
|
|
|
104
108
|
},
|
|
105
109
|
};
|
|
106
110
|
export class RoleGateDetector {
|
|
107
|
-
|
|
108
|
-
|
|
111
|
+
constructor() {
|
|
112
|
+
this.name = 'role-gate';
|
|
113
|
+
this.currentRole = BUILT_IN_ROLES.implementer;
|
|
114
|
+
}
|
|
109
115
|
setRole(role) {
|
|
110
116
|
this.currentRole = role;
|
|
111
117
|
}
|
|
@@ -135,4 +141,48 @@ export class RoleGateDetector {
|
|
|
135
141
|
return { triggered: false };
|
|
136
142
|
}
|
|
137
143
|
}
|
|
144
|
+
// ============================================================================
|
|
145
|
+
// 9. ScopeCreep 检测器
|
|
146
|
+
// ============================================================================
|
|
147
|
+
export class ScopeCreepDetector {
|
|
148
|
+
constructor(opts = {}) {
|
|
149
|
+
this.name = 'scope-creep';
|
|
150
|
+
this.maxFiles = opts.maxFiles ?? 15;
|
|
151
|
+
this.windowMs = opts.windowMs ?? 10 * 60 * 1000; // 10 minutes
|
|
152
|
+
}
|
|
153
|
+
async check(input, ctx) {
|
|
154
|
+
if (!['Edit', 'Write', 'MultiEdit'].includes(input.tool))
|
|
155
|
+
return { triggered: false };
|
|
156
|
+
const file = input.args.file_path;
|
|
157
|
+
if (!file)
|
|
158
|
+
return { triggered: false };
|
|
159
|
+
const key = `scope-creep:${input.sessionId}`;
|
|
160
|
+
const record = ctx.cache.get(key)
|
|
161
|
+
?? { files: new Set(), timestamps: [] };
|
|
162
|
+
const now = Date.now();
|
|
163
|
+
// Prune old timestamps outside window
|
|
164
|
+
record.timestamps = record.timestamps.filter((t) => now - t < this.windowMs);
|
|
165
|
+
// Track new file
|
|
166
|
+
const isNew = !record.files.has(file);
|
|
167
|
+
record.files.add(file);
|
|
168
|
+
record.timestamps.push(now);
|
|
169
|
+
ctx.cache.set(key, record);
|
|
170
|
+
// Only warn when a NEW file is added and we exceed the threshold
|
|
171
|
+
if (isNew && record.files.size > this.maxFiles) {
|
|
172
|
+
ctx.eventBus.emit('tool.blocked', {
|
|
173
|
+
tool: input.tool,
|
|
174
|
+
detector: this.name,
|
|
175
|
+
reason: `scope_creep:${record.files.size}_files`,
|
|
176
|
+
file,
|
|
177
|
+
}, { sessionId: input.sessionId });
|
|
178
|
+
return {
|
|
179
|
+
triggered: true,
|
|
180
|
+
severity: 'warn',
|
|
181
|
+
reason: `⚠️ 检测到「范围蔓延」:本会话已编辑 ${record.files.size} 个不同文件(阈值 ${this.maxFiles})。请确认这些修改都在当前任务范围内,而非越界修改。`,
|
|
182
|
+
suggestion: '请检查是否偏离了原始任务范围。考虑收窄修改范围或拆分为多个任务。',
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
return { triggered: false };
|
|
186
|
+
}
|
|
187
|
+
}
|
|
138
188
|
//# 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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"}
|
|
@@ -4,9 +4,11 @@ import { createHash } from 'node:crypto';
|
|
|
4
4
|
const hashArgs = (args) => createHash('md5').update(JSON.stringify(args)).digest('hex').slice(0, 8);
|
|
5
5
|
// 1. 暴力重试检测
|
|
6
6
|
export class BruteRetryDetector {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
constructor() {
|
|
8
|
+
this.name = 'brute-retry';
|
|
9
|
+
this.windowMs = 3 * 60 * 1000;
|
|
10
|
+
this.threshold = 3;
|
|
11
|
+
}
|
|
10
12
|
async check(input, ctx) {
|
|
11
13
|
const key = `${input.sessionId}:${input.tool}:${hashArgs(input.args)}`;
|
|
12
14
|
const history = ctx.cache.get(key) ?? [];
|
|
@@ -26,7 +28,9 @@ export class BruteRetryDetector {
|
|
|
26
28
|
}
|
|
27
29
|
// 2. 工具闲置检测
|
|
28
30
|
export class IdleToolDetector {
|
|
29
|
-
|
|
31
|
+
constructor() {
|
|
32
|
+
this.name = 'idle-tool';
|
|
33
|
+
}
|
|
30
34
|
async check(input, ctx) {
|
|
31
35
|
if (!['Edit', 'Write', 'MultiEdit'].includes(input.tool))
|
|
32
36
|
return { triggered: false };
|
|
@@ -55,7 +59,9 @@ export class IdleToolDetector {
|
|
|
55
59
|
}
|
|
56
60
|
// 3. 忙碌假象(来回反复修改同一文件)
|
|
57
61
|
export class BusyLoopDetector {
|
|
58
|
-
|
|
62
|
+
constructor() {
|
|
63
|
+
this.name = 'busy-loop';
|
|
64
|
+
}
|
|
59
65
|
async check(input, ctx) {
|
|
60
66
|
if (input.tool !== 'Edit')
|
|
61
67
|
return { triggered: false };
|
|
@@ -98,7 +104,9 @@ export class BusyLoopDetector {
|
|
|
98
104
|
}
|
|
99
105
|
// 4. 声称完成但未验证
|
|
100
106
|
export class PrematureDoneDetector {
|
|
101
|
-
|
|
107
|
+
constructor() {
|
|
108
|
+
this.name = 'premature-done';
|
|
109
|
+
}
|
|
102
110
|
async check(input, ctx) {
|
|
103
111
|
const edits = await ctx.eventBus.query({
|
|
104
112
|
sessionId: input.sessionId,
|
|
@@ -138,14 +146,16 @@ export class PrematureDoneDetector {
|
|
|
138
146
|
}
|
|
139
147
|
// 5. 甩锅检测
|
|
140
148
|
export class BlameShiftDetector {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
+
constructor() {
|
|
150
|
+
this.name = 'blame-shift';
|
|
151
|
+
this.patterns = [
|
|
152
|
+
/可能是环境问题/i,
|
|
153
|
+
/建议你?手动/i,
|
|
154
|
+
/maybe (an?|the) (environment|version|setup)/i,
|
|
155
|
+
/not sure why/i,
|
|
156
|
+
/unable to (determine|figure out|resolve)/i,
|
|
157
|
+
];
|
|
158
|
+
}
|
|
149
159
|
async check(input, ctx) {
|
|
150
160
|
const text = input.output ?? '';
|
|
151
161
|
if (!this.patterns.some((p) => p.test(text)))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detectors.js","sourceRoot":"","sources":["../../src/guardrails/detectors.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,oCAAoC;AAIpC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,MAAM,QAAQ,GAAG,CAAC,IAAa,EAAU,EAAE,CACzC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAE1E,YAAY;AACZ,MAAM,OAAO,kBAAkB;
|
|
1
|
+
{"version":3,"file":"detectors.js","sourceRoot":"","sources":["../../src/guardrails/detectors.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -8,17 +8,28 @@ 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';
|
|
19
|
-
export { ClaudeCodeAdapter, CodexAdapter, OpenCodeAdapter, CursorAdapter, GeminiAdapter, OpenClawAdapter, HermesAdapter, createAdapter, SUPPORTED_AGENTS, } from './adapters/index.js';
|
|
22
|
+
export { ClaudeCodeAdapter, CodexAdapter, OpenCodeAdapter, CursorAdapter, GeminiAdapter, OpenClawAdapter, HermesAdapter, TraeAdapter, WorkBuddyAdapter, VSCAdapter, QCoderAdapter, createAdapter, SUPPORTED_AGENTS, } from './adapters/index.js';
|
|
20
23
|
export type { IAgentAdapter, AdapterConfig, InitResult, SettingsJson, HookEntry } from './adapters/ClaudeCodeAdapter.js';
|
|
21
24
|
export { SkillDiscovery } from './skills/SkillDiscovery.js';
|
|
22
25
|
export { WORKFLOW_PRESETS, getWorkflowPreset, listWorkflowPresets, getPresetsByScenario, BASIC_DEV, TDD_DEV, BUG_FIX, SDD, CODE_REVIEW, SECURITY_AUDIT, RALPH_LOOP, RAPID_PROTO, MASSIVE_REFACTOR, PARALLEL_EXEC, } from './workflows/presets.js';
|
|
26
|
+
export { AgentManager, initializeAgentManager, registerAllAgents, ALL_AGENTS, AGENT_MANAGER_TOKEN, } from './agents/index.js';
|
|
27
|
+
export type { IAgentManager, IAgent, AgentDefinition, AgentTaskContext, AgentResult, AgentCapability, } from './agents/index.js';
|
|
28
|
+
export { PatternExtractor } from './evolution/PatternExtractor.js';
|
|
29
|
+
export type { Pattern, PatternStep, IPatternExtractor } from './evolution/PatternExtractor.js';
|
|
30
|
+
export { SkillCreator } from './evolution/SkillCreator.js';
|
|
31
|
+
export type { SkillProposal, SkillStep, ISkillCreator } from './evolution/SkillCreator.js';
|
|
32
|
+
export { DashboardServer } from './dashboard/index.js';
|
|
33
|
+
export type { DashboardConfig, DashboardData } from './dashboard/index.js';
|
|
23
34
|
export { Doctor } from './api/doctor.js';
|
|
24
35
|
export { ScaleMCPServer } from './api/mcp.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,18 +22,26 @@ 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
|
|
27
29
|
export { wireEffects } from './orchestration/EffectsWiring.js';
|
|
28
30
|
// Routing
|
|
29
31
|
export { ModelRouter, DEFAULT_MODELS } from './routing/ModelRouter.js';
|
|
30
|
-
// Adapters (all
|
|
31
|
-
export { ClaudeCodeAdapter, CodexAdapter, OpenCodeAdapter, CursorAdapter, GeminiAdapter, OpenClawAdapter, HermesAdapter, createAdapter, SUPPORTED_AGENTS, } from './adapters/index.js';
|
|
32
|
+
// Adapters (all 11 platforms)
|
|
33
|
+
export { ClaudeCodeAdapter, CodexAdapter, OpenCodeAdapter, CursorAdapter, GeminiAdapter, OpenClawAdapter, HermesAdapter, TraeAdapter, WorkBuddyAdapter, VSCAdapter, QCoderAdapter, createAdapter, SUPPORTED_AGENTS, } from './adapters/index.js';
|
|
32
34
|
// Skill Discovery
|
|
33
35
|
export { SkillDiscovery } from './skills/SkillDiscovery.js';
|
|
34
36
|
// Workflow Presets
|
|
35
37
|
export { WORKFLOW_PRESETS, getWorkflowPreset, listWorkflowPresets, getPresetsByScenario, BASIC_DEV, TDD_DEV, BUG_FIX, SDD, CODE_REVIEW, SECURITY_AUDIT, RALPH_LOOP, RAPID_PROTO, MASSIVE_REFACTOR, PARALLEL_EXEC, } from './workflows/presets.js';
|
|
38
|
+
// Agents (Phase 1)
|
|
39
|
+
export { AgentManager, initializeAgentManager, registerAllAgents, ALL_AGENTS, AGENT_MANAGER_TOKEN, } from './agents/index.js';
|
|
40
|
+
// Evolution Positive Learning (Phase 4)
|
|
41
|
+
export { PatternExtractor } from './evolution/PatternExtractor.js';
|
|
42
|
+
export { SkillCreator } from './evolution/SkillCreator.js';
|
|
43
|
+
// Dashboard (Phase 7)
|
|
44
|
+
export { DashboardServer } from './dashboard/index.js';
|
|
36
45
|
// API
|
|
37
46
|
export { Doctor } from './api/doctor.js';
|
|
38
47
|
export { ScaleMCPServer } from './api/mcp.js';
|
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,8BAA8B;AAC9B,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,aAAa,EACb,aAAa,EACb,eAAe,EACf,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,UAAU,EACV,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,mBAAmB;AACnB,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,iBAAiB,EACjB,UAAU,EACV,mBAAmB,GACpB,MAAM,mBAAmB,CAAA;AAU1B,wCAAwC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAElE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAG1D,sBAAsB;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAGtD,MAAM;AACN,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA"}
|
|
@@ -2,11 +2,10 @@
|
|
|
2
2
|
// 设计参考:docs/03-CORE-MODULES.md §3.4
|
|
3
3
|
import { logger } from '../core/logger.js';
|
|
4
4
|
export class KnowledgeBase {
|
|
5
|
-
eventBus;
|
|
6
|
-
entries = new Map();
|
|
7
|
-
seq = 0;
|
|
8
5
|
constructor(eventBus) {
|
|
9
6
|
this.eventBus = eventBus;
|
|
7
|
+
this.entries = new Map();
|
|
8
|
+
this.seq = 0;
|
|
10
9
|
}
|
|
11
10
|
async add(input) {
|
|
12
11
|
const entry = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KnowledgeBase.js","sourceRoot":"","sources":["../../src/knowledge/KnowledgeBase.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,oCAAoC;AAIpC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAY1C,MAAM,OAAO,aAAa;
|
|
1
|
+
{"version":3,"file":"KnowledgeBase.js","sourceRoot":"","sources":["../../src/knowledge/KnowledgeBase.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,175 @@
|
|
|
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
|
+
constructor(eventBus, opts = {}) {
|
|
33
|
+
this.eventBus = eventBus;
|
|
34
|
+
this.seq = 0;
|
|
35
|
+
const dbPath = opts.dbPath ?? '.scale/knowledge.db';
|
|
36
|
+
mkdirSync(dirname(dbPath), { recursive: true });
|
|
37
|
+
this.db = new Database(dbPath);
|
|
38
|
+
this.db.pragma('journal_mode = WAL');
|
|
39
|
+
this.db.pragma('busy_timeout = 5000');
|
|
40
|
+
this.db.exec(KB_SCHEMA);
|
|
41
|
+
// Restore seq from max id
|
|
42
|
+
const maxRow = this.db.prepare('SELECT id FROM knowledge_entries ORDER BY created_at DESC LIMIT 1').get();
|
|
43
|
+
if (maxRow) {
|
|
44
|
+
const parts = maxRow.id.split('-');
|
|
45
|
+
this.seq = parseInt(parts[parts.length - 1], 10) || 0;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async add(input) {
|
|
49
|
+
const entry = {
|
|
50
|
+
...input,
|
|
51
|
+
id: this.generateId(),
|
|
52
|
+
createdAt: Date.now(),
|
|
53
|
+
accessCount: 0,
|
|
54
|
+
relevance: 0.5,
|
|
55
|
+
};
|
|
56
|
+
this.db.prepare(`
|
|
57
|
+
INSERT INTO knowledge_entries
|
|
58
|
+
(id, type, title, tags, content_ref, embedding_id, relevance,
|
|
59
|
+
access_count, last_accessed, verified, verified_by, verified_at,
|
|
60
|
+
created_at, source_artifact)
|
|
61
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
62
|
+
`).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);
|
|
63
|
+
this.eventBus.emit('lesson.proposed', { lessonId: entry.id }, { artifactId: input.sourceArtifact });
|
|
64
|
+
return entry;
|
|
65
|
+
}
|
|
66
|
+
async recall(query) {
|
|
67
|
+
const conditions = ['1=1'];
|
|
68
|
+
const params = [];
|
|
69
|
+
if (query.type) {
|
|
70
|
+
const types = Array.isArray(query.type) ? query.type : [query.type];
|
|
71
|
+
conditions.push(`type IN (${types.map(() => '?').join(',')})`);
|
|
72
|
+
params.push(...types);
|
|
73
|
+
}
|
|
74
|
+
if (query.tags && query.tags.length > 0) {
|
|
75
|
+
for (const tag of query.tags) {
|
|
76
|
+
conditions.push(`tags LIKE ?`);
|
|
77
|
+
params.push(`%"${tag}"%`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (query.minRelevance !== undefined) {
|
|
81
|
+
conditions.push('relevance >= ?');
|
|
82
|
+
params.push(query.minRelevance);
|
|
83
|
+
}
|
|
84
|
+
if (query.verifiedOnly) {
|
|
85
|
+
conditions.push('verified = 1');
|
|
86
|
+
}
|
|
87
|
+
const limit = query.limit ?? 10;
|
|
88
|
+
const sql = `SELECT * FROM knowledge_entries WHERE ${conditions.join(' AND ')} ORDER BY relevance DESC LIMIT ?`;
|
|
89
|
+
params.push(limit);
|
|
90
|
+
const rows = this.db.prepare(sql).all(...params);
|
|
91
|
+
return rows.map((r) => this.fromRow(r));
|
|
92
|
+
}
|
|
93
|
+
async recallByVector(text, topK) {
|
|
94
|
+
// Qdrant integration placeholder — falls back to recall
|
|
95
|
+
logger.debug({ text, topK }, 'recallByVector (SQLite fallback to recall)');
|
|
96
|
+
return this.recall({ verifiedOnly: true, limit: topK });
|
|
97
|
+
}
|
|
98
|
+
async markHelpful(id, sessionId) {
|
|
99
|
+
const row = this.db.prepare('SELECT * FROM knowledge_entries WHERE id = ?').get(id);
|
|
100
|
+
if (!row)
|
|
101
|
+
return;
|
|
102
|
+
const newRelevance = Math.min(1, row.relevance + 0.05);
|
|
103
|
+
const newCount = row.access_count + 1;
|
|
104
|
+
const now = Date.now();
|
|
105
|
+
this.db.prepare('UPDATE knowledge_entries SET relevance = ?, access_count = ?, last_accessed = ? WHERE id = ?').run(newRelevance, newCount, now, id);
|
|
106
|
+
this.eventBus.emit('lesson.helpful', { lessonId: id }, { sessionId });
|
|
107
|
+
}
|
|
108
|
+
async markUseless(id, sessionId) {
|
|
109
|
+
const row = this.db.prepare('SELECT * FROM knowledge_entries WHERE id = ?').get(id);
|
|
110
|
+
if (!row)
|
|
111
|
+
return;
|
|
112
|
+
const newRelevance = Math.max(0.05, row.relevance - 0.1);
|
|
113
|
+
this.db.prepare('UPDATE knowledge_entries SET relevance = ? WHERE id = ?').run(newRelevance, id);
|
|
114
|
+
this.eventBus.emit('lesson.useless', { lessonId: id }, { sessionId });
|
|
115
|
+
}
|
|
116
|
+
async verify(id, verifiedBy) {
|
|
117
|
+
const now = Date.now();
|
|
118
|
+
const result = this.db.prepare('UPDATE knowledge_entries SET verified = 1, verified_by = ?, verified_at = ? WHERE id = ?').run(verifiedBy, now, id);
|
|
119
|
+
if (result.changes > 0) {
|
|
120
|
+
this.eventBus.emit('lesson.approved', { lessonId: id, verifiedBy });
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
async decay() {
|
|
124
|
+
const DAY = 24 * 60 * 60 * 1000;
|
|
125
|
+
const now = Date.now();
|
|
126
|
+
const rows = this.db.prepare('SELECT id, relevance, last_accessed FROM knowledge_entries').all();
|
|
127
|
+
const stmt = this.db.prepare('UPDATE knowledge_entries SET relevance = ? WHERE id = ?');
|
|
128
|
+
const updateAll = this.db.transaction(() => {
|
|
129
|
+
for (const row of rows) {
|
|
130
|
+
const days = row.last_accessed ? (now - row.last_accessed) / DAY : 90;
|
|
131
|
+
const recency = Math.exp(-days / 30);
|
|
132
|
+
const newRelevance = Math.max(0.05, row.relevance * 0.95 + recency * 0.05);
|
|
133
|
+
stmt.run(newRelevance, row.id);
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
updateAll();
|
|
137
|
+
}
|
|
138
|
+
/** Close database connection */
|
|
139
|
+
close() {
|
|
140
|
+
this.db.close();
|
|
141
|
+
}
|
|
142
|
+
/** Get stats */
|
|
143
|
+
stats() {
|
|
144
|
+
const entryCount = this.db.prepare('SELECT COUNT(*) as c FROM knowledge_entries').get().c;
|
|
145
|
+
const verifiedCount = this.db.prepare('SELECT COUNT(*) as c FROM knowledge_entries WHERE verified = 1').get().c;
|
|
146
|
+
const rows = this.db.prepare('SELECT type, COUNT(*) as c FROM knowledge_entries GROUP BY type').all();
|
|
147
|
+
const byType = {};
|
|
148
|
+
for (const r of rows)
|
|
149
|
+
byType[r.type] = r.c;
|
|
150
|
+
return { entryCount, verifiedCount, byType };
|
|
151
|
+
}
|
|
152
|
+
generateId() {
|
|
153
|
+
this.seq = (this.seq + 1) % 10000;
|
|
154
|
+
return `KB-${Date.now()}-${this.seq.toString().padStart(4, '0')}`;
|
|
155
|
+
}
|
|
156
|
+
fromRow(row) {
|
|
157
|
+
return {
|
|
158
|
+
id: row.id,
|
|
159
|
+
type: row.type,
|
|
160
|
+
title: row.title,
|
|
161
|
+
tags: JSON.parse(row.tags),
|
|
162
|
+
contentRef: row.content_ref,
|
|
163
|
+
embeddingId: row.embedding_id ?? undefined,
|
|
164
|
+
relevance: row.relevance,
|
|
165
|
+
accessCount: row.access_count,
|
|
166
|
+
lastAccessed: row.last_accessed ?? undefined,
|
|
167
|
+
verified: row.verified === 1,
|
|
168
|
+
verifiedBy: row.verified_by ?? undefined,
|
|
169
|
+
verifiedAt: row.verified_at ?? undefined,
|
|
170
|
+
createdAt: row.created_at,
|
|
171
|
+
sourceArtifact: row.source_artifact ?? undefined,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
//# 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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"}
|