evo-skills 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.json +36 -0
- package/.prettierrc +11 -0
- package/README.md +227 -0
- package/USER-GUIDE.md +382 -0
- package/dist/cli/commands/diff.d.ts +7 -0
- package/dist/cli/commands/diff.d.ts.map +1 -0
- package/dist/cli/commands/diff.js +126 -0
- package/dist/cli/commands/diff.js.map +1 -0
- package/dist/cli/commands/freeze.d.ts +12 -0
- package/dist/cli/commands/freeze.d.ts.map +1 -0
- package/dist/cli/commands/freeze.js +93 -0
- package/dist/cli/commands/freeze.js.map +1 -0
- package/dist/cli/commands/log.d.ts +7 -0
- package/dist/cli/commands/log.d.ts.map +1 -0
- package/dist/cli/commands/log.js +76 -0
- package/dist/cli/commands/log.js.map +1 -0
- package/dist/cli/commands/rollback.d.ts +7 -0
- package/dist/cli/commands/rollback.d.ts.map +1 -0
- package/dist/cli/commands/rollback.js +92 -0
- package/dist/cli/commands/rollback.js.map +1 -0
- package/dist/cli/commands/status.d.ts +7 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +88 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +25 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/defaults.d.ts +6 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +31 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +68 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +195 -0
- package/dist/config/index.js.map +1 -0
- package/dist/core/evaluator/base-rule.d.ts +50 -0
- package/dist/core/evaluator/base-rule.d.ts.map +1 -0
- package/dist/core/evaluator/base-rule.js +69 -0
- package/dist/core/evaluator/base-rule.js.map +1 -0
- package/dist/core/evaluator/index.d.ts +33 -0
- package/dist/core/evaluator/index.d.ts.map +1 -0
- package/dist/core/evaluator/index.js +74 -0
- package/dist/core/evaluator/index.js.map +1 -0
- package/dist/core/evaluator/rules/repeated-drift.d.ts +19 -0
- package/dist/core/evaluator/rules/repeated-drift.d.ts.map +1 -0
- package/dist/core/evaluator/rules/repeated-drift.js +82 -0
- package/dist/core/evaluator/rules/repeated-drift.js.map +1 -0
- package/dist/core/evaluator/rules/repeated-manual-fix.d.ts +23 -0
- package/dist/core/evaluator/rules/repeated-manual-fix.d.ts.map +1 -0
- package/dist/core/evaluator/rules/repeated-manual-fix.js +97 -0
- package/dist/core/evaluator/rules/repeated-manual-fix.js.map +1 -0
- package/dist/core/journal/index.d.ts +76 -0
- package/dist/core/journal/index.d.ts.map +1 -0
- package/dist/core/journal/index.js +207 -0
- package/dist/core/journal/index.js.map +1 -0
- package/dist/core/observer/base-observer.d.ts +64 -0
- package/dist/core/observer/base-observer.d.ts.map +1 -0
- package/dist/core/observer/base-observer.js +142 -0
- package/dist/core/observer/base-observer.js.map +1 -0
- package/dist/core/observer/codex-observer.d.ts +71 -0
- package/dist/core/observer/codex-observer.d.ts.map +1 -0
- package/dist/core/observer/codex-observer.js +248 -0
- package/dist/core/observer/codex-observer.js.map +1 -0
- package/dist/core/observer/index.d.ts +7 -0
- package/dist/core/observer/index.d.ts.map +1 -0
- package/dist/core/observer/index.js +7 -0
- package/dist/core/observer/index.js.map +1 -0
- package/dist/core/observer/trace-manager.d.ts +82 -0
- package/dist/core/observer/trace-manager.d.ts.map +1 -0
- package/dist/core/observer/trace-manager.js +196 -0
- package/dist/core/observer/trace-manager.js.map +1 -0
- package/dist/core/origin-registry/index.d.ts +59 -0
- package/dist/core/origin-registry/index.d.ts.map +1 -0
- package/dist/core/origin-registry/index.js +235 -0
- package/dist/core/origin-registry/index.js.map +1 -0
- package/dist/core/patch-generator/base-strategy.d.ts +35 -0
- package/dist/core/patch-generator/base-strategy.d.ts.map +1 -0
- package/dist/core/patch-generator/base-strategy.js +55 -0
- package/dist/core/patch-generator/base-strategy.js.map +1 -0
- package/dist/core/patch-generator/index.d.ts +32 -0
- package/dist/core/patch-generator/index.d.ts.map +1 -0
- package/dist/core/patch-generator/index.js +101 -0
- package/dist/core/patch-generator/index.js.map +1 -0
- package/dist/core/patch-generator/strategies/add-fallback.d.ts +11 -0
- package/dist/core/patch-generator/strategies/add-fallback.d.ts.map +1 -0
- package/dist/core/patch-generator/strategies/add-fallback.js +57 -0
- package/dist/core/patch-generator/strategies/add-fallback.js.map +1 -0
- package/dist/core/patch-generator/strategies/prune-noise.d.ts +11 -0
- package/dist/core/patch-generator/strategies/prune-noise.d.ts.map +1 -0
- package/dist/core/patch-generator/strategies/prune-noise.js +48 -0
- package/dist/core/patch-generator/strategies/prune-noise.js.map +1 -0
- package/dist/core/shadow-manager/index.d.ts +65 -0
- package/dist/core/shadow-manager/index.d.ts.map +1 -0
- package/dist/core/shadow-manager/index.js +229 -0
- package/dist/core/shadow-manager/index.js.map +1 -0
- package/dist/core/shadow-registry/index.d.ts +68 -0
- package/dist/core/shadow-registry/index.d.ts.map +1 -0
- package/dist/core/shadow-registry/index.js +173 -0
- package/dist/core/shadow-registry/index.js.map +1 -0
- package/dist/daemon/index.d.ts +43 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +144 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/storage/index.d.ts +7 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +7 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/markdown.d.ts +66 -0
- package/dist/storage/markdown.d.ts.map +1 -0
- package/dist/storage/markdown.js +227 -0
- package/dist/storage/markdown.js.map +1 -0
- package/dist/storage/ndjson.d.ts +118 -0
- package/dist/storage/ndjson.d.ts.map +1 -0
- package/dist/storage/ndjson.js +238 -0
- package/dist/storage/ndjson.js.map +1 -0
- package/dist/storage/sqlite.d.ts +131 -0
- package/dist/storage/sqlite.d.ts.map +1 -0
- package/dist/storage/sqlite.js +415 -0
- package/dist/storage/sqlite.js.map +1 -0
- package/dist/types/index.d.ts +158 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/diff.d.ts +20 -0
- package/dist/utils/diff.d.ts.map +1 -0
- package/dist/utils/diff.js +47 -0
- package/dist/utils/diff.js.map +1 -0
- package/dist/utils/hash.d.ts +17 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +28 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +64 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/path.d.ts +67 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +115 -0
- package/dist/utils/path.js.map +1 -0
- package/docs/ENGINEERING_PLAN.md +1065 -0
- package/docs/PRD.md +1004 -0
- package/docs/PROGRESS.md +523 -0
- package/package.json +60 -0
- package/src/cli/commands/diff.ts +158 -0
- package/src/cli/commands/freeze.ts +108 -0
- package/src/cli/commands/log.ts +87 -0
- package/src/cli/commands/rollback.ts +99 -0
- package/src/cli/commands/status.ts +101 -0
- package/src/cli/index.ts +31 -0
- package/src/config/defaults.ts +32 -0
- package/src/config/index.ts +220 -0
- package/src/core/evaluator/base-rule.ts +90 -0
- package/src/core/evaluator/index.ts +86 -0
- package/src/core/evaluator/rules/repeated-drift.ts +109 -0
- package/src/core/evaluator/rules/repeated-manual-fix.ts +129 -0
- package/src/core/journal/index.ts +286 -0
- package/src/core/observer/base-observer.ts +200 -0
- package/src/core/observer/codex-observer.ts +309 -0
- package/src/core/observer/index.ts +7 -0
- package/src/core/observer/trace-manager.ts +250 -0
- package/src/core/origin-registry/index.ts +264 -0
- package/src/core/patch-generator/base-strategy.ts +67 -0
- package/src/core/patch-generator/index.ts +118 -0
- package/src/core/patch-generator/strategies/add-fallback.ts +69 -0
- package/src/core/patch-generator/strategies/prune-noise.ts +65 -0
- package/src/core/shadow-manager/index.ts +278 -0
- package/src/core/shadow-registry/index.ts +200 -0
- package/src/daemon/index.ts +174 -0
- package/src/storage/index.ts +7 -0
- package/src/storage/markdown.ts +267 -0
- package/src/storage/ndjson.ts +273 -0
- package/src/storage/sqlite.ts +555 -0
- package/src/types/index.ts +212 -0
- package/src/utils/diff.ts +60 -0
- package/src/utils/hash.ts +31 -0
- package/src/utils/index.ts +8 -0
- package/src/utils/logger.ts +78 -0
- package/src/utils/path.ts +129 -0
- package/tests/unit/config.test.ts +65 -0
- package/tests/unit/path.test.ts +89 -0
- package/tests/unit/utils.test.ts +45 -0
- package/tsconfig.json +31 -0
- package/vitest.config.ts +19 -0
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
import initSqlJs, {} from 'sql.js';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
4
|
+
import { createChildLogger } from '../utils/logger.js';
|
|
5
|
+
const logger = createChildLogger('sqlite');
|
|
6
|
+
/**
|
|
7
|
+
* SQLite 存储管理器
|
|
8
|
+
*/
|
|
9
|
+
export class SQLiteStorage {
|
|
10
|
+
db = null;
|
|
11
|
+
dbPath;
|
|
12
|
+
constructor(dbPath) {
|
|
13
|
+
this.dbPath = dbPath;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 初始化数据库
|
|
17
|
+
*/
|
|
18
|
+
async init() {
|
|
19
|
+
// 确保目录存在
|
|
20
|
+
const dir = join(this.dbPath, '..');
|
|
21
|
+
if (!existsSync(dir)) {
|
|
22
|
+
mkdirSync(dir, { recursive: true });
|
|
23
|
+
}
|
|
24
|
+
// 初始化 sql.js
|
|
25
|
+
const SQL = await initSqlJs();
|
|
26
|
+
// 尝试加载现有数据库
|
|
27
|
+
if (existsSync(this.dbPath)) {
|
|
28
|
+
const buffer = readFileSync(this.dbPath);
|
|
29
|
+
this.db = new SQL.Database(buffer);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
this.db = new SQL.Database();
|
|
33
|
+
}
|
|
34
|
+
this.createTables();
|
|
35
|
+
this.save();
|
|
36
|
+
logger.info('Database initialized', { path: this.dbPath });
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 保存数据库到文件
|
|
40
|
+
*/
|
|
41
|
+
save() {
|
|
42
|
+
if (!this.db)
|
|
43
|
+
throw new Error('Database not initialized');
|
|
44
|
+
const data = this.db.export();
|
|
45
|
+
const buffer = Buffer.from(data);
|
|
46
|
+
writeFileSync(this.dbPath, buffer);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 创建表结构
|
|
50
|
+
*/
|
|
51
|
+
createTables() {
|
|
52
|
+
if (!this.db)
|
|
53
|
+
throw new Error('Database not initialized');
|
|
54
|
+
this.db.run(`
|
|
55
|
+
-- Shadow Skills 表
|
|
56
|
+
CREATE TABLE IF NOT EXISTS shadow_skills (
|
|
57
|
+
shadow_id TEXT PRIMARY KEY,
|
|
58
|
+
project_id TEXT NOT NULL,
|
|
59
|
+
skill_id TEXT NOT NULL,
|
|
60
|
+
origin_skill_id TEXT NOT NULL,
|
|
61
|
+
origin_version_at_fork TEXT NOT NULL,
|
|
62
|
+
shadow_path TEXT NOT NULL,
|
|
63
|
+
current_revision INTEGER DEFAULT 0,
|
|
64
|
+
status TEXT DEFAULT 'active',
|
|
65
|
+
created_at TEXT NOT NULL,
|
|
66
|
+
last_optimized_at TEXT,
|
|
67
|
+
hit_count INTEGER DEFAULT 0,
|
|
68
|
+
success_count INTEGER DEFAULT 0,
|
|
69
|
+
manual_override_count INTEGER DEFAULT 0,
|
|
70
|
+
health_score REAL DEFAULT 100.0,
|
|
71
|
+
UNIQUE(project_id, skill_id)
|
|
72
|
+
);
|
|
73
|
+
`);
|
|
74
|
+
this.db.run(`
|
|
75
|
+
CREATE TABLE IF NOT EXISTS evolution_records_index (
|
|
76
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
77
|
+
shadow_id TEXT NOT NULL,
|
|
78
|
+
revision INTEGER NOT NULL,
|
|
79
|
+
timestamp TEXT NOT NULL,
|
|
80
|
+
change_type TEXT NOT NULL,
|
|
81
|
+
source_sessions TEXT,
|
|
82
|
+
confidence REAL,
|
|
83
|
+
FOREIGN KEY (shadow_id) REFERENCES shadow_skills(shadow_id)
|
|
84
|
+
);
|
|
85
|
+
`);
|
|
86
|
+
this.db.run(`
|
|
87
|
+
CREATE TABLE IF NOT EXISTS snapshots (
|
|
88
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
89
|
+
shadow_id TEXT NOT NULL,
|
|
90
|
+
revision INTEGER NOT NULL,
|
|
91
|
+
timestamp TEXT NOT NULL,
|
|
92
|
+
file_path TEXT NOT NULL,
|
|
93
|
+
content_hash TEXT NOT NULL,
|
|
94
|
+
FOREIGN KEY (shadow_id) REFERENCES shadow_skills(shadow_id)
|
|
95
|
+
);
|
|
96
|
+
`);
|
|
97
|
+
this.db.run(`
|
|
98
|
+
CREATE TABLE IF NOT EXISTS sessions (
|
|
99
|
+
session_id TEXT PRIMARY KEY,
|
|
100
|
+
runtime TEXT NOT NULL,
|
|
101
|
+
project_id TEXT,
|
|
102
|
+
started_at TEXT NOT NULL,
|
|
103
|
+
ended_at TEXT,
|
|
104
|
+
trace_count INTEGER DEFAULT 0
|
|
105
|
+
);
|
|
106
|
+
`);
|
|
107
|
+
this.db.run(`
|
|
108
|
+
CREATE TABLE IF NOT EXISTS traces_index (
|
|
109
|
+
trace_id TEXT PRIMARY KEY,
|
|
110
|
+
session_id TEXT NOT NULL,
|
|
111
|
+
runtime TEXT NOT NULL,
|
|
112
|
+
event_type TEXT NOT NULL,
|
|
113
|
+
timestamp TEXT NOT NULL,
|
|
114
|
+
status TEXT,
|
|
115
|
+
FOREIGN KEY (session_id) REFERENCES sessions(session_id)
|
|
116
|
+
);
|
|
117
|
+
`);
|
|
118
|
+
// 创建索引
|
|
119
|
+
this.db.run('CREATE INDEX IF NOT EXISTS idx_shadow_project ON shadow_skills(project_id);');
|
|
120
|
+
this.db.run('CREATE INDEX IF NOT EXISTS idx_evolution_shadow ON evolution_records_index(shadow_id);');
|
|
121
|
+
this.db.run('CREATE INDEX IF NOT EXISTS idx_traces_session ON traces_index(session_id);');
|
|
122
|
+
this.db.run('CREATE INDEX IF NOT EXISTS idx_traces_timestamp ON traces_index(timestamp);');
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* 关闭数据库连接
|
|
126
|
+
*/
|
|
127
|
+
close() {
|
|
128
|
+
if (this.db) {
|
|
129
|
+
this.save();
|
|
130
|
+
this.db.close();
|
|
131
|
+
this.db = null;
|
|
132
|
+
logger.info('Database closed');
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// ==================== Shadow Skills ====================
|
|
136
|
+
/**
|
|
137
|
+
* 插入或更新 shadow skill
|
|
138
|
+
*/
|
|
139
|
+
upsertShadowSkill(shadow) {
|
|
140
|
+
if (!this.db)
|
|
141
|
+
throw new Error('Database not initialized');
|
|
142
|
+
this.db.run(`INSERT OR REPLACE INTO shadow_skills (
|
|
143
|
+
shadow_id, project_id, skill_id, origin_skill_id, origin_version_at_fork,
|
|
144
|
+
shadow_path, current_revision, status, created_at, last_optimized_at,
|
|
145
|
+
hit_count, success_count, manual_override_count, health_score
|
|
146
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
147
|
+
shadow.shadow_id,
|
|
148
|
+
shadow.project_id,
|
|
149
|
+
shadow.skill_id,
|
|
150
|
+
shadow.origin_skill_id,
|
|
151
|
+
shadow.origin_version_at_fork,
|
|
152
|
+
shadow.shadow_path,
|
|
153
|
+
shadow.current_revision,
|
|
154
|
+
shadow.status,
|
|
155
|
+
shadow.created_at,
|
|
156
|
+
shadow.last_optimized_at,
|
|
157
|
+
0,
|
|
158
|
+
0,
|
|
159
|
+
0,
|
|
160
|
+
100.0,
|
|
161
|
+
]);
|
|
162
|
+
this.save();
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* 获取 shadow skill
|
|
166
|
+
*/
|
|
167
|
+
getShadowSkill(projectId, skillId) {
|
|
168
|
+
if (!this.db)
|
|
169
|
+
throw new Error('Database not initialized');
|
|
170
|
+
const stmt = this.db.prepare('SELECT * FROM shadow_skills WHERE project_id = ? AND skill_id = ?');
|
|
171
|
+
stmt.bind([projectId, skillId]);
|
|
172
|
+
if (!stmt.step()) {
|
|
173
|
+
stmt.free();
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
const row = stmt.getAsObject();
|
|
177
|
+
stmt.free();
|
|
178
|
+
return {
|
|
179
|
+
project_id: row.project_id,
|
|
180
|
+
skill_id: row.skill_id,
|
|
181
|
+
shadow_id: row.shadow_id,
|
|
182
|
+
origin_skill_id: row.origin_skill_id,
|
|
183
|
+
origin_version_at_fork: row.origin_version_at_fork,
|
|
184
|
+
shadow_path: row.shadow_path,
|
|
185
|
+
current_revision: row.current_revision,
|
|
186
|
+
status: row.status,
|
|
187
|
+
created_at: row.created_at,
|
|
188
|
+
last_optimized_at: row.last_optimized_at,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* 列出项目的所有 shadow skills
|
|
193
|
+
*/
|
|
194
|
+
listShadowSkills(projectId) {
|
|
195
|
+
if (!this.db)
|
|
196
|
+
throw new Error('Database not initialized');
|
|
197
|
+
const stmt = this.db.prepare('SELECT * FROM shadow_skills WHERE project_id = ? ORDER BY created_at DESC');
|
|
198
|
+
stmt.bind([projectId]);
|
|
199
|
+
const results = [];
|
|
200
|
+
while (stmt.step()) {
|
|
201
|
+
const row = stmt.getAsObject();
|
|
202
|
+
results.push({
|
|
203
|
+
project_id: row.project_id,
|
|
204
|
+
skill_id: row.skill_id,
|
|
205
|
+
shadow_id: row.shadow_id,
|
|
206
|
+
origin_skill_id: row.origin_skill_id,
|
|
207
|
+
origin_version_at_fork: row.origin_version_at_fork,
|
|
208
|
+
shadow_path: row.shadow_path,
|
|
209
|
+
current_revision: row.current_revision,
|
|
210
|
+
status: row.status,
|
|
211
|
+
created_at: row.created_at,
|
|
212
|
+
last_optimized_at: row.last_optimized_at,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
stmt.free();
|
|
216
|
+
return results;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* 更新 shadow skill 状态
|
|
220
|
+
*/
|
|
221
|
+
updateShadowStatus(shadowId, status) {
|
|
222
|
+
if (!this.db)
|
|
223
|
+
throw new Error('Database not initialized');
|
|
224
|
+
this.db.run('UPDATE shadow_skills SET status = ? WHERE shadow_id = ?', [status, shadowId]);
|
|
225
|
+
this.save();
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* 更新 shadow skill revision
|
|
229
|
+
*/
|
|
230
|
+
updateShadowRevision(shadowId, revision) {
|
|
231
|
+
if (!this.db)
|
|
232
|
+
throw new Error('Database not initialized');
|
|
233
|
+
this.db.run('UPDATE shadow_skills SET current_revision = ? WHERE shadow_id = ?', [revision, shadowId]);
|
|
234
|
+
this.save();
|
|
235
|
+
}
|
|
236
|
+
// ==================== Sessions ====================
|
|
237
|
+
/**
|
|
238
|
+
* 创建 session
|
|
239
|
+
*/
|
|
240
|
+
createSession(session) {
|
|
241
|
+
if (!this.db)
|
|
242
|
+
throw new Error('Database not initialized');
|
|
243
|
+
this.db.run('INSERT INTO sessions (session_id, runtime, project_id, started_at, ended_at, trace_count) VALUES (?, ?, ?, ?, ?, ?)', [
|
|
244
|
+
session.session_id,
|
|
245
|
+
session.runtime,
|
|
246
|
+
session.project_id,
|
|
247
|
+
session.started_at,
|
|
248
|
+
session.ended_at,
|
|
249
|
+
session.trace_count,
|
|
250
|
+
]);
|
|
251
|
+
this.save();
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* 获取 session
|
|
255
|
+
*/
|
|
256
|
+
getSession(sessionId) {
|
|
257
|
+
if (!this.db)
|
|
258
|
+
throw new Error('Database not initialized');
|
|
259
|
+
const stmt = this.db.prepare('SELECT * FROM sessions WHERE session_id = ?');
|
|
260
|
+
stmt.bind([sessionId]);
|
|
261
|
+
if (!stmt.step()) {
|
|
262
|
+
stmt.free();
|
|
263
|
+
return null;
|
|
264
|
+
}
|
|
265
|
+
const row = stmt.getAsObject();
|
|
266
|
+
stmt.free();
|
|
267
|
+
return {
|
|
268
|
+
session_id: row.session_id,
|
|
269
|
+
runtime: row.runtime,
|
|
270
|
+
project_id: row.project_id,
|
|
271
|
+
started_at: row.started_at,
|
|
272
|
+
ended_at: row.ended_at,
|
|
273
|
+
trace_count: row.trace_count,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* 更新 session trace 计数
|
|
278
|
+
*/
|
|
279
|
+
incrementSessionTraceCount(sessionId) {
|
|
280
|
+
if (!this.db)
|
|
281
|
+
throw new Error('Database not initialized');
|
|
282
|
+
this.db.run('UPDATE sessions SET trace_count = trace_count + 1 WHERE session_id = ?', [sessionId]);
|
|
283
|
+
this.save();
|
|
284
|
+
}
|
|
285
|
+
// ==================== Traces Index ====================
|
|
286
|
+
/**
|
|
287
|
+
* 添加 trace 索引记录
|
|
288
|
+
*/
|
|
289
|
+
addTraceIndex(trace) {
|
|
290
|
+
if (!this.db)
|
|
291
|
+
throw new Error('Database not initialized');
|
|
292
|
+
this.db.run('INSERT INTO traces_index (trace_id, session_id, runtime, event_type, timestamp, status) VALUES (?, ?, ?, ?, ?, ?)', [trace.trace_id, trace.session_id, trace.runtime, trace.event_type, trace.timestamp, trace.status]);
|
|
293
|
+
this.save();
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* 获取 session 的 trace 索引
|
|
297
|
+
*/
|
|
298
|
+
getTraceIndexBySession(sessionId, limit = 100) {
|
|
299
|
+
if (!this.db)
|
|
300
|
+
throw new Error('Database not initialized');
|
|
301
|
+
const stmt = this.db.prepare('SELECT trace_id, event_type, timestamp, status FROM traces_index WHERE session_id = ? ORDER BY timestamp DESC LIMIT ?');
|
|
302
|
+
stmt.bind([sessionId, limit]);
|
|
303
|
+
const results = [];
|
|
304
|
+
while (stmt.step()) {
|
|
305
|
+
const row = stmt.getAsObject();
|
|
306
|
+
results.push({
|
|
307
|
+
trace_id: row.trace_id,
|
|
308
|
+
event_type: row.event_type,
|
|
309
|
+
timestamp: row.timestamp,
|
|
310
|
+
status: row.status,
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
stmt.free();
|
|
314
|
+
return results;
|
|
315
|
+
}
|
|
316
|
+
// ==================== Evolution Records Index ====================
|
|
317
|
+
/**
|
|
318
|
+
* 添加演化记录索引
|
|
319
|
+
*/
|
|
320
|
+
addEvolutionRecordIndex(record) {
|
|
321
|
+
if (!this.db)
|
|
322
|
+
throw new Error('Database not initialized');
|
|
323
|
+
this.db.run('INSERT INTO evolution_records_index (shadow_id, revision, timestamp, change_type, source_sessions, confidence) VALUES (?, ?, ?, ?, ?, ?)', [
|
|
324
|
+
record.shadow_id,
|
|
325
|
+
record.revision,
|
|
326
|
+
record.timestamp,
|
|
327
|
+
record.change_type,
|
|
328
|
+
JSON.stringify(record.source_sessions),
|
|
329
|
+
record.confidence,
|
|
330
|
+
]);
|
|
331
|
+
this.save();
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* 获取 shadow 的演化记录索引
|
|
335
|
+
*/
|
|
336
|
+
getEvolutionRecordIndex(shadowId, limit = 50) {
|
|
337
|
+
if (!this.db)
|
|
338
|
+
throw new Error('Database not initialized');
|
|
339
|
+
const stmt = this.db.prepare('SELECT * FROM evolution_records_index WHERE shadow_id = ? ORDER BY revision DESC LIMIT ?');
|
|
340
|
+
stmt.bind([shadowId, limit]);
|
|
341
|
+
const results = [];
|
|
342
|
+
while (stmt.step()) {
|
|
343
|
+
const row = stmt.getAsObject();
|
|
344
|
+
results.push({
|
|
345
|
+
id: row.id,
|
|
346
|
+
revision: row.revision,
|
|
347
|
+
timestamp: row.timestamp,
|
|
348
|
+
change_type: row.change_type,
|
|
349
|
+
source_sessions: JSON.parse(row.source_sessions),
|
|
350
|
+
confidence: row.confidence,
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
stmt.free();
|
|
354
|
+
return results;
|
|
355
|
+
}
|
|
356
|
+
// ==================== Snapshots ====================
|
|
357
|
+
/**
|
|
358
|
+
* 添加 snapshot 记录
|
|
359
|
+
*/
|
|
360
|
+
addSnapshot(snapshot) {
|
|
361
|
+
if (!this.db)
|
|
362
|
+
throw new Error('Database not initialized');
|
|
363
|
+
this.db.run('INSERT INTO snapshots (shadow_id, revision, timestamp, file_path, content_hash) VALUES (?, ?, ?, ?, ?)', [snapshot.shadow_id, snapshot.revision, snapshot.timestamp, snapshot.file_path, snapshot.content_hash]);
|
|
364
|
+
this.save();
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* 获取 shadow 的 snapshots
|
|
368
|
+
*/
|
|
369
|
+
getSnapshots(shadowId) {
|
|
370
|
+
if (!this.db)
|
|
371
|
+
throw new Error('Database not initialized');
|
|
372
|
+
const stmt = this.db.prepare('SELECT * FROM snapshots WHERE shadow_id = ? ORDER BY revision DESC');
|
|
373
|
+
stmt.bind([shadowId]);
|
|
374
|
+
const results = [];
|
|
375
|
+
while (stmt.step()) {
|
|
376
|
+
const row = stmt.getAsObject();
|
|
377
|
+
results.push({
|
|
378
|
+
id: row.id,
|
|
379
|
+
revision: row.revision,
|
|
380
|
+
timestamp: row.timestamp,
|
|
381
|
+
file_path: row.file_path,
|
|
382
|
+
content_hash: row.content_hash,
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
stmt.free();
|
|
386
|
+
return results;
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* 获取最新的 snapshot
|
|
390
|
+
*/
|
|
391
|
+
getLatestSnapshot(shadowId) {
|
|
392
|
+
if (!this.db)
|
|
393
|
+
throw new Error('Database not initialized');
|
|
394
|
+
const stmt = this.db.prepare('SELECT * FROM snapshots WHERE shadow_id = ? ORDER BY revision DESC LIMIT 1');
|
|
395
|
+
stmt.bind([shadowId]);
|
|
396
|
+
if (!stmt.step()) {
|
|
397
|
+
stmt.free();
|
|
398
|
+
return null;
|
|
399
|
+
}
|
|
400
|
+
const row = stmt.getAsObject();
|
|
401
|
+
stmt.free();
|
|
402
|
+
return {
|
|
403
|
+
id: row.id,
|
|
404
|
+
revision: row.revision,
|
|
405
|
+
timestamp: row.timestamp,
|
|
406
|
+
file_path: row.file_path,
|
|
407
|
+
content_hash: row.content_hash,
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
// 导出工厂函数
|
|
412
|
+
export function createSQLiteStorage(dbPath) {
|
|
413
|
+
return new SQLiteStorage(dbPath);
|
|
414
|
+
}
|
|
415
|
+
//# sourceMappingURL=sqlite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/storage/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,EAAE,EAAiB,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAGvD,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;AAE3C;;GAEG;AACH,MAAM,OAAO,aAAa;IAChB,EAAE,GAAoB,IAAI,CAAC;IAC3B,MAAM,CAAS;IAEvB,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,SAAS;QACT,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC;QAED,aAAa;QACb,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;QAE9B,YAAY;QACZ,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACzC,IAAI,CAAC,EAAE,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,EAAE,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC/B,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED;;OAEG;IACK,IAAI;QACV,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACK,YAAY;QAClB,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAE1D,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;KAmBX,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;;;;;;;;;;;KAWX,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;;;;;;;;;;KAUX,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;;;;;;;;;KASX,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;;;;;;;;;;KAUX,CAAC,CAAC;QAEH,OAAO;QACP,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAC;QAC3F,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,wFAAwF,CAAC,CAAC;QACtG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,4EAA4E,CAAC,CAAC;QAC1F,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAC;IAC7F,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,0DAA0D;IAE1D;;OAEG;IACH,iBAAiB,CAAC,MAA0B;QAC1C,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAE1D,IAAI,CAAC,EAAE,CAAC,GAAG,CACT;;;;0DAIoD,EACpD;YACE,MAAM,CAAC,SAAS;YAChB,MAAM,CAAC,UAAU;YACjB,MAAM,CAAC,QAAQ;YACf,MAAM,CAAC,eAAe;YACtB,MAAM,CAAC,sBAAsB;YAC7B,MAAM,CAAC,WAAW;YAClB,MAAM,CAAC,gBAAgB;YACvB,MAAM,CAAC,MAAM;YACb,MAAM,CAAC,UAAU;YACjB,MAAM,CAAC,iBAAiB;YACxB,CAAC;YACD,CAAC;YACD,CAAC;YACD,KAAK;SACN,CACF,CAAC;QACF,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,SAAiB,EAAE,OAAe;QAC/C,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAE1D,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,mEAAmE,CACpE,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;QAEhC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACjB,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;QAEZ,OAAO;YACL,UAAU,EAAE,GAAG,CAAC,UAAoB;YACpC,QAAQ,EAAE,GAAG,CAAC,QAAkB;YAChC,SAAS,EAAE,GAAG,CAAC,SAAmB;YAClC,eAAe,EAAE,GAAG,CAAC,eAAyB;YAC9C,sBAAsB,EAAE,GAAG,CAAC,sBAAgC;YAC5D,WAAW,EAAE,GAAG,CAAC,WAAqB;YACtC,gBAAgB,EAAE,GAAG,CAAC,gBAA0B;YAChD,MAAM,EAAE,GAAG,CAAC,MAAsB;YAClC,UAAU,EAAE,GAAG,CAAC,UAAoB;YACpC,iBAAiB,EAAE,GAAG,CAAC,iBAA2B;SACnD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,SAAiB;QAChC,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAE1D,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,2EAA2E,CAC5E,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAEvB,MAAM,OAAO,GAAyB,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACnB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC;gBACX,UAAU,EAAE,GAAG,CAAC,UAAoB;gBACpC,QAAQ,EAAE,GAAG,CAAC,QAAkB;gBAChC,SAAS,EAAE,GAAG,CAAC,SAAmB;gBAClC,eAAe,EAAE,GAAG,CAAC,eAAyB;gBAC9C,sBAAsB,EAAE,GAAG,CAAC,sBAAgC;gBAC5D,WAAW,EAAE,GAAG,CAAC,WAAqB;gBACtC,gBAAgB,EAAE,GAAG,CAAC,gBAA0B;gBAChD,MAAM,EAAE,GAAG,CAAC,MAAsB;gBAClC,UAAU,EAAE,GAAG,CAAC,UAAoB;gBACpC,iBAAiB,EAAE,GAAG,CAAC,iBAA2B;aACnD,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,CAAC;QAEZ,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,QAAgB,EAAE,MAAoB;QACvD,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC1D,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,yDAAyD,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC3F,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,QAAgB,EAAE,QAAgB;QACrD,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC1D,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,mEAAmE,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;QACvG,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,qDAAqD;IAErD;;OAEG;IACH,aAAa,CAAC,OAAgB;QAC5B,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAE1D,IAAI,CAAC,EAAE,CAAC,GAAG,CACT,qHAAqH,EACrH;YACE,OAAO,CAAC,UAAU;YAClB,OAAO,CAAC,OAAO;YACf,OAAO,CAAC,UAAU;YAClB,OAAO,CAAC,UAAU;YAClB,OAAO,CAAC,QAAQ;YAChB,OAAO,CAAC,WAAW;SACpB,CACF,CAAC;QACF,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,SAAiB;QAC1B,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAE1D,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC;QAC5E,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAEvB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACjB,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;QAEZ,OAAO;YACL,UAAU,EAAE,GAAG,CAAC,UAAoB;YACpC,OAAO,EAAE,GAAG,CAAC,OAAsB;YACnC,UAAU,EAAE,GAAG,CAAC,UAA2B;YAC3C,UAAU,EAAE,GAAG,CAAC,UAAoB;YACpC,QAAQ,EAAE,GAAG,CAAC,QAAyB;YACvC,WAAW,EAAE,GAAG,CAAC,WAAqB;SACvC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,0BAA0B,CAAC,SAAiB;QAC1C,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC1D,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,wEAAwE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;QACnG,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,yDAAyD;IAEzD;;OAEG;IACH,aAAa,CAAC,KAOb;QACC,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAE1D,IAAI,CAAC,EAAE,CAAC,GAAG,CACT,mHAAmH,EACnH,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CACnG,CAAC;QACF,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED;;OAEG;IACH,sBAAsB,CAAC,SAAiB,EAAE,KAAK,GAAG,GAAG;QAMnD,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAE1D,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,uHAAuH,CACxH,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;QAE9B,MAAM,OAAO,GAKR,EAAE,CAAC;QAER,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACnB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC;gBACX,QAAQ,EAAE,GAAG,CAAC,QAAkB;gBAChC,UAAU,EAAE,GAAG,CAAC,UAAoB;gBACpC,SAAS,EAAE,GAAG,CAAC,SAAmB;gBAClC,MAAM,EAAE,GAAG,CAAC,MAAgB;aAC7B,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,CAAC;QAEZ,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,oEAAoE;IAEpE;;OAEG;IACH,uBAAuB,CAAC,MAOvB;QACC,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAE1D,IAAI,CAAC,EAAE,CAAC,GAAG,CACT,0IAA0I,EAC1I;YACE,MAAM,CAAC,SAAS;YAChB,MAAM,CAAC,QAAQ;YACf,MAAM,CAAC,SAAS;YAChB,MAAM,CAAC,WAAW;YAClB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,eAAe,CAAC;YACtC,MAAM,CAAC,UAAU;SAClB,CACF,CAAC;QACF,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED;;OAEG;IACH,uBAAuB,CAAC,QAAgB,EAAE,KAAK,GAAG,EAAE;QAQlD,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAE1D,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,0FAA0F,CAC3F,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;QAE7B,MAAM,OAAO,GAOR,EAAE,CAAC;QAER,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACnB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC;gBACX,EAAE,EAAE,GAAG,CAAC,EAAY;gBACpB,QAAQ,EAAE,GAAG,CAAC,QAAkB;gBAChC,SAAS,EAAE,GAAG,CAAC,SAAmB;gBAClC,WAAW,EAAE,GAAG,CAAC,WAAqB;gBACtC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,eAAyB,CAAa;gBACtE,UAAU,EAAE,GAAG,CAAC,UAAoB;aACrC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,CAAC;QAEZ,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,sDAAsD;IAEtD;;OAEG;IACH,WAAW,CAAC,QAMX;QACC,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAE1D,IAAI,CAAC,EAAE,CAAC,GAAG,CACT,wGAAwG,EACxG,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,YAAY,CAAC,CACvG,CAAC;QACF,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,QAAgB;QAO3B,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAE1D,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,oEAAoE,CACrE,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEtB,MAAM,OAAO,GAMR,EAAE,CAAC;QAER,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACnB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC;gBACX,EAAE,EAAE,GAAG,CAAC,EAAY;gBACpB,QAAQ,EAAE,GAAG,CAAC,QAAkB;gBAChC,SAAS,EAAE,GAAG,CAAC,SAAmB;gBAClC,SAAS,EAAE,GAAG,CAAC,SAAmB;gBAClC,YAAY,EAAE,GAAG,CAAC,YAAsB;aACzC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,CAAC;QAEZ,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,QAAgB;QAOhC,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAE1D,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,4EAA4E,CAC7E,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEtB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACjB,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;QAEZ,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAY;YACpB,QAAQ,EAAE,GAAG,CAAC,QAAkB;YAChC,SAAS,EAAE,GAAG,CAAC,SAAmB;YAClC,SAAS,EAAE,GAAG,CAAC,SAAmB;YAClC,YAAY,EAAE,GAAG,CAAC,YAAsB;SACzC,CAAC;IACJ,CAAC;CACF;AAED,SAAS;AACT,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 全局类型定义入口
|
|
3
|
+
*/
|
|
4
|
+
export interface OriginSkill {
|
|
5
|
+
skill_id: string;
|
|
6
|
+
origin_path: string;
|
|
7
|
+
origin_version: string;
|
|
8
|
+
source: 'local' | 'marketplace' | 'git';
|
|
9
|
+
installed_at: string;
|
|
10
|
+
last_seen_at: string;
|
|
11
|
+
}
|
|
12
|
+
export type ShadowStatus = 'active' | 'frozen' | 'rebasing' | 'needs_attention';
|
|
13
|
+
export interface ProjectSkillShadow {
|
|
14
|
+
project_id: string;
|
|
15
|
+
skill_id: string;
|
|
16
|
+
shadow_id: string;
|
|
17
|
+
origin_skill_id: string;
|
|
18
|
+
origin_version_at_fork: string;
|
|
19
|
+
shadow_path: string;
|
|
20
|
+
current_revision: number;
|
|
21
|
+
status: ShadowStatus;
|
|
22
|
+
created_at: string;
|
|
23
|
+
last_optimized_at: string;
|
|
24
|
+
}
|
|
25
|
+
export interface ShadowSkillState {
|
|
26
|
+
shadow_id: string;
|
|
27
|
+
current_content_hash: string;
|
|
28
|
+
current_revision: number;
|
|
29
|
+
last_hit_at: string;
|
|
30
|
+
last_optimized_at: string;
|
|
31
|
+
hit_count: number;
|
|
32
|
+
success_count: number;
|
|
33
|
+
manual_override_count: number;
|
|
34
|
+
health_score: number;
|
|
35
|
+
}
|
|
36
|
+
export type ChangeType = 'append_context' | 'tighten_trigger' | 'add_fallback' | 'prune_noise' | 'rewrite_section';
|
|
37
|
+
export interface EvolutionRecord {
|
|
38
|
+
revision: number;
|
|
39
|
+
shadow_id: string;
|
|
40
|
+
timestamp: string;
|
|
41
|
+
reason: string;
|
|
42
|
+
source_sessions: string[];
|
|
43
|
+
change_type: ChangeType;
|
|
44
|
+
patch: string;
|
|
45
|
+
before_hash: string;
|
|
46
|
+
after_hash: string;
|
|
47
|
+
applied_by: 'auto' | 'manual';
|
|
48
|
+
}
|
|
49
|
+
export interface SnapshotInfo {
|
|
50
|
+
revision: number;
|
|
51
|
+
timestamp: string;
|
|
52
|
+
file_path: string;
|
|
53
|
+
content_hash: string;
|
|
54
|
+
}
|
|
55
|
+
export type TraceEventType = 'user_input' | 'assistant_output' | 'tool_call' | 'tool_result' | 'file_change' | 'retry' | 'status';
|
|
56
|
+
export type TraceStatus = 'success' | 'failure' | 'retry' | 'interrupted';
|
|
57
|
+
export type RuntimeType = 'codex' | 'opencode' | 'claude';
|
|
58
|
+
export interface Trace {
|
|
59
|
+
trace_id: string;
|
|
60
|
+
runtime: RuntimeType;
|
|
61
|
+
session_id: string;
|
|
62
|
+
turn_id: string;
|
|
63
|
+
event_type: TraceEventType;
|
|
64
|
+
timestamp: string;
|
|
65
|
+
user_input?: string;
|
|
66
|
+
assistant_output?: string;
|
|
67
|
+
tool_name?: string;
|
|
68
|
+
tool_args?: Record<string, unknown>;
|
|
69
|
+
tool_result?: Record<string, unknown>;
|
|
70
|
+
files_changed?: string[];
|
|
71
|
+
status: TraceStatus;
|
|
72
|
+
metadata?: Record<string, unknown>;
|
|
73
|
+
}
|
|
74
|
+
export interface EvaluationResult {
|
|
75
|
+
should_patch: boolean;
|
|
76
|
+
change_type?: ChangeType;
|
|
77
|
+
reason?: string;
|
|
78
|
+
source_sessions: string[];
|
|
79
|
+
confidence: number;
|
|
80
|
+
target_section?: string;
|
|
81
|
+
}
|
|
82
|
+
export interface PatchResult {
|
|
83
|
+
success: boolean;
|
|
84
|
+
patch: string;
|
|
85
|
+
newContent: string;
|
|
86
|
+
changeType: ChangeType;
|
|
87
|
+
error?: string;
|
|
88
|
+
}
|
|
89
|
+
export interface AutoOptimizePolicy {
|
|
90
|
+
min_signal_count: number;
|
|
91
|
+
min_source_sessions: number;
|
|
92
|
+
min_confidence: number;
|
|
93
|
+
cooldown_hours: number;
|
|
94
|
+
max_patches_per_day: number;
|
|
95
|
+
pause_after_rollback_hours: number;
|
|
96
|
+
}
|
|
97
|
+
export interface Session {
|
|
98
|
+
session_id: string;
|
|
99
|
+
runtime: RuntimeType;
|
|
100
|
+
project_id: string | null;
|
|
101
|
+
started_at: string;
|
|
102
|
+
ended_at: string | null;
|
|
103
|
+
trace_count: number;
|
|
104
|
+
}
|
|
105
|
+
export interface Snapshot extends SnapshotInfo {
|
|
106
|
+
shadow_id: string;
|
|
107
|
+
content: string;
|
|
108
|
+
}
|
|
109
|
+
export interface JournalQueryOptions {
|
|
110
|
+
fromRevision?: number;
|
|
111
|
+
toRevision?: number;
|
|
112
|
+
limit?: number;
|
|
113
|
+
changeType?: ChangeType;
|
|
114
|
+
}
|
|
115
|
+
export interface CliOutput {
|
|
116
|
+
success: boolean;
|
|
117
|
+
message: string;
|
|
118
|
+
data?: unknown;
|
|
119
|
+
error?: string;
|
|
120
|
+
}
|
|
121
|
+
export interface EVOConfig {
|
|
122
|
+
origin_paths: {
|
|
123
|
+
paths: string[];
|
|
124
|
+
};
|
|
125
|
+
observer: {
|
|
126
|
+
enabled_runtimes: RuntimeType[];
|
|
127
|
+
trace_retention_days: number;
|
|
128
|
+
};
|
|
129
|
+
evaluator: {
|
|
130
|
+
min_signal_count: number;
|
|
131
|
+
min_source_sessions: number;
|
|
132
|
+
min_confidence: number;
|
|
133
|
+
};
|
|
134
|
+
patch: {
|
|
135
|
+
allowed_types: ChangeType[];
|
|
136
|
+
cooldown_hours: number;
|
|
137
|
+
max_patches_per_day: number;
|
|
138
|
+
};
|
|
139
|
+
journal: {
|
|
140
|
+
snapshot_interval: number;
|
|
141
|
+
max_snapshots: number;
|
|
142
|
+
};
|
|
143
|
+
daemon: {
|
|
144
|
+
auto_start: boolean;
|
|
145
|
+
log_level: 'debug' | 'info' | 'warn' | 'error';
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
export interface ProjectConfig {
|
|
149
|
+
project: {
|
|
150
|
+
name: string;
|
|
151
|
+
auto_optimize: boolean;
|
|
152
|
+
};
|
|
153
|
+
skills: Record<string, {
|
|
154
|
+
auto_optimize?: boolean;
|
|
155
|
+
allowed_patch_types?: ChangeType[];
|
|
156
|
+
}>;
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 计算两个字符串的差异
|
|
3
|
+
*/
|
|
4
|
+
export declare function computeDiff(oldContent: string, newContent: string): string;
|
|
5
|
+
/**
|
|
6
|
+
* 生成 unified diff 格式的 patch
|
|
7
|
+
*/
|
|
8
|
+
export declare function createUnifiedDiff(fileName: string, oldContent: string, newContent: string, oldHeader?: string, newHeader?: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* 检查内容是否有变化
|
|
11
|
+
*/
|
|
12
|
+
export declare function hasChanges(oldContent: string, newContent: string): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* 统计差异行数
|
|
15
|
+
*/
|
|
16
|
+
export declare function countChanges(oldContent: string, newContent: string): {
|
|
17
|
+
added: number;
|
|
18
|
+
removed: number;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/utils/diff.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAY1E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAER;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAE1E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB,CAcA"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { diffLines, createPatch } from 'diff';
|
|
2
|
+
/**
|
|
3
|
+
* 计算两个字符串的差异
|
|
4
|
+
*/
|
|
5
|
+
export function computeDiff(oldContent, newContent) {
|
|
6
|
+
const differences = diffLines(oldContent, newContent);
|
|
7
|
+
return differences
|
|
8
|
+
.map((part) => {
|
|
9
|
+
const prefix = part.added ? '+' : part.removed ? '-' : ' ';
|
|
10
|
+
return part.value
|
|
11
|
+
.split('\n')
|
|
12
|
+
.filter((line) => line.length > 0)
|
|
13
|
+
.map((line) => `${prefix} ${line}`)
|
|
14
|
+
.join('\n');
|
|
15
|
+
})
|
|
16
|
+
.join('\n');
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 生成 unified diff 格式的 patch
|
|
20
|
+
*/
|
|
21
|
+
export function createUnifiedDiff(fileName, oldContent, newContent, oldHeader, newHeader) {
|
|
22
|
+
return createPatch(fileName, oldContent, newContent, oldHeader, newHeader);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 检查内容是否有变化
|
|
26
|
+
*/
|
|
27
|
+
export function hasChanges(oldContent, newContent) {
|
|
28
|
+
return oldContent !== newContent;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 统计差异行数
|
|
32
|
+
*/
|
|
33
|
+
export function countChanges(oldContent, newContent) {
|
|
34
|
+
const differences = diffLines(oldContent, newContent);
|
|
35
|
+
let added = 0;
|
|
36
|
+
let removed = 0;
|
|
37
|
+
for (const part of differences) {
|
|
38
|
+
if (part.added) {
|
|
39
|
+
added += part.count ?? 0;
|
|
40
|
+
}
|
|
41
|
+
else if (part.removed) {
|
|
42
|
+
removed += part.count ?? 0;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return { added, removed };
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/utils/diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAE9C;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,UAAkB,EAAE,UAAkB;IAChE,MAAM,WAAW,GAAG,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACtD,OAAO,WAAW;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAC3D,OAAO,IAAI,CAAC,KAAK;aACd,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;aACjC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC;aAClC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAgB,EAChB,UAAkB,EAClB,UAAkB,EAClB,SAAkB,EAClB,SAAkB;IAElB,OAAO,WAAW,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAC7E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,UAAkB,EAAE,UAAkB;IAC/D,OAAO,UAAU,KAAK,UAAU,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,UAAkB,EAAE,UAAkB;IAIjE,MAAM,WAAW,GAAG,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACtD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QAC3B,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACxB,OAAO,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC5B,CAAC"}
|