@hongmaple0820/scale-engine 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.
Files changed (78) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +64 -0
  3. package/dist/adapters/ClaudeCodeAdapter.d.ts +48 -0
  4. package/dist/adapters/ClaudeCodeAdapter.js +188 -0
  5. package/dist/adapters/ClaudeCodeAdapter.js.map +1 -0
  6. package/dist/adapters/CodexAdapter.d.ts +14 -0
  7. package/dist/adapters/CodexAdapter.js +153 -0
  8. package/dist/adapters/CodexAdapter.js.map +1 -0
  9. package/dist/api/cli.d.ts +2 -0
  10. package/dist/api/cli.js +396 -0
  11. package/dist/api/cli.js.map +1 -0
  12. package/dist/api/doctor.d.ts +28 -0
  13. package/dist/api/doctor.js +182 -0
  14. package/dist/api/doctor.js.map +1 -0
  15. package/dist/api/mcp.d.ts +32 -0
  16. package/dist/api/mcp.js +227 -0
  17. package/dist/api/mcp.js.map +1 -0
  18. package/dist/artifact/fsm.d.ts +36 -0
  19. package/dist/artifact/fsm.js +199 -0
  20. package/dist/artifact/fsm.js.map +1 -0
  21. package/dist/artifact/fsmDefinitions.d.ts +18 -0
  22. package/dist/artifact/fsmDefinitions.js +243 -0
  23. package/dist/artifact/fsmDefinitions.js.map +1 -0
  24. package/dist/artifact/sqliteStore.d.ts +61 -0
  25. package/dist/artifact/sqliteStore.js +394 -0
  26. package/dist/artifact/sqliteStore.js.map +1 -0
  27. package/dist/artifact/store.d.ts +49 -0
  28. package/dist/artifact/store.js +118 -0
  29. package/dist/artifact/store.js.map +1 -0
  30. package/dist/artifact/types.d.ts +333 -0
  31. package/dist/artifact/types.js +50 -0
  32. package/dist/artifact/types.js.map +1 -0
  33. package/dist/context/ContextBuilder.d.ts +36 -0
  34. package/dist/context/ContextBuilder.js +53 -0
  35. package/dist/context/ContextBuilder.js.map +1 -0
  36. package/dist/core/container.d.ts +14 -0
  37. package/dist/core/container.js +33 -0
  38. package/dist/core/container.js.map +1 -0
  39. package/dist/core/eventBus.d.ts +60 -0
  40. package/dist/core/eventBus.js +158 -0
  41. package/dist/core/eventBus.js.map +1 -0
  42. package/dist/core/logger.d.ts +3 -0
  43. package/dist/core/logger.js +12 -0
  44. package/dist/core/logger.js.map +1 -0
  45. package/dist/evolution/BehaviorTracker.d.ts +38 -0
  46. package/dist/evolution/BehaviorTracker.js +52 -0
  47. package/dist/evolution/BehaviorTracker.js.map +1 -0
  48. package/dist/evolution/EvolutionEngine.d.ts +99 -0
  49. package/dist/evolution/EvolutionEngine.js +321 -0
  50. package/dist/evolution/EvolutionEngine.js.map +1 -0
  51. package/dist/guardrails/Gateway.d.ts +26 -0
  52. package/dist/guardrails/Gateway.js +57 -0
  53. package/dist/guardrails/Gateway.js.map +1 -0
  54. package/dist/guardrails/advancedDetectors.d.ts +26 -0
  55. package/dist/guardrails/advancedDetectors.js +138 -0
  56. package/dist/guardrails/advancedDetectors.js.map +1 -0
  57. package/dist/guardrails/detectors.d.ts +25 -0
  58. package/dist/guardrails/detectors.js +170 -0
  59. package/dist/guardrails/detectors.js.map +1 -0
  60. package/dist/guardrails/roles.d.ts +4 -0
  61. package/dist/guardrails/roles.js +54 -0
  62. package/dist/guardrails/roles.js.map +1 -0
  63. package/dist/index.d.ts +22 -0
  64. package/dist/index.js +22 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/knowledge/KnowledgeBase.d.ts +25 -0
  67. package/dist/knowledge/KnowledgeBase.js +81 -0
  68. package/dist/knowledge/KnowledgeBase.js.map +1 -0
  69. package/dist/orchestration/EffectsWiring.d.ts +8 -0
  70. package/dist/orchestration/EffectsWiring.js +87 -0
  71. package/dist/orchestration/EffectsWiring.js.map +1 -0
  72. package/dist/routing/ModelRouter.d.ts +30 -0
  73. package/dist/routing/ModelRouter.js +69 -0
  74. package/dist/routing/ModelRouter.js.map +1 -0
  75. package/dist/tasks/TaskEngine.d.ts +97 -0
  76. package/dist/tasks/TaskEngine.js +269 -0
  77. package/dist/tasks/TaskEngine.js.map +1 -0
  78. package/package.json +48 -0
