@winspan/claude-forge 3.6.39 → 3.6.43
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/dist/convention/types.d.ts +15 -5
- package/dist/convention/types.d.ts.map +1 -1
- package/dist/daemon/engine-registry.d.ts.map +1 -1
- package/dist/daemon/engine-registry.js +6 -0
- package/dist/daemon/engine-registry.js.map +1 -1
- package/dist/daemon/handler-context.d.ts +5 -1
- package/dist/daemon/handler-context.d.ts.map +1 -1
- package/dist/daemon/handlers/post-tool-use-handler.d.ts.map +1 -1
- package/dist/daemon/handlers/post-tool-use-handler.js +59 -2
- package/dist/daemon/handlers/post-tool-use-handler.js.map +1 -1
- package/dist/daemon/handlers/pre-tool-use-handler.d.ts.map +1 -1
- package/dist/daemon/handlers/pre-tool-use-handler.js +25 -2
- package/dist/daemon/handlers/pre-tool-use-handler.js.map +1 -1
- package/dist/daemon/handlers/session-cleanup.d.ts +2 -0
- package/dist/daemon/handlers/session-cleanup.d.ts.map +1 -1
- package/dist/daemon/handlers/session-cleanup.js +20 -0
- package/dist/daemon/handlers/session-cleanup.js.map +1 -1
- package/dist/daemon/handlers/stop-handler.d.ts.map +1 -1
- package/dist/daemon/handlers/stop-handler.js +1 -0
- package/dist/daemon/handlers/stop-handler.js.map +1 -1
- package/dist/pipeline/completion-gate.d.ts +1 -0
- package/dist/pipeline/completion-gate.d.ts.map +1 -1
- package/dist/pipeline/completion-gate.js +43 -3
- package/dist/pipeline/completion-gate.js.map +1 -1
- package/dist/pipeline/completion-verifier.d.ts +75 -0
- package/dist/pipeline/completion-verifier.d.ts.map +1 -0
- package/dist/pipeline/completion-verifier.js +217 -0
- package/dist/pipeline/completion-verifier.js.map +1 -0
- package/dist/pipeline/diagnosis-service.d.ts +43 -0
- package/dist/pipeline/diagnosis-service.d.ts.map +1 -0
- package/dist/pipeline/diagnosis-service.js +136 -0
- package/dist/pipeline/diagnosis-service.js.map +1 -0
- package/dist/pipeline/execution-engine.d.ts +79 -0
- package/dist/pipeline/execution-engine.d.ts.map +1 -0
- package/dist/pipeline/execution-engine.js +227 -0
- package/dist/pipeline/execution-engine.js.map +1 -0
- package/dist/pipeline/node-type-sync.d.ts.map +1 -1
- package/dist/pipeline/node-type-sync.js +25 -22
- package/dist/pipeline/node-type-sync.js.map +1 -1
- package/dist/pipeline/plan-service.d.ts +58 -0
- package/dist/pipeline/plan-service.d.ts.map +1 -0
- package/dist/pipeline/plan-service.js +382 -0
- package/dist/pipeline/plan-service.js.map +1 -0
- package/dist/pipeline/strategy-selector.d.ts +41 -0
- package/dist/pipeline/strategy-selector.d.ts.map +1 -0
- package/dist/pipeline/strategy-selector.js +112 -0
- package/dist/pipeline/strategy-selector.js.map +1 -0
- package/dist/pipeline/template-evolver.d.ts +45 -0
- package/dist/pipeline/template-evolver.d.ts.map +1 -0
- package/dist/pipeline/template-evolver.js +223 -0
- package/dist/pipeline/template-evolver.js.map +1 -0
- package/dist/storage/repositories/node-attempt-repository.d.ts +29 -0
- package/dist/storage/repositories/node-attempt-repository.d.ts.map +1 -0
- package/dist/storage/repositories/node-attempt-repository.js +57 -0
- package/dist/storage/repositories/node-attempt-repository.js.map +1 -0
- package/dist/storage/repositories/pipeline-plan-repository.d.ts +75 -0
- package/dist/storage/repositories/pipeline-plan-repository.d.ts.map +1 -0
- package/dist/storage/repositories/pipeline-plan-repository.js +123 -0
- package/dist/storage/repositories/pipeline-plan-repository.js.map +1 -0
- package/dist/storage/repositories/template-evolution-repository.d.ts +39 -0
- package/dist/storage/repositories/template-evolution-repository.d.ts.map +1 -0
- package/dist/storage/repositories/template-evolution-repository.js +83 -0
- package/dist/storage/repositories/template-evolution-repository.js.map +1 -0
- package/dist/storage/sqlite.d.ts +8 -0
- package/dist/storage/sqlite.d.ts.map +1 -1
- package/dist/storage/sqlite.js +13 -0
- package/dist/storage/sqlite.js.map +1 -1
- package/dist/web/routes/evolution.d.ts +4 -0
- package/dist/web/routes/evolution.d.ts.map +1 -0
- package/dist/web/routes/evolution.js +61 -0
- package/dist/web/routes/evolution.js.map +1 -0
- package/dist/web/routes/plans.d.ts +5 -0
- package/dist/web/routes/plans.d.ts.map +1 -0
- package/dist/web/routes/plans.js +163 -0
- package/dist/web/routes/plans.js.map +1 -0
- package/dist/web/routes/templates.d.ts +4 -0
- package/dist/web/routes/templates.d.ts.map +1 -0
- package/dist/web/routes/templates.js +117 -0
- package/dist/web/routes/templates.js.map +1 -0
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +6 -0
- package/dist/web/server.js.map +1 -1
- package/dist/web-static/assets/Analytics-Bo74j97W.js +1 -0
- package/dist/web-static/assets/BatchProgress-BQ533tSf.js +1 -0
- package/dist/web-static/assets/{Breadcrumb-DbDeWYcH.js → Breadcrumb-DtfwnOx6.js} +1 -1
- package/dist/web-static/assets/{Config-yTRFpmlP.js → Config-DhfQsbT1.js} +1 -1
- package/dist/web-static/assets/{ConfirmDialog-CH1HyRaY.js → ConfirmDialog-CVzB7X5y.js} +1 -1
- package/dist/web-static/assets/{Conventions-DaqIk41m.js → Conventions-BobuQiOk.js} +1 -1
- package/dist/web-static/assets/Dashboard-Bj28rnDe.js +1 -0
- package/dist/web-static/assets/{ErrorState-HW0OjEYK.js → ErrorState-DXHA8lr8.js} +1 -1
- package/dist/web-static/assets/Events-C0y7WcDP.js +1 -0
- package/dist/web-static/assets/Evolution-DimZAXFS.js +1 -0
- package/dist/web-static/assets/Knowledge-Y1lX6vor.js +2 -0
- package/dist/web-static/assets/{NodeTypes-B5E6NYKn.js → NodeTypes-DyrDqhBp.js} +1 -1
- package/dist/web-static/assets/{Pagination-ooTI9JPa.js → Pagination-lp8b_3NR.js} +1 -1
- package/dist/web-static/assets/{PipelineDetail-DCnqD5lr.js → PipelineDetail-DGKz18zu.js} +3 -3
- package/dist/web-static/assets/{PipelineTemplates-CxGoLw6Q.js → PipelineTemplates-D4zvL6I1.js} +1 -1
- package/dist/web-static/assets/Pipelines-CR9oD3Xy.js +2 -0
- package/dist/web-static/assets/ProjectDetail-RfdtEvTT.js +1 -0
- package/dist/web-static/assets/Projects-RGIPdiJn.js +1 -0
- package/dist/web-static/assets/Quality-BdvL1VQn.js +3 -0
- package/dist/web-static/assets/{SessionDetail-DleCNmQH.js → SessionDetail-BNDIfmmq.js} +1 -1
- package/dist/web-static/assets/{Sessions-Dz6xFq_4.js → Sessions-CorfQV78.js} +2 -2
- package/dist/web-static/assets/{BatchProgress-CIrC9RcC.js → Skeleton-B7PVDJJ_.js} +1 -1
- package/dist/web-static/assets/Skills-BJt0OrKj.js +1 -0
- package/dist/web-static/assets/TemplateDetail-DOfBYdQ3.js +1 -0
- package/dist/web-static/assets/Templates-Cp3yC5tv.js +1 -0
- package/dist/web-static/assets/{client-B_-7qCOP.js → client-BhcjNvkG.js} +1 -1
- package/dist/web-static/assets/index-CqwJts5v.css +2 -0
- package/dist/web-static/assets/index-DdmJVOxm.js +2 -0
- package/dist/web-static/assets/{ui-B2gvOcFY.js → ui-CDL3BZ13.js} +1 -1
- package/dist/web-static/assets/useDebounce-DNfPs3Tv.js +1 -0
- package/dist/web-static/assets/vendor-DRGPi8ui.js +9 -0
- package/dist/web-static/assets/{vendor-charts-BXsEmmv5.js → vendor-charts-9eVsQvUV.js} +4 -4
- package/dist/web-static/assets/{vendor-editor-DYIoTHFO.js → vendor-editor-B1NX2ipj.js} +1 -1
- package/dist/web-static/assets/vendor-flow-srkes8If.js +7 -0
- package/dist/web-static/assets/{vendor-motion-BsfSkSjj.js → vendor-motion-CQmdgnI8.js} +2 -2
- package/dist/web-static/assets/{vendor-query-BF-uT_c5.js → vendor-query-DqPOMnuX.js} +1 -1
- package/dist/web-static/assets/{vendor-react-CXfI0Tes.js → vendor-react-DJI9oneq.js} +1 -1
- package/dist/web-static/index.html +11 -11
- package/package.json +2 -1
- package/dist/web-static/assets/Analytics-BTMAlQBr.js +0 -1
- package/dist/web-static/assets/Dashboard-BS61GjKa.js +0 -1
- package/dist/web-static/assets/Events-DAms_1fs.js +0 -1
- package/dist/web-static/assets/Knowledge-CZhuou1K.js +0 -2
- package/dist/web-static/assets/Pipelines-DEuVx4hF.js +0 -2
- package/dist/web-static/assets/ProjectDetail-Dn01H3zi.js +0 -1
- package/dist/web-static/assets/Projects-D5-BfuFU.js +0 -1
- package/dist/web-static/assets/Quality-wvfdPtGB.js +0 -3
- package/dist/web-static/assets/Skills-CpHL-tyW.js +0 -1
- package/dist/web-static/assets/index-CN_edVMt.js +0 -2
- package/dist/web-static/assets/index-DLMLziRH.css +0 -2
- package/dist/web-static/assets/useDebounce-Bo1fLB5L.js +0 -1
- package/dist/web-static/assets/vendor-BpBCrKSP.js +0 -9
- package/dist/web-static/assets/vendor-flow-D-_WxBha.js +0 -7
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template Evolver - 模板进化器
|
|
3
|
+
*
|
|
4
|
+
* 核心职责:
|
|
5
|
+
* 1. 收集执行结果,识别进化信号
|
|
6
|
+
* 2. 分析成功/失败模式,生成优化建议
|
|
7
|
+
* 3. 自动更新模板版本(完成条件、策略池、超时等)
|
|
8
|
+
* 4. 记录进化事件日志
|
|
9
|
+
*/
|
|
10
|
+
import { logger } from '../utils/logger.js';
|
|
11
|
+
import { randomUUID } from 'crypto';
|
|
12
|
+
// ── Template Evolver 实现 ───────────────────────────────────────────────
|
|
13
|
+
export class TemplateEvolver {
|
|
14
|
+
storage;
|
|
15
|
+
evolveCount = 0;
|
|
16
|
+
EVOLVE_THRESHOLD = 10; // 每 10 个 Pipeline 完成后触发一次进化
|
|
17
|
+
constructor(storage) {
|
|
18
|
+
this.storage = storage;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 计数触发进化(参照 SkillRegistryEngine.maybeEvolve)
|
|
22
|
+
* 在 session-cleanup handler 的 Stop 事件中调用
|
|
23
|
+
*/
|
|
24
|
+
maybeEvolve(planId) {
|
|
25
|
+
this.evolveCount++;
|
|
26
|
+
if (this.evolveCount >= this.EVOLVE_THRESHOLD) {
|
|
27
|
+
this.evolveCount = 0;
|
|
28
|
+
this.evolveFromPlan(planId).catch(err => {
|
|
29
|
+
logger.error(`[TemplateEvolver] 进化失败: ${err}`);
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 基于单个 Pipeline 执行结果进行进化
|
|
35
|
+
*/
|
|
36
|
+
async evolveFromPlan(planId) {
|
|
37
|
+
const plan = this.storage.repositories.pipelinePlans.getById(planId);
|
|
38
|
+
if (!plan) {
|
|
39
|
+
logger.warn(`[TemplateEvolver] Plan ${planId} not found`);
|
|
40
|
+
return { evolved: false, signals: [] };
|
|
41
|
+
}
|
|
42
|
+
const nodes = this.storage.repositories.planNodes.getByPlanId(planId);
|
|
43
|
+
const signals = this.detectSignals(plan, nodes);
|
|
44
|
+
if (signals.length === 0) {
|
|
45
|
+
logger.info(`[TemplateEvolver] Plan ${planId} 无进化信号`);
|
|
46
|
+
return { evolved: false, signals: [] };
|
|
47
|
+
}
|
|
48
|
+
logger.info(`[TemplateEvolver] Plan ${planId} 检测到 ${signals.length} 个进化信号`);
|
|
49
|
+
// 记录进化事件
|
|
50
|
+
for (const signal of signals) {
|
|
51
|
+
this.storage.repositories.templateEvolutionEvents.create({
|
|
52
|
+
template_id: plan.template_id,
|
|
53
|
+
plan_id: planId,
|
|
54
|
+
signal_type: signal.type,
|
|
55
|
+
evidence: signal.evidence,
|
|
56
|
+
action: signal.action_description,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
// 应用进化(生成新版本)
|
|
60
|
+
const newVersion = await this.applyEvolution(plan, signals);
|
|
61
|
+
return {
|
|
62
|
+
evolved: true,
|
|
63
|
+
new_version: newVersion,
|
|
64
|
+
signals,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
// ── 信号检测 ──────────────────────────────────────────────────────────
|
|
68
|
+
detectSignals(plan, nodes) {
|
|
69
|
+
const signals = [];
|
|
70
|
+
for (const node of nodes) {
|
|
71
|
+
// 信号1:多次重试后通过 → 放宽条件
|
|
72
|
+
if (node.status === 'done' && node.attempt_count > 2) {
|
|
73
|
+
signals.push({
|
|
74
|
+
type: 'multi_retry_pass',
|
|
75
|
+
evidence: {
|
|
76
|
+
node_id: node.node_id,
|
|
77
|
+
phase: node.phase,
|
|
78
|
+
attempt_count: node.attempt_count,
|
|
79
|
+
},
|
|
80
|
+
node_phase: node.phase,
|
|
81
|
+
action_description: `节点 ${node.title} 重试 ${node.attempt_count} 次后通过,建议放宽完成条件或增加超时`,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
// 信号2:策略可靠性分析
|
|
85
|
+
const strategySignals = this.analyzeStrategyReliability(node);
|
|
86
|
+
signals.push(...strategySignals);
|
|
87
|
+
}
|
|
88
|
+
// 信号3:后续节点失败回溯(需要跨节点分析)
|
|
89
|
+
const backtrackSignals = this.detectBacktrackFailures(nodes);
|
|
90
|
+
signals.push(...backtrackSignals);
|
|
91
|
+
return signals;
|
|
92
|
+
}
|
|
93
|
+
analyzeStrategyReliability(node) {
|
|
94
|
+
const signals = [];
|
|
95
|
+
for (const strategy of node.strategy_pool) {
|
|
96
|
+
// 策略连续成功 → 提升优先级
|
|
97
|
+
if (strategy.success_count >= 5 && strategy.attempt_count === strategy.success_count) {
|
|
98
|
+
signals.push({
|
|
99
|
+
type: 'strategy_reliable',
|
|
100
|
+
evidence: {
|
|
101
|
+
node_phase: node.phase,
|
|
102
|
+
strategy_id: strategy.strategy_id,
|
|
103
|
+
success_count: strategy.success_count,
|
|
104
|
+
success_rate: 1.0,
|
|
105
|
+
},
|
|
106
|
+
node_phase: node.phase,
|
|
107
|
+
action_description: `策略 ${strategy.name} 连续 ${strategy.success_count} 次成功,提升优先级`,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
// 策略从未成功 → 降低优先级
|
|
111
|
+
if (strategy.attempt_count >= 3 && strategy.success_count === 0) {
|
|
112
|
+
signals.push({
|
|
113
|
+
type: 'strategy_ineffective',
|
|
114
|
+
evidence: {
|
|
115
|
+
node_phase: node.phase,
|
|
116
|
+
strategy_id: strategy.strategy_id,
|
|
117
|
+
attempt_count: strategy.attempt_count,
|
|
118
|
+
success_rate: 0,
|
|
119
|
+
},
|
|
120
|
+
node_phase: node.phase,
|
|
121
|
+
action_description: `策略 ${strategy.name} 尝试 ${strategy.attempt_count} 次均失败,降低优先级`,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return signals;
|
|
126
|
+
}
|
|
127
|
+
detectBacktrackFailures(nodes) {
|
|
128
|
+
const signals = [];
|
|
129
|
+
// 找出失败的节点
|
|
130
|
+
const failedNodes = nodes.filter(n => n.status === 'failed');
|
|
131
|
+
for (const failedNode of failedNodes) {
|
|
132
|
+
// 检查其依赖节点是否可能是假完成
|
|
133
|
+
if (failedNode.dependencies && failedNode.dependencies.length > 0) {
|
|
134
|
+
for (const depId of failedNode.dependencies) {
|
|
135
|
+
const depNode = nodes.find(n => n.node_id === depId);
|
|
136
|
+
if (depNode && depNode.status === 'done' && depNode.attempt_count === 1) {
|
|
137
|
+
// 依赖节点一次通过,但后续节点失败 → 可能是假完成
|
|
138
|
+
signals.push({
|
|
139
|
+
type: 'backtrack_failure',
|
|
140
|
+
evidence: {
|
|
141
|
+
failed_node: failedNode.phase,
|
|
142
|
+
dependency_node: depNode.phase,
|
|
143
|
+
dependency_attempt_count: depNode.attempt_count,
|
|
144
|
+
},
|
|
145
|
+
node_phase: depNode.phase,
|
|
146
|
+
action_description: `节点 ${depNode.title} 一次通过但后续节点 ${failedNode.title} 失败,可能是假完成,建议收严完成条件`,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return signals;
|
|
153
|
+
}
|
|
154
|
+
// ── 进化应用 ──────────────────────────────────────────────────────────
|
|
155
|
+
async applyEvolution(plan, signals) {
|
|
156
|
+
const template = this.storage.repositories.dynamicPipelineTemplates.getById(plan.template_id);
|
|
157
|
+
if (!template) {
|
|
158
|
+
logger.warn(`[TemplateEvolver] Template ${plan.template_id} not found`);
|
|
159
|
+
return plan.template_version;
|
|
160
|
+
}
|
|
161
|
+
// 克隆模板内容
|
|
162
|
+
const evolved = JSON.parse(JSON.stringify(template));
|
|
163
|
+
// 应用每个信号的进化动作
|
|
164
|
+
for (const signal of signals) {
|
|
165
|
+
this.applySignalAction(evolved, signal);
|
|
166
|
+
}
|
|
167
|
+
// 生成新版本号
|
|
168
|
+
const currentVersion = template.version ?? '1.0.0';
|
|
169
|
+
const newVersion = this.incrementVersion(currentVersion);
|
|
170
|
+
evolved.version = newVersion;
|
|
171
|
+
// 保存新版本到 template_versions 表
|
|
172
|
+
const versionId = randomUUID();
|
|
173
|
+
this.storage.repositories.templateVersions.create({
|
|
174
|
+
template_id: template.id,
|
|
175
|
+
version: newVersion,
|
|
176
|
+
content: evolved,
|
|
177
|
+
evolved_from: plan.template_version,
|
|
178
|
+
evolution_reason: signals.map(s => s.action_description).join('; '),
|
|
179
|
+
});
|
|
180
|
+
// 更新主模板表
|
|
181
|
+
this.storage.repositories.dynamicPipelineTemplates.update(template.id, {
|
|
182
|
+
...evolved,
|
|
183
|
+
version: newVersion,
|
|
184
|
+
});
|
|
185
|
+
logger.info(`[TemplateEvolver] 模板 ${template.name} 进化至版本 ${newVersion}`);
|
|
186
|
+
return newVersion;
|
|
187
|
+
}
|
|
188
|
+
applySignalAction(template, signal) {
|
|
189
|
+
// 这里简化实现,实际应根据信号类型修改模板的具体字段
|
|
190
|
+
// 例如:调整完成条件阈值、策略优先级、超时时间等
|
|
191
|
+
switch (signal.type) {
|
|
192
|
+
case 'multi_retry_pass':
|
|
193
|
+
// 放宽完成条件(示例:增加超时)
|
|
194
|
+
logger.info(`[TemplateEvolver] 应用信号: ${signal.action_description}`);
|
|
195
|
+
break;
|
|
196
|
+
case 'strategy_reliable':
|
|
197
|
+
// 提升策略优先级(需要在节点级别调整策略池)
|
|
198
|
+
logger.info(`[TemplateEvolver] 应用信号: ${signal.action_description}`);
|
|
199
|
+
break;
|
|
200
|
+
case 'strategy_ineffective':
|
|
201
|
+
// 降低策略优先级
|
|
202
|
+
logger.info(`[TemplateEvolver] 应用信号: ${signal.action_description}`);
|
|
203
|
+
break;
|
|
204
|
+
case 'backtrack_failure':
|
|
205
|
+
// 收严前节点完成条件
|
|
206
|
+
logger.info(`[TemplateEvolver] 应用信号: ${signal.action_description}`);
|
|
207
|
+
break;
|
|
208
|
+
case 'diagnosis_pattern':
|
|
209
|
+
// 追加防御性指令
|
|
210
|
+
logger.info(`[TemplateEvolver] 应用信号: ${signal.action_description}`);
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
incrementVersion(version) {
|
|
215
|
+
const parts = version.split('.').map(Number);
|
|
216
|
+
if (parts.length !== 3 || parts.some(isNaN)) {
|
|
217
|
+
return '1.0.1';
|
|
218
|
+
}
|
|
219
|
+
parts[2]++; // 递增 patch 版本
|
|
220
|
+
return parts.join('.');
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=template-evolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-evolver.js","sourceRoot":"","sources":["../../src/pipeline/template-evolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Database } from 'better-sqlite3';
|
|
2
|
+
export interface VerificationResultSnapshot {
|
|
3
|
+
passed: boolean;
|
|
4
|
+
missing_items: string[];
|
|
5
|
+
diagnostics: string;
|
|
6
|
+
next_action: 'advance' | 'retry' | 'block';
|
|
7
|
+
}
|
|
8
|
+
export interface NodeAttempt {
|
|
9
|
+
attempt_id: string;
|
|
10
|
+
node_id: string;
|
|
11
|
+
strategy_id: string;
|
|
12
|
+
attempt_number: number;
|
|
13
|
+
started_at: string;
|
|
14
|
+
ended_at?: string;
|
|
15
|
+
status: 'running' | 'passed' | 'failed';
|
|
16
|
+
verification_result?: VerificationResultSnapshot;
|
|
17
|
+
diagnosis_result?: any;
|
|
18
|
+
created_at: string;
|
|
19
|
+
}
|
|
20
|
+
export declare class NodeAttemptRepository {
|
|
21
|
+
private db;
|
|
22
|
+
constructor(db: Database);
|
|
23
|
+
create(attempt: Omit<NodeAttempt, 'created_at'>): void;
|
|
24
|
+
updateStatus(attemptId: string, status: 'running' | 'passed' | 'failed', endedAt: string, verificationResult?: VerificationResultSnapshot): void;
|
|
25
|
+
getByNodeId(nodeId: string): NodeAttempt[];
|
|
26
|
+
getLatestAttempt(nodeId: string): NodeAttempt | null;
|
|
27
|
+
private mapRow;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=node-attempt-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-attempt-repository.d.ts","sourceRoot":"","sources":["../../../src/storage/repositories/node-attempt-repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;CAC5C;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACxC,mBAAmB,CAAC,EAAE,0BAA0B,CAAC;IACjD,gBAAgB,CAAC,EAAE,GAAG,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,qBAAqB;IACpB,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAEhC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,GAAG,IAAI;IAqBtD,YAAY,CACV,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,EACvC,OAAO,EAAE,MAAM,EACf,kBAAkB,CAAC,EAAE,0BAA0B,GAC9C,IAAI;IAeP,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,EAAE;IAW1C,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAYpD,OAAO,CAAC,MAAM;CAcf"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export class NodeAttemptRepository {
|
|
2
|
+
db;
|
|
3
|
+
constructor(db) {
|
|
4
|
+
this.db = db;
|
|
5
|
+
}
|
|
6
|
+
create(attempt) {
|
|
7
|
+
const stmt = this.db.prepare(`
|
|
8
|
+
INSERT INTO node_attempts (
|
|
9
|
+
attempt_id, node_id, strategy_id, attempt_number,
|
|
10
|
+
started_at, ended_at, status, verification_result, diagnosis_result
|
|
11
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
12
|
+
`);
|
|
13
|
+
stmt.run(attempt.attempt_id, attempt.node_id, attempt.strategy_id, attempt.attempt_number, attempt.started_at, attempt.ended_at ?? null, attempt.status, attempt.verification_result ? JSON.stringify(attempt.verification_result) : null, attempt.diagnosis_result ? JSON.stringify(attempt.diagnosis_result) : null);
|
|
14
|
+
}
|
|
15
|
+
updateStatus(attemptId, status, endedAt, verificationResult) {
|
|
16
|
+
const stmt = this.db.prepare(`
|
|
17
|
+
UPDATE node_attempts
|
|
18
|
+
SET status = ?, ended_at = ?, verification_result = ?
|
|
19
|
+
WHERE attempt_id = ?
|
|
20
|
+
`);
|
|
21
|
+
stmt.run(status, endedAt, verificationResult ? JSON.stringify(verificationResult) : null, attemptId);
|
|
22
|
+
}
|
|
23
|
+
getByNodeId(nodeId) {
|
|
24
|
+
const stmt = this.db.prepare(`
|
|
25
|
+
SELECT * FROM node_attempts
|
|
26
|
+
WHERE node_id = ?
|
|
27
|
+
ORDER BY attempt_number DESC
|
|
28
|
+
`);
|
|
29
|
+
const rows = stmt.all(nodeId);
|
|
30
|
+
return rows.map(row => this.mapRow(row));
|
|
31
|
+
}
|
|
32
|
+
getLatestAttempt(nodeId) {
|
|
33
|
+
const stmt = this.db.prepare(`
|
|
34
|
+
SELECT * FROM node_attempts
|
|
35
|
+
WHERE node_id = ?
|
|
36
|
+
ORDER BY attempt_number DESC
|
|
37
|
+
LIMIT 1
|
|
38
|
+
`);
|
|
39
|
+
const row = stmt.get(nodeId);
|
|
40
|
+
return row ? this.mapRow(row) : null;
|
|
41
|
+
}
|
|
42
|
+
mapRow(row) {
|
|
43
|
+
return {
|
|
44
|
+
attempt_id: row.attempt_id,
|
|
45
|
+
node_id: row.node_id,
|
|
46
|
+
strategy_id: row.strategy_id,
|
|
47
|
+
attempt_number: row.attempt_number,
|
|
48
|
+
started_at: row.started_at,
|
|
49
|
+
ended_at: row.ended_at,
|
|
50
|
+
status: row.status,
|
|
51
|
+
verification_result: row.verification_result ? JSON.parse(row.verification_result) : undefined,
|
|
52
|
+
diagnosis_result: row.diagnosis_result ? JSON.parse(row.diagnosis_result) : undefined,
|
|
53
|
+
created_at: row.created_at,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=node-attempt-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-attempt-repository.js","sourceRoot":"","sources":["../../../src/storage/repositories/node-attempt-repository.ts"],"names":[],"mappings":"AAsBA,MAAM,OAAO,qBAAqB;IACZ;IAApB,YAAoB,EAAY;QAAZ,OAAE,GAAF,EAAE,CAAU;IAAG,CAAC;IAEpC,MAAM,CAAC,OAAwC;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;KAK5B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CACN,OAAO,CAAC,UAAU,EAClB,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,WAAW,EACnB,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,UAAU,EAClB,OAAO,CAAC,QAAQ,IAAI,IAAI,EACxB,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,IAAI,EAChF,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAC3E,CAAC;IACJ,CAAC;IAED,YAAY,CACV,SAAiB,EACjB,MAAuC,EACvC,OAAe,EACf,kBAA+C;QAE/C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;KAI5B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CACN,MAAM,EACN,OAAO,EACP,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,EAC9D,SAAS,CACV,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,MAAc;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;KAI5B,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAU,CAAC;QACvC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,gBAAgB,CAAC,MAAc;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;KAK5B,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAQ,CAAC;QACpC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvC,CAAC;IAEO,MAAM,CAAC,GAAQ;QACrB,OAAO;YACL,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,cAAc,EAAE,GAAG,CAAC,cAAc;YAClC,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,mBAAmB,EAAE,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,SAAS;YAC9F,gBAAgB,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,SAAS;YACrF,UAAU,EAAE,GAAG,CAAC,UAAU;SAC3B,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { Database } from 'better-sqlite3';
|
|
2
|
+
import type { CompletionRule } from '../../pipeline/completion-verifier.js';
|
|
3
|
+
export type PipelinePlanStatus = 'draft' | 'approved' | 'running' | 'completed' | 'failed' | 'aborted';
|
|
4
|
+
export type PlanNodeStatus = 'pending' | 'in_progress' | 'retrying' | 'blocked' | 'done' | 'failed' | 'skipped';
|
|
5
|
+
export interface Strategy {
|
|
6
|
+
strategy_id: string;
|
|
7
|
+
name: string;
|
|
8
|
+
source: 'template' | 'dynamic';
|
|
9
|
+
method: StrategyMethod;
|
|
10
|
+
rule_overrides: Partial<CompletionRule>[];
|
|
11
|
+
timeout_override?: number;
|
|
12
|
+
priority: number;
|
|
13
|
+
success_count: number;
|
|
14
|
+
attempt_count: number;
|
|
15
|
+
}
|
|
16
|
+
export interface StrategyMethod {
|
|
17
|
+
instruction_suffix?: string;
|
|
18
|
+
provide_template?: string;
|
|
19
|
+
tool_hints?: string[];
|
|
20
|
+
context_files?: string[];
|
|
21
|
+
}
|
|
22
|
+
export interface RetryPolicy {
|
|
23
|
+
max_retries: number;
|
|
24
|
+
backoff_sec?: number;
|
|
25
|
+
}
|
|
26
|
+
export interface PipelinePlan {
|
|
27
|
+
plan_id: string;
|
|
28
|
+
template_id: string;
|
|
29
|
+
template_version: string;
|
|
30
|
+
goal: string;
|
|
31
|
+
project_path: string;
|
|
32
|
+
session_id: string;
|
|
33
|
+
params?: Record<string, string>;
|
|
34
|
+
status: PipelinePlanStatus;
|
|
35
|
+
created_at: string;
|
|
36
|
+
updated_at: string;
|
|
37
|
+
}
|
|
38
|
+
export interface PlanNode {
|
|
39
|
+
node_id: string;
|
|
40
|
+
plan_id: string;
|
|
41
|
+
phase: string;
|
|
42
|
+
title: string;
|
|
43
|
+
instruction: string;
|
|
44
|
+
completion_rules: CompletionRule[];
|
|
45
|
+
strategy_pool: Strategy[];
|
|
46
|
+
retry_policy: RetryPolicy;
|
|
47
|
+
timeout_sec: number;
|
|
48
|
+
dependencies?: string[];
|
|
49
|
+
status: PlanNodeStatus;
|
|
50
|
+
current_strategy_id?: string;
|
|
51
|
+
attempt_count: number;
|
|
52
|
+
created_at: string;
|
|
53
|
+
updated_at: string;
|
|
54
|
+
}
|
|
55
|
+
export declare class PipelinePlanRepository {
|
|
56
|
+
private db;
|
|
57
|
+
constructor(db: Database);
|
|
58
|
+
create(plan: Omit<PipelinePlan, 'created_at' | 'updated_at'>): void;
|
|
59
|
+
getById(planId: string): PipelinePlan | null;
|
|
60
|
+
getByProjectPath(projectPath: string): PipelinePlan | null;
|
|
61
|
+
updateStatus(planId: string, status: PipelinePlanStatus): void;
|
|
62
|
+
private mapPlanRow;
|
|
63
|
+
}
|
|
64
|
+
export declare class PlanNodeRepository {
|
|
65
|
+
private db;
|
|
66
|
+
constructor(db: Database);
|
|
67
|
+
create(node: Omit<PlanNode, 'created_at' | 'updated_at'>): void;
|
|
68
|
+
getByPlanId(planId: string): PlanNode[];
|
|
69
|
+
getById(nodeId: string): PlanNode | null;
|
|
70
|
+
updateStatus(nodeId: string, status: PlanNodeStatus): void;
|
|
71
|
+
updateAttempt(nodeId: string, strategyId: string, attemptCount: number): void;
|
|
72
|
+
updateStrategyPool(nodeId: string, strategyPool: Strategy[]): void;
|
|
73
|
+
private mapNodeRow;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=pipeline-plan-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline-plan-repository.d.ts","sourceRoot":"","sources":["../../../src/storage/repositories/pipeline-plan-repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
// ── Repository 实现 ─────────────────────────────────────────────────────
|
|
2
|
+
export class PipelinePlanRepository {
|
|
3
|
+
db;
|
|
4
|
+
constructor(db) {
|
|
5
|
+
this.db = db;
|
|
6
|
+
}
|
|
7
|
+
create(plan) {
|
|
8
|
+
const stmt = this.db.prepare(`
|
|
9
|
+
INSERT INTO pipeline_plans (
|
|
10
|
+
plan_id, template_id, template_version, goal,
|
|
11
|
+
project_path, session_id, params, status
|
|
12
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
13
|
+
`);
|
|
14
|
+
stmt.run(plan.plan_id, plan.template_id, plan.template_version, plan.goal, plan.project_path, plan.session_id, plan.params ? JSON.stringify(plan.params) : null, plan.status);
|
|
15
|
+
}
|
|
16
|
+
getById(planId) {
|
|
17
|
+
const stmt = this.db.prepare('SELECT * FROM pipeline_plans WHERE plan_id = ?');
|
|
18
|
+
const row = stmt.get(planId);
|
|
19
|
+
return row ? this.mapPlanRow(row) : null;
|
|
20
|
+
}
|
|
21
|
+
getByProjectPath(projectPath) {
|
|
22
|
+
const stmt = this.db.prepare(`
|
|
23
|
+
SELECT * FROM pipeline_plans
|
|
24
|
+
WHERE project_path = ? AND status IN ('approved', 'running')
|
|
25
|
+
ORDER BY created_at DESC
|
|
26
|
+
LIMIT 1
|
|
27
|
+
`);
|
|
28
|
+
const row = stmt.get(projectPath);
|
|
29
|
+
return row ? this.mapPlanRow(row) : null;
|
|
30
|
+
}
|
|
31
|
+
updateStatus(planId, status) {
|
|
32
|
+
const stmt = this.db.prepare(`
|
|
33
|
+
UPDATE pipeline_plans
|
|
34
|
+
SET status = ?, updated_at = datetime('now')
|
|
35
|
+
WHERE plan_id = ?
|
|
36
|
+
`);
|
|
37
|
+
stmt.run(status, planId);
|
|
38
|
+
}
|
|
39
|
+
mapPlanRow(row) {
|
|
40
|
+
return {
|
|
41
|
+
plan_id: row.plan_id,
|
|
42
|
+
template_id: row.template_id,
|
|
43
|
+
template_version: row.template_version,
|
|
44
|
+
goal: row.goal,
|
|
45
|
+
project_path: row.project_path,
|
|
46
|
+
session_id: row.session_id,
|
|
47
|
+
params: row.params ? JSON.parse(row.params) : undefined,
|
|
48
|
+
status: row.status,
|
|
49
|
+
created_at: row.created_at,
|
|
50
|
+
updated_at: row.updated_at,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export class PlanNodeRepository {
|
|
55
|
+
db;
|
|
56
|
+
constructor(db) {
|
|
57
|
+
this.db = db;
|
|
58
|
+
}
|
|
59
|
+
create(node) {
|
|
60
|
+
const stmt = this.db.prepare(`
|
|
61
|
+
INSERT INTO plan_nodes (
|
|
62
|
+
node_id, plan_id, phase, title, instruction,
|
|
63
|
+
completion_rules, strategy_pool, retry_policy,
|
|
64
|
+
timeout_sec, dependencies, status, current_strategy_id, attempt_count
|
|
65
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
66
|
+
`);
|
|
67
|
+
stmt.run(node.node_id, node.plan_id, node.phase, node.title, node.instruction, JSON.stringify(node.completion_rules), JSON.stringify(node.strategy_pool), JSON.stringify(node.retry_policy), node.timeout_sec, node.dependencies ? JSON.stringify(node.dependencies) : null, node.status, node.current_strategy_id ?? null, node.attempt_count);
|
|
68
|
+
}
|
|
69
|
+
getByPlanId(planId) {
|
|
70
|
+
const stmt = this.db.prepare('SELECT * FROM plan_nodes WHERE plan_id = ? ORDER BY created_at');
|
|
71
|
+
const rows = stmt.all(planId);
|
|
72
|
+
return rows.map(row => this.mapNodeRow(row));
|
|
73
|
+
}
|
|
74
|
+
getById(nodeId) {
|
|
75
|
+
const stmt = this.db.prepare('SELECT * FROM plan_nodes WHERE node_id = ?');
|
|
76
|
+
const row = stmt.get(nodeId);
|
|
77
|
+
return row ? this.mapNodeRow(row) : null;
|
|
78
|
+
}
|
|
79
|
+
updateStatus(nodeId, status) {
|
|
80
|
+
const stmt = this.db.prepare(`
|
|
81
|
+
UPDATE plan_nodes
|
|
82
|
+
SET status = ?, updated_at = datetime('now')
|
|
83
|
+
WHERE node_id = ?
|
|
84
|
+
`);
|
|
85
|
+
stmt.run(status, nodeId);
|
|
86
|
+
}
|
|
87
|
+
updateAttempt(nodeId, strategyId, attemptCount) {
|
|
88
|
+
const stmt = this.db.prepare(`
|
|
89
|
+
UPDATE plan_nodes
|
|
90
|
+
SET current_strategy_id = ?, attempt_count = ?, updated_at = datetime('now')
|
|
91
|
+
WHERE node_id = ?
|
|
92
|
+
`);
|
|
93
|
+
stmt.run(strategyId, attemptCount, nodeId);
|
|
94
|
+
}
|
|
95
|
+
updateStrategyPool(nodeId, strategyPool) {
|
|
96
|
+
const stmt = this.db.prepare(`
|
|
97
|
+
UPDATE plan_nodes
|
|
98
|
+
SET strategy_pool = ?, updated_at = datetime('now')
|
|
99
|
+
WHERE node_id = ?
|
|
100
|
+
`);
|
|
101
|
+
stmt.run(JSON.stringify(strategyPool), nodeId);
|
|
102
|
+
}
|
|
103
|
+
mapNodeRow(row) {
|
|
104
|
+
return {
|
|
105
|
+
node_id: row.node_id,
|
|
106
|
+
plan_id: row.plan_id,
|
|
107
|
+
phase: row.phase,
|
|
108
|
+
title: row.title,
|
|
109
|
+
instruction: row.instruction,
|
|
110
|
+
completion_rules: JSON.parse(row.completion_rules),
|
|
111
|
+
strategy_pool: JSON.parse(row.strategy_pool),
|
|
112
|
+
retry_policy: JSON.parse(row.retry_policy),
|
|
113
|
+
timeout_sec: row.timeout_sec,
|
|
114
|
+
dependencies: row.dependencies ? JSON.parse(row.dependencies) : undefined,
|
|
115
|
+
status: row.status,
|
|
116
|
+
current_strategy_id: row.current_strategy_id,
|
|
117
|
+
attempt_count: row.attempt_count,
|
|
118
|
+
created_at: row.created_at,
|
|
119
|
+
updated_at: row.updated_at,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=pipeline-plan-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline-plan-repository.js","sourceRoot":"","sources":["../../../src/storage/repositories/pipeline-plan-repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { Database } from 'better-sqlite3';
|
|
2
|
+
export interface TemplateVersion {
|
|
3
|
+
version_id: string;
|
|
4
|
+
template_id: string;
|
|
5
|
+
version: string;
|
|
6
|
+
content: Record<string, unknown>;
|
|
7
|
+
evolved_from?: string;
|
|
8
|
+
evolution_reason?: string;
|
|
9
|
+
created_at: string;
|
|
10
|
+
}
|
|
11
|
+
export interface TemplateEvolutionEvent {
|
|
12
|
+
event_id: string;
|
|
13
|
+
template_id: string;
|
|
14
|
+
plan_id: string;
|
|
15
|
+
signal_type: EvolutionSignalType;
|
|
16
|
+
evidence: Record<string, unknown>;
|
|
17
|
+
action: string;
|
|
18
|
+
new_version_id?: string;
|
|
19
|
+
created_at: string;
|
|
20
|
+
}
|
|
21
|
+
export type EvolutionSignalType = 'multi_retry_pass' | 'backtrack_failure' | 'strategy_reliable' | 'strategy_ineffective' | 'diagnosis_pattern';
|
|
22
|
+
export declare class TemplateVersionRepository {
|
|
23
|
+
private db;
|
|
24
|
+
constructor(db: Database);
|
|
25
|
+
create(data: Omit<TemplateVersion, 'version_id' | 'created_at'>): TemplateVersion;
|
|
26
|
+
getById(versionId: string): TemplateVersion | null;
|
|
27
|
+
getByTemplateId(templateId: string): TemplateVersion[];
|
|
28
|
+
getLatest(templateId: string): TemplateVersion | null;
|
|
29
|
+
private mapRow;
|
|
30
|
+
}
|
|
31
|
+
export declare class TemplateEvolutionEventRepository {
|
|
32
|
+
private db;
|
|
33
|
+
constructor(db: Database);
|
|
34
|
+
create(data: Omit<TemplateEvolutionEvent, 'event_id' | 'created_at'>): void;
|
|
35
|
+
getByTemplateId(templateId: string, limit?: number): TemplateEvolutionEvent[];
|
|
36
|
+
getRecent(limit?: number): TemplateEvolutionEvent[];
|
|
37
|
+
private mapRow;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=template-evolution-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-evolution-repository.d.ts","sourceRoot":"","sources":["../../../src/storage/repositories/template-evolution-repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAK/C,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,mBAAmB,CAAC;IACjC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,mBAAmB,GAC3B,kBAAkB,GAClB,mBAAmB,GACnB,mBAAmB,GACnB,sBAAsB,GACtB,mBAAmB,CAAC;AAIxB,qBAAa,yBAAyB;IACxB,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAEhC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,EAAE,YAAY,GAAG,YAAY,CAAC,GAAG,eAAe;IAgBjF,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAKlD,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,EAAE;IAOtD,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAOrD,OAAO,CAAC,MAAM;CAWf;AAID,qBAAa,gCAAgC;IAC/B,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAEhC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,sBAAsB,EAAE,UAAU,GAAG,YAAY,CAAC,GAAG,IAAI;IAgB3E,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,sBAAsB,EAAE;IAUzE,SAAS,CAAC,KAAK,SAAM,GAAG,sBAAsB,EAAE;IAShD,OAAO,CAAC,MAAM;CAYf"}
|