@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.
Files changed (135) hide show
  1. package/dist/convention/types.d.ts +15 -5
  2. package/dist/convention/types.d.ts.map +1 -1
  3. package/dist/daemon/engine-registry.d.ts.map +1 -1
  4. package/dist/daemon/engine-registry.js +6 -0
  5. package/dist/daemon/engine-registry.js.map +1 -1
  6. package/dist/daemon/handler-context.d.ts +5 -1
  7. package/dist/daemon/handler-context.d.ts.map +1 -1
  8. package/dist/daemon/handlers/post-tool-use-handler.d.ts.map +1 -1
  9. package/dist/daemon/handlers/post-tool-use-handler.js +59 -2
  10. package/dist/daemon/handlers/post-tool-use-handler.js.map +1 -1
  11. package/dist/daemon/handlers/pre-tool-use-handler.d.ts.map +1 -1
  12. package/dist/daemon/handlers/pre-tool-use-handler.js +25 -2
  13. package/dist/daemon/handlers/pre-tool-use-handler.js.map +1 -1
  14. package/dist/daemon/handlers/session-cleanup.d.ts +2 -0
  15. package/dist/daemon/handlers/session-cleanup.d.ts.map +1 -1
  16. package/dist/daemon/handlers/session-cleanup.js +20 -0
  17. package/dist/daemon/handlers/session-cleanup.js.map +1 -1
  18. package/dist/daemon/handlers/stop-handler.d.ts.map +1 -1
  19. package/dist/daemon/handlers/stop-handler.js +1 -0
  20. package/dist/daemon/handlers/stop-handler.js.map +1 -1
  21. package/dist/pipeline/completion-gate.d.ts +1 -0
  22. package/dist/pipeline/completion-gate.d.ts.map +1 -1
  23. package/dist/pipeline/completion-gate.js +43 -3
  24. package/dist/pipeline/completion-gate.js.map +1 -1
  25. package/dist/pipeline/completion-verifier.d.ts +75 -0
  26. package/dist/pipeline/completion-verifier.d.ts.map +1 -0
  27. package/dist/pipeline/completion-verifier.js +217 -0
  28. package/dist/pipeline/completion-verifier.js.map +1 -0
  29. package/dist/pipeline/diagnosis-service.d.ts +43 -0
  30. package/dist/pipeline/diagnosis-service.d.ts.map +1 -0
  31. package/dist/pipeline/diagnosis-service.js +136 -0
  32. package/dist/pipeline/diagnosis-service.js.map +1 -0
  33. package/dist/pipeline/execution-engine.d.ts +79 -0
  34. package/dist/pipeline/execution-engine.d.ts.map +1 -0
  35. package/dist/pipeline/execution-engine.js +227 -0
  36. package/dist/pipeline/execution-engine.js.map +1 -0
  37. package/dist/pipeline/node-type-sync.d.ts.map +1 -1
  38. package/dist/pipeline/node-type-sync.js +25 -22
  39. package/dist/pipeline/node-type-sync.js.map +1 -1
  40. package/dist/pipeline/plan-service.d.ts +58 -0
  41. package/dist/pipeline/plan-service.d.ts.map +1 -0
  42. package/dist/pipeline/plan-service.js +382 -0
  43. package/dist/pipeline/plan-service.js.map +1 -0
  44. package/dist/pipeline/strategy-selector.d.ts +41 -0
  45. package/dist/pipeline/strategy-selector.d.ts.map +1 -0
  46. package/dist/pipeline/strategy-selector.js +112 -0
  47. package/dist/pipeline/strategy-selector.js.map +1 -0
  48. package/dist/pipeline/template-evolver.d.ts +45 -0
  49. package/dist/pipeline/template-evolver.d.ts.map +1 -0
  50. package/dist/pipeline/template-evolver.js +223 -0
  51. package/dist/pipeline/template-evolver.js.map +1 -0
  52. package/dist/storage/repositories/node-attempt-repository.d.ts +29 -0
  53. package/dist/storage/repositories/node-attempt-repository.d.ts.map +1 -0
  54. package/dist/storage/repositories/node-attempt-repository.js +57 -0
  55. package/dist/storage/repositories/node-attempt-repository.js.map +1 -0
  56. package/dist/storage/repositories/pipeline-plan-repository.d.ts +75 -0
  57. package/dist/storage/repositories/pipeline-plan-repository.d.ts.map +1 -0
  58. package/dist/storage/repositories/pipeline-plan-repository.js +123 -0
  59. package/dist/storage/repositories/pipeline-plan-repository.js.map +1 -0
  60. package/dist/storage/repositories/template-evolution-repository.d.ts +39 -0
  61. package/dist/storage/repositories/template-evolution-repository.d.ts.map +1 -0
  62. package/dist/storage/repositories/template-evolution-repository.js +83 -0
  63. package/dist/storage/repositories/template-evolution-repository.js.map +1 -0
  64. package/dist/storage/sqlite.d.ts +8 -0
  65. package/dist/storage/sqlite.d.ts.map +1 -1
  66. package/dist/storage/sqlite.js +13 -0
  67. package/dist/storage/sqlite.js.map +1 -1
  68. package/dist/web/routes/evolution.d.ts +4 -0
  69. package/dist/web/routes/evolution.d.ts.map +1 -0
  70. package/dist/web/routes/evolution.js +61 -0
  71. package/dist/web/routes/evolution.js.map +1 -0
  72. package/dist/web/routes/plans.d.ts +5 -0
  73. package/dist/web/routes/plans.d.ts.map +1 -0
  74. package/dist/web/routes/plans.js +163 -0
  75. package/dist/web/routes/plans.js.map +1 -0
  76. package/dist/web/routes/templates.d.ts +4 -0
  77. package/dist/web/routes/templates.d.ts.map +1 -0
  78. package/dist/web/routes/templates.js +117 -0
  79. package/dist/web/routes/templates.js.map +1 -0
  80. package/dist/web/server.d.ts.map +1 -1
  81. package/dist/web/server.js +6 -0
  82. package/dist/web/server.js.map +1 -1
  83. package/dist/web-static/assets/Analytics-Bo74j97W.js +1 -0
  84. package/dist/web-static/assets/BatchProgress-BQ533tSf.js +1 -0
  85. package/dist/web-static/assets/{Breadcrumb-DbDeWYcH.js → Breadcrumb-DtfwnOx6.js} +1 -1
  86. package/dist/web-static/assets/{Config-yTRFpmlP.js → Config-DhfQsbT1.js} +1 -1
  87. package/dist/web-static/assets/{ConfirmDialog-CH1HyRaY.js → ConfirmDialog-CVzB7X5y.js} +1 -1
  88. package/dist/web-static/assets/{Conventions-DaqIk41m.js → Conventions-BobuQiOk.js} +1 -1
  89. package/dist/web-static/assets/Dashboard-Bj28rnDe.js +1 -0
  90. package/dist/web-static/assets/{ErrorState-HW0OjEYK.js → ErrorState-DXHA8lr8.js} +1 -1
  91. package/dist/web-static/assets/Events-C0y7WcDP.js +1 -0
  92. package/dist/web-static/assets/Evolution-DimZAXFS.js +1 -0
  93. package/dist/web-static/assets/Knowledge-Y1lX6vor.js +2 -0
  94. package/dist/web-static/assets/{NodeTypes-B5E6NYKn.js → NodeTypes-DyrDqhBp.js} +1 -1
  95. package/dist/web-static/assets/{Pagination-ooTI9JPa.js → Pagination-lp8b_3NR.js} +1 -1
  96. package/dist/web-static/assets/{PipelineDetail-DCnqD5lr.js → PipelineDetail-DGKz18zu.js} +3 -3
  97. package/dist/web-static/assets/{PipelineTemplates-CxGoLw6Q.js → PipelineTemplates-D4zvL6I1.js} +1 -1
  98. package/dist/web-static/assets/Pipelines-CR9oD3Xy.js +2 -0
  99. package/dist/web-static/assets/ProjectDetail-RfdtEvTT.js +1 -0
  100. package/dist/web-static/assets/Projects-RGIPdiJn.js +1 -0
  101. package/dist/web-static/assets/Quality-BdvL1VQn.js +3 -0
  102. package/dist/web-static/assets/{SessionDetail-DleCNmQH.js → SessionDetail-BNDIfmmq.js} +1 -1
  103. package/dist/web-static/assets/{Sessions-Dz6xFq_4.js → Sessions-CorfQV78.js} +2 -2
  104. package/dist/web-static/assets/{BatchProgress-CIrC9RcC.js → Skeleton-B7PVDJJ_.js} +1 -1
  105. package/dist/web-static/assets/Skills-BJt0OrKj.js +1 -0
  106. package/dist/web-static/assets/TemplateDetail-DOfBYdQ3.js +1 -0
  107. package/dist/web-static/assets/Templates-Cp3yC5tv.js +1 -0
  108. package/dist/web-static/assets/{client-B_-7qCOP.js → client-BhcjNvkG.js} +1 -1
  109. package/dist/web-static/assets/index-CqwJts5v.css +2 -0
  110. package/dist/web-static/assets/index-DdmJVOxm.js +2 -0
  111. package/dist/web-static/assets/{ui-B2gvOcFY.js → ui-CDL3BZ13.js} +1 -1
  112. package/dist/web-static/assets/useDebounce-DNfPs3Tv.js +1 -0
  113. package/dist/web-static/assets/vendor-DRGPi8ui.js +9 -0
  114. package/dist/web-static/assets/{vendor-charts-BXsEmmv5.js → vendor-charts-9eVsQvUV.js} +4 -4
  115. package/dist/web-static/assets/{vendor-editor-DYIoTHFO.js → vendor-editor-B1NX2ipj.js} +1 -1
  116. package/dist/web-static/assets/vendor-flow-srkes8If.js +7 -0
  117. package/dist/web-static/assets/{vendor-motion-BsfSkSjj.js → vendor-motion-CQmdgnI8.js} +2 -2
  118. package/dist/web-static/assets/{vendor-query-BF-uT_c5.js → vendor-query-DqPOMnuX.js} +1 -1
  119. package/dist/web-static/assets/{vendor-react-CXfI0Tes.js → vendor-react-DJI9oneq.js} +1 -1
  120. package/dist/web-static/index.html +11 -11
  121. package/package.json +2 -1
  122. package/dist/web-static/assets/Analytics-BTMAlQBr.js +0 -1
  123. package/dist/web-static/assets/Dashboard-BS61GjKa.js +0 -1
  124. package/dist/web-static/assets/Events-DAms_1fs.js +0 -1
  125. package/dist/web-static/assets/Knowledge-CZhuou1K.js +0 -2
  126. package/dist/web-static/assets/Pipelines-DEuVx4hF.js +0 -2
  127. package/dist/web-static/assets/ProjectDetail-Dn01H3zi.js +0 -1
  128. package/dist/web-static/assets/Projects-D5-BfuFU.js +0 -1
  129. package/dist/web-static/assets/Quality-wvfdPtGB.js +0 -3
  130. package/dist/web-static/assets/Skills-CpHL-tyW.js +0 -1
  131. package/dist/web-static/assets/index-CN_edVMt.js +0 -2
  132. package/dist/web-static/assets/index-DLMLziRH.css +0 -2
  133. package/dist/web-static/assets/useDebounce-Bo1fLB5L.js +0 -1
  134. package/dist/web-static/assets/vendor-BpBCrKSP.js +0 -9
  135. 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"}