@@ -0,0 +1,394 @@
1
+ /**
2
+ * SCALE Engine — SQLite Artifact Store (W3)
3
+ *
4
+ * 替代 InMemoryArtifactStore,提供持久化存储。
5
+ * 设计参考:docs/02-DATA-MODEL.md §四、docs/03-CORE-MODULES.md §3.2
6
+ *
7
+ * 特性:
8
+ * - SQLite WAL 模式(读写并发安全)
9
+ * - JSON 序列化 payload/gates/statusHistory/parents/children/tags/labels
10
+ * - 事件自动落入 events 表
11
+ * - 完整 CRUD + query + findChildren + findParents
12
+ */
13
+ import Database from 'better-sqlite3';
14
+ import { ArtifactNotFoundError } from './types.js';
15
+ import { mkdirSync, existsSync, writeFileSync } from 'node:fs';
16
+ import { dirname, join } from 'node:path';
17
+ // ============================================================================
18
+ // Schema DDL
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');
81
+ `;
82
+ // ============================================================================
83
+ // SQLiteArtifactStore
84
+ // ============================================================================
85
+ export class SQLiteArtifactStore {
86
+ eventBus;
87
+ db;
88
+ seq = 0;
89
+ artifactsDir;
90
+ // Prepared statements (性能优化)
91
+ stmtInsert;
92
+ stmtGet;
93
+ stmtUpdate;
94
+ stmtDelete;
95
+ stmtInsertEdge;
96
+ stmtDeleteEdges;
97
+ stmtFindChildren;
98
+ stmtFindParents;
99
+ stmtInsertEvent;
100
+ constructor(eventBus, opts = {}) {
101
+ this.eventBus = eventBus;
102
+ const dbPath = opts.dbPath ?? '.scale/scale.db';
103
+ this.artifactsDir = opts.artifactsDir ?? '.scale/artifacts';
104
+ // 确保目录存在
105
+ mkdirSync(dirname(dbPath), { recursive: true });
106
+ if (!existsSync(this.artifactsDir))
107
+ mkdirSync(this.artifactsDir, { recursive: true });
108
+ // 创建 DB
109
+ this.db = new Database(dbPath);
110
+ this.db.pragma('journal_mode = WAL');
111
+ this.db.pragma('foreign_keys = ON');
112
+ this.db.pragma('busy_timeout = 5000');
113
+ // 初始化 schema
114
+ this.db.exec(SCHEMA_DDL);
115
+ // 准备 statements
116
+ this.prepareStatements();
117
+ // 恢复 seq
118
+ const maxRow = this.db.prepare(`SELECT id FROM artifacts ORDER BY created_at DESC LIMIT 1`).get();
119
+ if (maxRow) {
120
+ const parts = maxRow.id.split('-');
121
+ this.seq = parseInt(parts[parts.length - 1], 10) || 0;
122
+ }
123
+ // 订阅 EventBus 事件 → 自动写入 events 表
124
+ this.eventBus.on('*', (event) => {
125
+ try {
126
+ this.stmtInsertEvent.run(event.id, event.type, event.timestamp, event.sessionId ?? null, event.artifactId ?? null, JSON.stringify(event.actor ?? {}), JSON.stringify(event.payload ?? {}), JSON.stringify({}));
127
+ }
128
+ catch {
129
+ // 容忍写入失败(避免循环依赖阻塞)
130
+ }
131
+ });
132
+ }
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)
139
+ `);
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
149
+ `);
150
+ this.stmtDelete = this.db.prepare(`DELETE FROM artifacts WHERE id = ?`);
151
+ this.stmtInsertEdge = this.db.prepare(`INSERT OR IGNORE INTO artifact_edges (parent_id, child_id) VALUES (?, ?)`);
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 = ?
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 = ?
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 (?, ?, ?, ?, ?, ?, ?, ?)
166
+ `);
167
+ }
168
+ // ===== CRUD =====
169
+ async create(input) {
170
+ const id = this.generateId(input.type);
171
+ const contentRef = this.contentPath(input.type, id);
172
+ if (input.contentBody) {
173
+ mkdirSync(dirname(contentRef), { recursive: true });
174
+ writeFileSync(contentRef, input.contentBody, 'utf-8');
175
+ }
176
+ const artifact = {
177
+ id,
178
+ type: input.type,
179
+ version: 1,
180
+ status: input.initialStatus ?? 'DRAFT',
181
+ statusHistory: [],
182
+ parents: input.parents ?? [],
183
+ children: [],
184
+ title: input.title,
185
+ contentRef,
186
+ payload: input.payload,
187
+ gates: [],
188
+ createdBy: input.createdBy ?? { kind: 'system', component: 'CLI' },
189
+ createdAt: Date.now(),
190
+ updatedAt: Date.now(),
191
+ tags: input.tags ?? [],
192
+ labels: input.labels ?? {},
193
+ };
194
+ const insertAll = this.db.transaction(() => {
195
+ this.stmtInsert.run(this.toRow(artifact));
196
+ // 写入边表
197
+ for (const parentId of artifact.parents) {
198
+ this.stmtInsertEdge.run(parentId, id);
199
+ // 更新父的 children 字段
200
+ const parentRow = this.stmtGet.get(parentId);
201
+ if (parentRow) {
202
+ const parentChildren = JSON.parse(parentRow.children);
203
+ if (!parentChildren.includes(id)) {
204
+ parentChildren.push(id);
205
+ this.db.prepare(`UPDATE artifacts SET children = ? WHERE id = ?`).run(JSON.stringify(parentChildren), parentId);
206
+ }
207
+ }
208
+ }
209
+ });
210
+ insertAll();
211
+ this.eventBus.emit('artifact.created', { id, type: input.type, title: input.title }, { artifactId: id, actor: artifact.createdBy });
212
+ return artifact;
213
+ }
214
+ async get(id) {
215
+ const row = this.stmtGet.get(id);
216
+ return row ? this.fromRow(row) : null;
217
+ }
218
+ async update(id, updates) {
219
+ const existing = await this.get(id);
220
+ if (!existing)
221
+ throw new ArtifactNotFoundError(id);
222
+ const updated = {
223
+ ...existing,
224
+ ...updates,
225
+ id, // 不允许改 id
226
+ type: existing.type, // 不允许改 type
227
+ version: existing.version + 1,
228
+ updatedAt: Date.now(),
229
+ };
230
+ this.stmtUpdate.run(this.toRow(updated));
231
+ this.eventBus.emit('artifact.updated', { id, fields: Object.keys(updates) }, { artifactId: id });
232
+ return updated;
233
+ }
234
+ async delete(id) {
235
+ const existing = await this.get(id);
236
+ if (!existing)
237
+ throw new ArtifactNotFoundError(id);
238
+ const deleteAll = this.db.transaction(() => {
239
+ this.stmtDeleteEdges.run(id);
240
+ this.stmtDelete.run(id);
241
+ });
242
+ deleteAll();
243
+ this.eventBus.emit('artifact.deleted', { id }, { artifactId: id });
244
+ }
245
+ async query(filter) {
246
+ const conditions = ['1=1'];
247
+ const params = [];
248
+ if (filter.type) {
249
+ const types = Array.isArray(filter.type) ? filter.type : [filter.type];
250
+ conditions.push(`type IN (${types.map(() => '?').join(',')})`);
251
+ params.push(...types);
252
+ }
253
+ if (filter.status) {
254
+ const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];
255
+ conditions.push(`status IN (${statuses.map(() => '?').join(',')})`);
256
+ params.push(...statuses);
257
+ }
258
+ if (filter.tags && filter.tags.length > 0) {
259
+ // JSON 包含检查:每个 tag 都必须在 tags JSON 数组中
260
+ for (const tag of filter.tags) {
261
+ conditions.push(`tags LIKE ?`);
262
+ params.push(`%"${tag}"%`);
263
+ }
264
+ }
265
+ if (filter.parentId) {
266
+ conditions.push(`id IN (SELECT child_id FROM artifact_edges WHERE parent_id = ?)`);
267
+ params.push(filter.parentId);
268
+ }
269
+ let sql = `SELECT * FROM artifacts WHERE ${conditions.join(' AND ')} ORDER BY created_at DESC`;
270
+ if (filter.limit) {
271
+ sql += ` LIMIT ?`;
272
+ params.push(filter.limit);
273
+ }
274
+ const rows = this.db.prepare(sql).all(...params);
275
+ return rows.map((r) => this.fromRow(r));
276
+ }
277
+ async findChildren(parentId, type) {
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 = ?
283
+ `).all(parentId, type);
284
+ return rows.map((r) => this.fromRow(r));
285
+ }
286
+ const rows = this.stmtFindChildren.all(parentId);
287
+ return rows.map((r) => this.fromRow(r));
288
+ }
289
+ async findParents(childId) {
290
+ const rows = this.stmtFindParents.all(childId);
291
+ return rows.map((r) => this.fromRow(r));
292
+ }
293
+ async setGate(artifactId, gate) {
294
+ const artifact = await this.get(artifactId);
295
+ if (!artifact)
296
+ throw new ArtifactNotFoundError(artifactId);
297
+ const idx = artifact.gates.findIndex((g) => g.name === gate.name);
298
+ if (idx >= 0)
299
+ artifact.gates[idx] = gate;
300
+ else
301
+ artifact.gates.push(gate);
302
+ this.db.prepare(`UPDATE artifacts SET gates = ?, updated_at = ? WHERE id = ?`)
303
+ .run(JSON.stringify(artifact.gates), Date.now(), artifactId);
304
+ this.eventBus.emit('artifact.gate_checked', { artifactId, gate }, { artifactId });
305
+ }
306
+ // ===== 额外方法 =====
307
+ /** 查询事件(从 events 表) */
308
+ queryEvents(opts = {}) {
309
+ const conditions = ['1=1'];
310
+ const params = [];
311
+ if (opts.artifactId) {
312
+ conditions.push('artifact_id = ?');
313
+ params.push(opts.artifactId);
314
+ }
315
+ if (opts.type) {
316
+ conditions.push('type = ?');
317
+ params.push(opts.type);
318
+ }
319
+ let sql = `SELECT * FROM events WHERE ${conditions.join(' AND ')} ORDER BY timestamp DESC`;
320
+ if (opts.limit) {
321
+ sql += ` LIMIT ?`;
322
+ params.push(opts.limit);
323
+ }
324
+ return this.db.prepare(sql).all(...params);
325
+ }
326
+ /** 获取统计信息 */
327
+ stats() {
328
+ const artifactCount = this.db.prepare('SELECT COUNT(*) as c FROM artifacts').get().c;
329
+ const eventCount = this.db.prepare('SELECT COUNT(*) as c FROM events').get().c;
330
+ const rows = this.db.prepare('SELECT type, COUNT(*) as c FROM artifacts GROUP BY type').all();
331
+ const byType = {};
332
+ for (const r of rows)
333
+ byType[r.type] = r.c;
334
+ return { artifactCount, eventCount, byType };
335
+ }
336
+ /** 关闭数据库连接 */
337
+ close() {
338
+ this.db.close();
339
+ }
340
+ // ===== 内部 =====
341
+ generateId(type) {
342
+ const date = new Date().toISOString().slice(0, 10).replace(/-/g, '');
343
+ this.seq = (this.seq + 1) % 10000;
344
+ return `${type.toUpperCase()}-${date}-${this.seq.toString().padStart(4, '0')}`;
345
+ }
346
+ contentPath(type, id) {
347
+ return join(this.artifactsDir, type.toLowerCase(), `${id}.md`);
348
+ }
349
+ toRow(a) {
350
+ return {
351
+ id: a.id,
352
+ type: a.type,
353
+ version: a.version,
354
+ status: a.status,
355
+ statusHistory: JSON.stringify(a.statusHistory),
356
+ parents: JSON.stringify(a.parents),
357
+ children: JSON.stringify(a.children),
358
+ supersedes: a.supersedes ?? null,
359
+ title: a.title,
360
+ contentRef: a.contentRef,
361
+ payload: JSON.stringify(a.payload),
362
+ gates: JSON.stringify(a.gates),
363
+ createdBy: JSON.stringify(a.createdBy),
364
+ createdAt: a.createdAt,
365
+ updatedAt: a.updatedAt,
366
+ closedAt: a.closedAt ?? null,
367
+ tags: JSON.stringify(a.tags),
368
+ labels: JSON.stringify(a.labels),
369
+ };
370
+ }
371
+ fromRow(row) {
372
+ return {
373
+ id: row.id,
374
+ type: row.type,
375
+ version: row.version,
376
+ status: row.status,
377
+ statusHistory: JSON.parse(row.status_history),
378
+ parents: JSON.parse(row.parents),
379
+ children: JSON.parse(row.children),
380
+ supersedes: row.supersedes ?? undefined,
381
+ title: row.title,
382
+ contentRef: row.content_ref,
383
+ payload: JSON.parse(row.payload),
384
+ gates: JSON.parse(row.gates),
385
+ createdBy: JSON.parse(row.created_by),
386
+ createdAt: row.created_at,
387
+ updatedAt: row.updated_at,
388
+ closedAt: row.closed_at ?? undefined,
389
+ tags: JSON.parse(row.tags),
390
+ labels: JSON.parse(row.labels),
391
+ };
392
+ }
393
+ }
394
+ //# sourceMappingURL=sqliteStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqliteStore.js","sourceRoot":"","sources":["../../src/artifact/sqliteStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { Artifact, ArtifactType, Gate, ArtifactId } from './types.js';
2
+ import type { IEventBus } from '../core/eventBus.js';
3
+ export interface CreateArtifactInput {
4
+ type: ArtifactType;
5
+ title: string;
6
+ payload: unknown;
7
+ parents?: ArtifactId[];
8
+ tags?: string[];
9
+ labels?: Record<string, string>;
10
+ createdBy?: import('./types.js').Actor;
11
+ initialStatus?: string;
12
+ contentBody?: string;
13
+ }
14
+ export interface ArtifactFilter {
15
+ type?: ArtifactType | ArtifactType[];
16
+ status?: string | string[];
17
+ tags?: string[];
18
+ parentId?: ArtifactId;
19
+ limit?: number;
20
+ }
21
+ export interface IArtifactStore {
22
+ create(input: CreateArtifactInput): Promise<Artifact>;
23
+ get(id: ArtifactId): Promise<Artifact | null>;
24
+ update(id: ArtifactId, updates: Partial<Artifact>): Promise<Artifact>;
25
+ delete(id: ArtifactId): Promise<void>;
26
+ query(filter: ArtifactFilter): Promise<Artifact[]>;
27
+ findChildren(parentId: ArtifactId, type?: ArtifactType): Promise<Artifact[]>;
28
+ findParents(childId: ArtifactId): Promise<Artifact[]>;
29
+ setGate(artifactId: ArtifactId, gate: Gate): Promise<void>;
30
+ }
31
+ export declare class InMemoryArtifactStore implements IArtifactStore {
32
+ private eventBus;
33
+ private artifacts;
34
+ private artifactsDir;
35
+ private seq;
36
+ constructor(eventBus: IEventBus, opts?: {
37
+ artifactsDir?: string;
38
+ });
39
+ create(input: CreateArtifactInput): Promise<Artifact>;
40
+ get(id: ArtifactId): Promise<Artifact | null>;
41
+ update(id: ArtifactId, updates: Partial<Artifact>): Promise<Artifact>;
42
+ delete(id: ArtifactId): Promise<void>;
43
+ query(filter: ArtifactFilter): Promise<Artifact[]>;
44
+ findChildren(parentId: ArtifactId, type?: ArtifactType): Promise<Artifact[]>;
45
+ findParents(childId: ArtifactId): Promise<Artifact[]>;
46
+ setGate(artifactId: ArtifactId, gate: Gate): Promise<void>;
47
+ private generateId;
48
+ private contentPath;
49
+ }
@@ -0,0 +1,118 @@
1
+ // SCALE Engine — Artifact Store (内存版骨架, W3 升级 SQLite)
2
+ // 设计参考:docs/03-CORE-MODULES.md §3.2
3
+ import { ArtifactNotFoundError } from './types.js';
4
+ import { writeFileSync, mkdirSync, existsSync } from 'node:fs';
5
+ import { join, dirname } from 'node:path';
6
+ export class InMemoryArtifactStore {
7
+ eventBus;
8
+ artifacts = new Map();
9
+ artifactsDir;
10
+ seq = 0;
11
+ constructor(eventBus, opts = {}) {
12
+ this.eventBus = eventBus;
13
+ this.artifactsDir = opts.artifactsDir ?? '.scale/artifacts';
14
+ if (!existsSync(this.artifactsDir))
15
+ mkdirSync(this.artifactsDir, { recursive: true });
16
+ }
17
+ async create(input) {
18
+ const id = this.generateId(input.type);
19
+ const contentRef = this.contentPath(input.type, id);
20
+ if (input.contentBody) {
21
+ mkdirSync(dirname(contentRef), { recursive: true });
22
+ writeFileSync(contentRef, input.contentBody, 'utf-8');
23
+ }
24
+ const artifact = {
25
+ id, type: input.type, version: 1,
26
+ status: input.initialStatus ?? 'DRAFT',
27
+ statusHistory: [],
28
+ parents: input.parents ?? [],
29
+ children: [],
30
+ title: input.title,
31
+ contentRef,
32
+ payload: input.payload,
33
+ gates: [],
34
+ createdBy: input.createdBy ?? { kind: 'system', component: 'CLI' },
35
+ createdAt: Date.now(),
36
+ updatedAt: Date.now(),
37
+ tags: input.tags ?? [],
38
+ labels: input.labels ?? {},
39
+ };
40
+ this.artifacts.set(id, artifact);
41
+ // 更新父 artifacts 的 children
42
+ for (const parentId of artifact.parents) {
43
+ const parent = this.artifacts.get(parentId);
44
+ if (parent)
45
+ parent.children.push(id);
46
+ }
47
+ this.eventBus.emit('artifact.created', { id, type: input.type, title: input.title }, { artifactId: id, actor: artifact.createdBy });
48
+ return artifact;
49
+ }
50
+ async get(id) {
51
+ return this.artifacts.get(id) ?? null;
52
+ }
53
+ async update(id, updates) {
54
+ const existing = this.artifacts.get(id);
55
+ if (!existing)
56
+ throw new ArtifactNotFoundError(id);
57
+ const updated = { ...existing, ...updates, version: existing.version + 1, updatedAt: Date.now() };
58
+ this.artifacts.set(id, updated);
59
+ this.eventBus.emit('artifact.updated', { id, fields: Object.keys(updates) }, { artifactId: id });
60
+ return updated;
61
+ }
62
+ async delete(id) {
63
+ if (!this.artifacts.has(id))
64
+ throw new ArtifactNotFoundError(id);
65
+ this.artifacts.delete(id);
66
+ this.eventBus.emit('artifact.deleted', { id }, { artifactId: id });
67
+ }
68
+ async query(filter) {
69
+ let result = Array.from(this.artifacts.values());
70
+ if (filter.type) {
71
+ const types = Array.isArray(filter.type) ? filter.type : [filter.type];
72
+ result = result.filter((a) => types.includes(a.type));
73
+ }
74
+ if (filter.status) {
75
+ const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];
76
+ result = result.filter((a) => statuses.includes(a.status));
77
+ }
78
+ if (filter.tags) {
79
+ result = result.filter((a) => filter.tags.every((t) => a.tags.includes(t)));
80
+ }
81
+ if (filter.parentId) {
82
+ result = result.filter((a) => a.parents.includes(filter.parentId));
83
+ }
84
+ if (filter.limit)
85
+ result = result.slice(0, filter.limit);
86
+ return result;
87
+ }
88
+ async findChildren(parentId, type) {
89
+ return this.query({ parentId, type });
90
+ }
91
+ async findParents(childId) {
92
+ const child = this.artifacts.get(childId);
93
+ if (!child)
94
+ return [];
95
+ return child.parents.map((id) => this.artifacts.get(id)).filter(Boolean);
96
+ }
97
+ async setGate(artifactId, gate) {
98
+ const artifact = this.artifacts.get(artifactId);
99
+ if (!artifact)
100
+ throw new ArtifactNotFoundError(artifactId);
101
+ const idx = artifact.gates.findIndex((g) => g.name === gate.name);
102
+ if (idx >= 0)
103
+ artifact.gates[idx] = gate;
104
+ else
105
+ artifact.gates.push(gate);
106
+ this.eventBus.emit('artifact.gate_checked', { artifactId, gate }, { artifactId });
107
+ }
108
+ // ===== 内部 =====
109
+ generateId(type) {
110
+ const date = new Date().toISOString().slice(0, 10).replace(/-/g, '');
111
+ this.seq = (this.seq + 1) % 10000;
112
+ return `${type.toUpperCase()}-${date}-${this.seq.toString().padStart(4, '0')}`;
113
+ }
114
+ contentPath(type, id) {
115
+ return join(this.artifactsDir, type.toLowerCase(), `${id}.md`);
116
+ }
117
+ }
118
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/artifact/store.ts"],"names":[],"mappings":"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"}