dino-spec 17.4.3 → 17.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +10 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/core/agents/__tests__/confidence-gate.test.d.ts +5 -0
- package/dist/core/agents/__tests__/confidence-gate.test.d.ts.map +1 -0
- package/dist/core/agents/__tests__/confidence-gate.test.js +329 -0
- package/dist/core/agents/__tests__/confidence-gate.test.js.map +1 -0
- package/dist/core/agents/__tests__/gap-detector.test.d.ts +5 -0
- package/dist/core/agents/__tests__/gap-detector.test.d.ts.map +1 -0
- package/dist/core/agents/__tests__/gap-detector.test.js +609 -0
- package/dist/core/agents/__tests__/gap-detector.test.js.map +1 -0
- package/dist/core/agents/__tests__/learning-loop.test.d.ts +5 -0
- package/dist/core/agents/__tests__/learning-loop.test.d.ts.map +1 -0
- package/dist/core/agents/__tests__/learning-loop.test.js +663 -0
- package/dist/core/agents/__tests__/learning-loop.test.js.map +1 -0
- package/dist/core/agents/__tests__/parallel-executor.test.d.ts +5 -0
- package/dist/core/agents/__tests__/parallel-executor.test.d.ts.map +1 -0
- package/dist/core/agents/__tests__/parallel-executor.test.js +610 -0
- package/dist/core/agents/__tests__/parallel-executor.test.js.map +1 -0
- package/dist/core/agents/__tests__/research-validator.test.js +5 -5
- package/dist/core/agents/__tests__/research-validator.test.js.map +1 -1
- package/dist/core/agents/__tests__/skill-creator.test.d.ts +5 -0
- package/dist/core/agents/__tests__/skill-creator.test.d.ts.map +1 -0
- package/dist/core/agents/__tests__/skill-creator.test.js +443 -0
- package/dist/core/agents/__tests__/skill-creator.test.js.map +1 -0
- package/dist/core/agents/__tests__/state-persistence.test.d.ts +2 -0
- package/dist/core/agents/__tests__/state-persistence.test.d.ts.map +1 -0
- package/dist/core/agents/__tests__/state-persistence.test.js +270 -0
- package/dist/core/agents/__tests__/state-persistence.test.js.map +1 -0
- package/dist/core/agents/__tests__/validation-cache.test.d.ts +2 -0
- package/dist/core/agents/__tests__/validation-cache.test.d.ts.map +1 -0
- package/dist/core/agents/__tests__/validation-cache.test.js +181 -0
- package/dist/core/agents/__tests__/validation-cache.test.js.map +1 -0
- package/dist/core/agents/blackboard.d.ts +22 -3
- package/dist/core/agents/blackboard.d.ts.map +1 -1
- package/dist/core/agents/blackboard.js +52 -2
- package/dist/core/agents/blackboard.js.map +1 -1
- package/dist/core/agents/circuit-breaker.d.ts +79 -1
- package/dist/core/agents/circuit-breaker.d.ts.map +1 -1
- package/dist/core/agents/circuit-breaker.js +175 -1
- package/dist/core/agents/circuit-breaker.js.map +1 -1
- package/dist/core/agents/clarification-phase.d.ts +128 -0
- package/dist/core/agents/clarification-phase.d.ts.map +1 -0
- package/dist/core/agents/clarification-phase.js +375 -0
- package/dist/core/agents/clarification-phase.js.map +1 -0
- package/dist/core/agents/confidence-gate.d.ts +116 -3
- package/dist/core/agents/confidence-gate.d.ts.map +1 -1
- package/dist/core/agents/confidence-gate.js +363 -3
- package/dist/core/agents/confidence-gate.js.map +1 -1
- package/dist/core/agents/correction-tracker.d.ts +197 -0
- package/dist/core/agents/correction-tracker.d.ts.map +1 -0
- package/dist/core/agents/correction-tracker.js +366 -0
- package/dist/core/agents/correction-tracker.js.map +1 -0
- package/dist/core/agents/dependency-graph.d.ts +193 -0
- package/dist/core/agents/dependency-graph.d.ts.map +1 -0
- package/dist/core/agents/dependency-graph.js +462 -0
- package/dist/core/agents/dependency-graph.js.map +1 -0
- package/dist/core/agents/gap-detector.d.ts +277 -0
- package/dist/core/agents/gap-detector.d.ts.map +1 -0
- package/dist/core/agents/gap-detector.js +540 -0
- package/dist/core/agents/gap-detector.js.map +1 -0
- package/dist/core/agents/index.d.ts +14 -1
- package/dist/core/agents/index.d.ts.map +1 -1
- package/dist/core/agents/index.js +26 -1
- package/dist/core/agents/index.js.map +1 -1
- package/dist/core/agents/message-protocol.d.ts +13 -2
- package/dist/core/agents/message-protocol.d.ts.map +1 -1
- package/dist/core/agents/message-protocol.js +20 -1
- package/dist/core/agents/message-protocol.js.map +1 -1
- package/dist/core/agents/parallel-executor.d.ts +182 -0
- package/dist/core/agents/parallel-executor.d.ts.map +1 -0
- package/dist/core/agents/parallel-executor.js +474 -0
- package/dist/core/agents/parallel-executor.js.map +1 -0
- package/dist/core/agents/pattern-detector.d.ts +157 -0
- package/dist/core/agents/pattern-detector.d.ts.map +1 -0
- package/dist/core/agents/pattern-detector.js +370 -0
- package/dist/core/agents/pattern-detector.js.map +1 -0
- package/dist/core/agents/registry-client.d.ts +6 -0
- package/dist/core/agents/registry-client.d.ts.map +1 -1
- package/dist/core/agents/registry-client.js +3 -0
- package/dist/core/agents/registry-client.js.map +1 -1
- package/dist/core/agents/research-phase.d.ts +114 -0
- package/dist/core/agents/research-phase.d.ts.map +1 -0
- package/dist/core/agents/research-phase.js +355 -0
- package/dist/core/agents/research-phase.js.map +1 -0
- package/dist/core/agents/research-validator.d.ts +13 -2
- package/dist/core/agents/research-validator.d.ts.map +1 -1
- package/dist/core/agents/research-validator.js +63 -31
- package/dist/core/agents/research-validator.js.map +1 -1
- package/dist/core/agents/skill-creator.d.ts +174 -0
- package/dist/core/agents/skill-creator.d.ts.map +1 -0
- package/dist/core/agents/skill-creator.js +570 -0
- package/dist/core/agents/skill-creator.js.map +1 -0
- package/dist/core/agents/state-persistence.d.ts +184 -0
- package/dist/core/agents/state-persistence.d.ts.map +1 -0
- package/dist/core/agents/state-persistence.js +394 -0
- package/dist/core/agents/state-persistence.js.map +1 -0
- package/dist/core/agents/validation-cache.d.ts +122 -0
- package/dist/core/agents/validation-cache.d.ts.map +1 -0
- package/dist/core/agents/validation-cache.js +280 -0
- package/dist/core/agents/validation-cache.js.map +1 -0
- package/dist/core/agents/validators/__tests__/validators.test.d.ts +5 -0
- package/dist/core/agents/validators/__tests__/validators.test.d.ts.map +1 -0
- package/dist/core/agents/validators/__tests__/validators.test.js +321 -0
- package/dist/core/agents/validators/__tests__/validators.test.js.map +1 -0
- package/dist/core/agents/validators/base-validator.d.ts +191 -0
- package/dist/core/agents/validators/base-validator.d.ts.map +1 -0
- package/dist/core/agents/validators/base-validator.js +192 -0
- package/dist/core/agents/validators/base-validator.js.map +1 -0
- package/dist/core/agents/validators/index.d.ts +7 -0
- package/dist/core/agents/validators/index.d.ts.map +1 -0
- package/dist/core/agents/validators/index.js +7 -0
- package/dist/core/agents/validators/index.js.map +1 -0
- package/dist/core/agents/validators/npm-validator.d.ts +50 -0
- package/dist/core/agents/validators/npm-validator.d.ts.map +1 -0
- package/dist/core/agents/validators/npm-validator.js +211 -0
- package/dist/core/agents/validators/npm-validator.js.map +1 -0
- package/dist/core/agents/validators/pip-validator.d.ts +49 -0
- package/dist/core/agents/validators/pip-validator.d.ts.map +1 -0
- package/dist/core/agents/validators/pip-validator.js +191 -0
- package/dist/core/agents/validators/pip-validator.js.map +1 -0
- package/dist/core/agents/validators/validator-registry.d.ts +122 -0
- package/dist/core/agents/validators/validator-registry.d.ts.map +1 -0
- package/dist/core/agents/validators/validator-registry.js +321 -0
- package/dist/core/agents/validators/validator-registry.js.map +1 -0
- package/dist/core/context-repl/types.d.ts +4 -4
- package/dist/core/memory/index.d.ts +1 -0
- package/dist/core/memory/index.d.ts.map +1 -1
- package/dist/core/memory/index.js +2 -0
- package/dist/core/memory/index.js.map +1 -1
- package/dist/core/memory/learning-store.d.ts +222 -0
- package/dist/core/memory/learning-store.d.ts.map +1 -0
- package/dist/core/memory/learning-store.js +477 -0
- package/dist/core/memory/learning-store.js.map +1 -0
- package/dist/core/spec-analyzer/__tests__/ambiguity-detector.test.d.ts +5 -0
- package/dist/core/spec-analyzer/__tests__/ambiguity-detector.test.d.ts.map +1 -0
- package/dist/core/spec-analyzer/__tests__/ambiguity-detector.test.js +401 -0
- package/dist/core/spec-analyzer/__tests__/ambiguity-detector.test.js.map +1 -0
- package/dist/core/spec-analyzer/ambiguity-detector.d.ts +99 -0
- package/dist/core/spec-analyzer/ambiguity-detector.d.ts.map +1 -0
- package/dist/core/spec-analyzer/ambiguity-detector.js +250 -0
- package/dist/core/spec-analyzer/ambiguity-detector.js.map +1 -0
- package/dist/core/spec-analyzer/clarification-generator.d.ts +76 -0
- package/dist/core/spec-analyzer/clarification-generator.d.ts.map +1 -0
- package/dist/core/spec-analyzer/clarification-generator.js +257 -0
- package/dist/core/spec-analyzer/clarification-generator.js.map +1 -0
- package/dist/core/spec-analyzer/index.d.ts +10 -1
- package/dist/core/spec-analyzer/index.d.ts.map +1 -1
- package/dist/core/spec-analyzer/index.js +13 -1
- package/dist/core/spec-analyzer/index.js.map +1 -1
- package/dist/core/spec-analyzer/patterns.d.ts +73 -0
- package/dist/core/spec-analyzer/patterns.d.ts.map +1 -0
- package/dist/core/spec-analyzer/patterns.js +412 -0
- package/dist/core/spec-analyzer/patterns.js.map +1 -0
- package/dist/hooks/__tests__/dynamic-generator.test.d.ts +5 -0
- package/dist/hooks/__tests__/dynamic-generator.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/dynamic-generator.test.js +425 -0
- package/dist/hooks/__tests__/dynamic-generator.test.js.map +1 -0
- package/dist/hooks/__tests__/hook-agent-bridge.test.d.ts +5 -0
- package/dist/hooks/__tests__/hook-agent-bridge.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/hook-agent-bridge.test.js +315 -0
- package/dist/hooks/__tests__/hook-agent-bridge.test.js.map +1 -0
- package/dist/hooks/dynamic-generator.d.ts +158 -0
- package/dist/hooks/dynamic-generator.d.ts.map +1 -0
- package/dist/hooks/dynamic-generator.js +448 -0
- package/dist/hooks/dynamic-generator.js.map +1 -0
- package/dist/hooks/hook-agent-bridge.d.ts +252 -0
- package/dist/hooks/hook-agent-bridge.d.ts.map +1 -0
- package/dist/hooks/hook-agent-bridge.js +489 -0
- package/dist/hooks/hook-agent-bridge.js.map +1 -0
- package/dist/hooks/index.d.ts +3 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +5 -1
- package/dist/hooks/index.js.map +1 -1
- package/dist/mcp/tool-catalog.d.ts.map +1 -1
- package/dist/mcp/tool-catalog.js +47 -0
- package/dist/mcp/tool-catalog.js.map +1 -1
- package/dist/mcp/tool-tiers.d.ts.map +1 -1
- package/dist/mcp/tool-tiers.js +4 -0
- package/dist/mcp/tool-tiers.js.map +1 -1
- package/dist/mcp/tools/index.d.ts +2 -1
- package/dist/mcp/tools/index.d.ts.map +1 -1
- package/dist/mcp/tools/index.js +15 -1
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/learning-store.d.ts +30 -0
- package/dist/mcp/tools/learning-store.d.ts.map +1 -0
- package/dist/mcp/tools/learning-store.js +286 -0
- package/dist/mcp/tools/learning-store.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Correction Tracker - v17.5.0
|
|
3
|
+
*
|
|
4
|
+
* Tracks user corrections to Claude's outputs with full context.
|
|
5
|
+
* Used to learn patterns for future automation.
|
|
6
|
+
*
|
|
7
|
+
* Correction sources:
|
|
8
|
+
* - "no, use X instead" → explicit correction
|
|
9
|
+
* - "actually, it should be Y" → explicit correction
|
|
10
|
+
* - User edits Claude's output → implicit correction
|
|
11
|
+
* - Repeated similar requests → pattern emergence
|
|
12
|
+
*
|
|
13
|
+
* @module correction-tracker
|
|
14
|
+
*/
|
|
15
|
+
import { jaccardSimilarity } from '../memory/similarity-utils.js';
|
|
16
|
+
// =============================================================================
|
|
17
|
+
// Constants
|
|
18
|
+
// =============================================================================
|
|
19
|
+
export const DEFAULT_TRACKER_CONFIG = {
|
|
20
|
+
automationThreshold: 3,
|
|
21
|
+
clusteringSimilarity: 0.7,
|
|
22
|
+
maxCorrections: 500,
|
|
23
|
+
retentionDays: 90,
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Patterns that indicate explicit corrections
|
|
27
|
+
*/
|
|
28
|
+
const CORRECTION_PATTERNS = [
|
|
29
|
+
/^(?:no|nope|wrong)[,.]?\s*(.+)/i,
|
|
30
|
+
/^actually[,.]?\s*(.+)/i,
|
|
31
|
+
/^(?:use|prefer)\s+(.+?)\s+instead/i,
|
|
32
|
+
/^(?:change|replace)\s+(.+?)\s+(?:to|with)\s+(.+)/i,
|
|
33
|
+
/^(?:it should be|should be)\s+(.+)/i,
|
|
34
|
+
/^(?:not|don't)\s+(.+?)[,.]?\s*(?:use|prefer)\s+(.+)/i,
|
|
35
|
+
];
|
|
36
|
+
// =============================================================================
|
|
37
|
+
// CorrectionTracker Class
|
|
38
|
+
// =============================================================================
|
|
39
|
+
/**
|
|
40
|
+
* Tracks and clusters user corrections for pattern learning
|
|
41
|
+
*/
|
|
42
|
+
export class CorrectionTracker {
|
|
43
|
+
corrections = new Map();
|
|
44
|
+
clusters = new Map();
|
|
45
|
+
config;
|
|
46
|
+
constructor(config = {}) {
|
|
47
|
+
this.config = { ...DEFAULT_TRACKER_CONFIG, ...config };
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Track a new correction
|
|
51
|
+
*/
|
|
52
|
+
track(context, type = 'explicit') {
|
|
53
|
+
const id = this.generateId();
|
|
54
|
+
const correction = {
|
|
55
|
+
id,
|
|
56
|
+
type,
|
|
57
|
+
context,
|
|
58
|
+
timestamp: new Date(),
|
|
59
|
+
keywords: this.extractKeywords(context),
|
|
60
|
+
normalizedPattern: this.normalizePattern(context),
|
|
61
|
+
promoted: false,
|
|
62
|
+
};
|
|
63
|
+
this.corrections.set(id, correction);
|
|
64
|
+
this.updateClusters(correction);
|
|
65
|
+
this.enforceRetention();
|
|
66
|
+
return correction;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Parse user text for explicit corrections
|
|
70
|
+
*/
|
|
71
|
+
parseCorrection(userText) {
|
|
72
|
+
for (const pattern of CORRECTION_PATTERNS) {
|
|
73
|
+
const match = userText.match(pattern);
|
|
74
|
+
if (match) {
|
|
75
|
+
return {
|
|
76
|
+
detected: true,
|
|
77
|
+
pattern: match[1]?.trim(),
|
|
78
|
+
replacement: match[2]?.trim(),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return { detected: false };
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get all corrections
|
|
86
|
+
*/
|
|
87
|
+
getCorrections() {
|
|
88
|
+
return Array.from(this.corrections.values());
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Get correction by ID
|
|
92
|
+
*/
|
|
93
|
+
getCorrection(id) {
|
|
94
|
+
return this.corrections.get(id);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Get clusters that meet automation threshold
|
|
98
|
+
*/
|
|
99
|
+
getPromotableClusters() {
|
|
100
|
+
return Array.from(this.clusters.values()).filter((c) => c.meetsThreshold && !c.representative.promoted);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get all clusters
|
|
104
|
+
*/
|
|
105
|
+
getClusters() {
|
|
106
|
+
return Array.from(this.clusters.values());
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Get cluster by ID
|
|
110
|
+
*/
|
|
111
|
+
getCluster(id) {
|
|
112
|
+
return this.clusters.get(id);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Find similar corrections to a new one
|
|
116
|
+
*/
|
|
117
|
+
findSimilar(context, minSimilarity = 0.5) {
|
|
118
|
+
const normalized = this.normalizePattern(context);
|
|
119
|
+
const similar = [];
|
|
120
|
+
for (const correction of this.corrections.values()) {
|
|
121
|
+
const score = jaccardSimilarity(normalized, correction.normalizedPattern);
|
|
122
|
+
if (score >= minSimilarity) {
|
|
123
|
+
similar.push({ correction, score });
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return similar.sort((a, b) => b.score - a.score).map((s) => s.correction);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Mark a cluster as promoted (pattern learned)
|
|
130
|
+
*/
|
|
131
|
+
markPromoted(clusterId) {
|
|
132
|
+
const cluster = this.clusters.get(clusterId);
|
|
133
|
+
if (!cluster)
|
|
134
|
+
return false;
|
|
135
|
+
for (const correction of cluster.corrections) {
|
|
136
|
+
correction.promoted = true;
|
|
137
|
+
}
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Get statistics
|
|
142
|
+
*/
|
|
143
|
+
getStats() {
|
|
144
|
+
const corrections = Array.from(this.corrections.values());
|
|
145
|
+
const byType = {
|
|
146
|
+
explicit: 0,
|
|
147
|
+
implicit: 0,
|
|
148
|
+
preference: 0,
|
|
149
|
+
style: 0,
|
|
150
|
+
};
|
|
151
|
+
for (const c of corrections) {
|
|
152
|
+
byType[c.type]++;
|
|
153
|
+
}
|
|
154
|
+
const sorted = corrections.sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());
|
|
155
|
+
return {
|
|
156
|
+
totalCorrections: corrections.length,
|
|
157
|
+
totalClusters: this.clusters.size,
|
|
158
|
+
promotableClusters: this.getPromotableClusters().length,
|
|
159
|
+
byType,
|
|
160
|
+
oldestCorrection: sorted[0]?.timestamp ?? null,
|
|
161
|
+
newestCorrection: sorted[sorted.length - 1]?.timestamp ?? null,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Clear all corrections
|
|
166
|
+
*/
|
|
167
|
+
clear() {
|
|
168
|
+
this.corrections.clear();
|
|
169
|
+
this.clusters.clear();
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Export state for persistence
|
|
173
|
+
*/
|
|
174
|
+
export() {
|
|
175
|
+
return {
|
|
176
|
+
corrections: Array.from(this.corrections.values()),
|
|
177
|
+
clusters: Array.from(this.clusters.values()),
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Import state from persistence
|
|
182
|
+
*/
|
|
183
|
+
import(state) {
|
|
184
|
+
this.corrections.clear();
|
|
185
|
+
this.clusters.clear();
|
|
186
|
+
for (const correction of state.corrections) {
|
|
187
|
+
// Restore Date objects
|
|
188
|
+
correction.timestamp = new Date(correction.timestamp);
|
|
189
|
+
this.corrections.set(correction.id, correction);
|
|
190
|
+
}
|
|
191
|
+
for (const cluster of state.clusters) {
|
|
192
|
+
cluster.firstSeen = new Date(cluster.firstSeen);
|
|
193
|
+
cluster.lastSeen = new Date(cluster.lastSeen);
|
|
194
|
+
this.clusters.set(cluster.id, cluster);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
// ---------------------------------------------------------------------------
|
|
198
|
+
// Private Methods
|
|
199
|
+
// ---------------------------------------------------------------------------
|
|
200
|
+
generateId() {
|
|
201
|
+
return `corr-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
202
|
+
}
|
|
203
|
+
extractKeywords(context) {
|
|
204
|
+
const text = `${context.original} ${context.corrected}`.toLowerCase();
|
|
205
|
+
const words = text.split(/\W+/).filter((w) => w.length > 2);
|
|
206
|
+
// Remove common words
|
|
207
|
+
const stopWords = new Set([
|
|
208
|
+
'the',
|
|
209
|
+
'and',
|
|
210
|
+
'for',
|
|
211
|
+
'are',
|
|
212
|
+
'but',
|
|
213
|
+
'not',
|
|
214
|
+
'you',
|
|
215
|
+
'all',
|
|
216
|
+
'can',
|
|
217
|
+
'had',
|
|
218
|
+
'her',
|
|
219
|
+
'was',
|
|
220
|
+
'one',
|
|
221
|
+
'our',
|
|
222
|
+
'out',
|
|
223
|
+
'use',
|
|
224
|
+
'with',
|
|
225
|
+
'this',
|
|
226
|
+
'that',
|
|
227
|
+
'from',
|
|
228
|
+
'have',
|
|
229
|
+
'been',
|
|
230
|
+
]);
|
|
231
|
+
return [...new Set(words.filter((w) => !stopWords.has(w)))];
|
|
232
|
+
}
|
|
233
|
+
normalizePattern(context) {
|
|
234
|
+
// Create a normalized representation for comparison
|
|
235
|
+
return `${context.original}→${context.corrected}`.toLowerCase().replace(/\s+/g, ' ').trim();
|
|
236
|
+
}
|
|
237
|
+
updateClusters(correction) {
|
|
238
|
+
// Find the best matching cluster
|
|
239
|
+
let bestCluster = null;
|
|
240
|
+
let bestSimilarity = 0;
|
|
241
|
+
for (const cluster of this.clusters.values()) {
|
|
242
|
+
const sim = jaccardSimilarity(correction.normalizedPattern, cluster.representative.normalizedPattern);
|
|
243
|
+
if (sim >= this.config.clusteringSimilarity && sim > bestSimilarity) {
|
|
244
|
+
bestCluster = cluster;
|
|
245
|
+
bestSimilarity = sim;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
if (bestCluster) {
|
|
249
|
+
// Add to existing cluster
|
|
250
|
+
bestCluster.corrections.push(correction);
|
|
251
|
+
bestCluster.count = bestCluster.corrections.length;
|
|
252
|
+
bestCluster.lastSeen = correction.timestamp;
|
|
253
|
+
bestCluster.similarity = this.calculateClusterSimilarity(bestCluster);
|
|
254
|
+
bestCluster.meetsThreshold = bestCluster.count >= this.config.automationThreshold;
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
// Create new cluster
|
|
258
|
+
const clusterId = `cluster-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
|
|
259
|
+
this.clusters.set(clusterId, {
|
|
260
|
+
id: clusterId,
|
|
261
|
+
representative: correction,
|
|
262
|
+
corrections: [correction],
|
|
263
|
+
count: 1,
|
|
264
|
+
similarity: 1.0,
|
|
265
|
+
firstSeen: correction.timestamp,
|
|
266
|
+
lastSeen: correction.timestamp,
|
|
267
|
+
meetsThreshold: 1 >= this.config.automationThreshold,
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
calculateClusterSimilarity(cluster) {
|
|
272
|
+
if (cluster.corrections.length <= 1)
|
|
273
|
+
return 1.0;
|
|
274
|
+
const rep = cluster.representative.normalizedPattern;
|
|
275
|
+
let total = 0;
|
|
276
|
+
for (const c of cluster.corrections) {
|
|
277
|
+
if (c.id !== cluster.representative.id) {
|
|
278
|
+
total += jaccardSimilarity(rep, c.normalizedPattern);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return total / (cluster.corrections.length - 1);
|
|
282
|
+
}
|
|
283
|
+
enforceRetention() {
|
|
284
|
+
// Enforce max corrections limit
|
|
285
|
+
if (this.corrections.size > this.config.maxCorrections) {
|
|
286
|
+
const sorted = Array.from(this.corrections.entries()).sort((a, b) => a[1].timestamp.getTime() - b[1].timestamp.getTime());
|
|
287
|
+
const toRemove = sorted.slice(0, sorted.length - this.config.maxCorrections);
|
|
288
|
+
for (const [id] of toRemove) {
|
|
289
|
+
this.corrections.delete(id);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
// Enforce retention days
|
|
293
|
+
const cutoff = new Date();
|
|
294
|
+
cutoff.setDate(cutoff.getDate() - this.config.retentionDays);
|
|
295
|
+
for (const [id, correction] of this.corrections) {
|
|
296
|
+
if (correction.timestamp < cutoff) {
|
|
297
|
+
this.corrections.delete(id);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
// Clean up empty clusters
|
|
301
|
+
for (const [id, cluster] of this.clusters) {
|
|
302
|
+
cluster.corrections = cluster.corrections.filter((c) => this.corrections.has(c.id));
|
|
303
|
+
if (cluster.corrections.length === 0) {
|
|
304
|
+
this.clusters.delete(id);
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
cluster.count = cluster.corrections.length;
|
|
308
|
+
cluster.meetsThreshold = cluster.count >= this.config.automationThreshold;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
// =============================================================================
|
|
314
|
+
// Singleton Instance
|
|
315
|
+
// =============================================================================
|
|
316
|
+
/** Global correction tracker */
|
|
317
|
+
export const correctionTracker = new CorrectionTracker();
|
|
318
|
+
// =============================================================================
|
|
319
|
+
// Helper Functions
|
|
320
|
+
// =============================================================================
|
|
321
|
+
/**
|
|
322
|
+
* Track a correction using the global tracker
|
|
323
|
+
*/
|
|
324
|
+
export function trackCorrection(context, type) {
|
|
325
|
+
return correctionTracker.track(context, type);
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Get promotable clusters from global tracker
|
|
329
|
+
*/
|
|
330
|
+
export function getPromotableClusters() {
|
|
331
|
+
return correctionTracker.getPromotableClusters();
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Check if user text contains a correction
|
|
335
|
+
*/
|
|
336
|
+
export function detectCorrection(userText) {
|
|
337
|
+
return correctionTracker.parseCorrection(userText);
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Format correction for display
|
|
341
|
+
*/
|
|
342
|
+
export function formatCorrection(correction) {
|
|
343
|
+
const lines = [];
|
|
344
|
+
lines.push(`**Correction** (${correction.type})`);
|
|
345
|
+
lines.push(`- Original: ${correction.context.original}`);
|
|
346
|
+
lines.push(`- Corrected: ${correction.context.corrected}`);
|
|
347
|
+
if (correction.context.filePath) {
|
|
348
|
+
lines.push(`- File: ${correction.context.filePath}`);
|
|
349
|
+
}
|
|
350
|
+
lines.push(`- Keywords: ${correction.keywords.join(', ')}`);
|
|
351
|
+
return lines.join('\n');
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Format cluster for display
|
|
355
|
+
*/
|
|
356
|
+
export function formatCluster(cluster) {
|
|
357
|
+
const lines = [];
|
|
358
|
+
const threshold = cluster.meetsThreshold ? '✅' : '⏳';
|
|
359
|
+
lines.push(`${threshold} **Cluster** (${cluster.count} occurrences)`);
|
|
360
|
+
lines.push(`- Pattern: "${cluster.representative.context.original}" → "${cluster.representative.context.corrected}"`);
|
|
361
|
+
lines.push(`- First seen: ${cluster.firstSeen.toISOString()}`);
|
|
362
|
+
lines.push(`- Last seen: ${cluster.lastSeen.toISOString()}`);
|
|
363
|
+
lines.push(`- Similarity: ${(cluster.similarity * 100).toFixed(1)}%`);
|
|
364
|
+
return lines.join('\n');
|
|
365
|
+
}
|
|
366
|
+
//# sourceMappingURL=correction-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"correction-tracker.js","sourceRoot":"","sources":["../../../src/core/agents/correction-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Graph - v17.5.0
|
|
3
|
+
*
|
|
4
|
+
* Tracks dependencies between tasks and agents for gap detection.
|
|
5
|
+
* Enables identification of:
|
|
6
|
+
* - Prerequisites that must complete before a task starts
|
|
7
|
+
* - Orphaned dependencies (missing or failed prerequisites)
|
|
8
|
+
* - Circular dependencies
|
|
9
|
+
* - Dependency chains and critical paths
|
|
10
|
+
*
|
|
11
|
+
* @module dependency-graph
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* A node in the dependency graph
|
|
15
|
+
*/
|
|
16
|
+
export interface DependencyNode {
|
|
17
|
+
/** Unique identifier for the node */
|
|
18
|
+
id: string;
|
|
19
|
+
/** Display name */
|
|
20
|
+
name: string;
|
|
21
|
+
/** Node type */
|
|
22
|
+
type: 'task' | 'agent' | 'resource' | 'output';
|
|
23
|
+
/** Current status */
|
|
24
|
+
status: 'pending' | 'in_progress' | 'completed' | 'failed' | 'blocked';
|
|
25
|
+
/** IDs of nodes this node depends on */
|
|
26
|
+
dependencies: string[];
|
|
27
|
+
/** IDs of nodes that depend on this node */
|
|
28
|
+
dependents: string[];
|
|
29
|
+
/** Metadata about the node */
|
|
30
|
+
metadata: Record<string, unknown>;
|
|
31
|
+
/** Timestamp when status last changed */
|
|
32
|
+
lastUpdated: Date;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* An edge in the dependency graph
|
|
36
|
+
*/
|
|
37
|
+
export interface DependencyEdge {
|
|
38
|
+
/** Source node ID (the dependency) */
|
|
39
|
+
from: string;
|
|
40
|
+
/** Target node ID (the dependent) */
|
|
41
|
+
to: string;
|
|
42
|
+
/** Type of dependency */
|
|
43
|
+
type: 'requires' | 'produces' | 'blocks' | 'optional';
|
|
44
|
+
/** Whether this edge represents a satisfied dependency */
|
|
45
|
+
satisfied: boolean;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Result of dependency analysis
|
|
49
|
+
*/
|
|
50
|
+
export interface DependencyAnalysis {
|
|
51
|
+
/** All nodes in the graph */
|
|
52
|
+
nodes: DependencyNode[];
|
|
53
|
+
/** All edges in the graph */
|
|
54
|
+
edges: DependencyEdge[];
|
|
55
|
+
/** Nodes with missing dependencies */
|
|
56
|
+
orphanedNodes: string[];
|
|
57
|
+
/** Detected circular dependency chains */
|
|
58
|
+
circularDependencies: string[][];
|
|
59
|
+
/** Nodes that are blocking progress */
|
|
60
|
+
blockingNodes: string[];
|
|
61
|
+
/** Nodes ready to execute (all deps satisfied) */
|
|
62
|
+
readyNodes: string[];
|
|
63
|
+
/** Critical path (longest dependency chain) */
|
|
64
|
+
criticalPath: string[];
|
|
65
|
+
/** Overall completion percentage */
|
|
66
|
+
completionPercent: number;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Gap between expected and actual outputs
|
|
70
|
+
*/
|
|
71
|
+
export interface DependencyGap {
|
|
72
|
+
/** Node with the gap */
|
|
73
|
+
nodeId: string;
|
|
74
|
+
/** Type of gap */
|
|
75
|
+
type: 'missing_dependency' | 'failed_dependency' | 'orphaned' | 'circular' | 'stalled';
|
|
76
|
+
/** Description of the gap */
|
|
77
|
+
description: string;
|
|
78
|
+
/** Suggested resolution */
|
|
79
|
+
resolution: string;
|
|
80
|
+
/** Severity */
|
|
81
|
+
severity: 'critical' | 'high' | 'medium' | 'low';
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Dependency graph for tracking task relationships
|
|
85
|
+
*/
|
|
86
|
+
export declare class DependencyGraph {
|
|
87
|
+
private nodes;
|
|
88
|
+
private edges;
|
|
89
|
+
/**
|
|
90
|
+
* Add a node to the graph
|
|
91
|
+
*/
|
|
92
|
+
addNode(node: Omit<DependencyNode, 'dependents' | 'lastUpdated'>): void;
|
|
93
|
+
/**
|
|
94
|
+
* Add an edge to the graph
|
|
95
|
+
*/
|
|
96
|
+
addEdge(from: string, to: string, type?: DependencyEdge['type']): void;
|
|
97
|
+
/**
|
|
98
|
+
* Update node status
|
|
99
|
+
*/
|
|
100
|
+
updateStatus(nodeId: string, status: DependencyNode['status']): void;
|
|
101
|
+
/**
|
|
102
|
+
* Get a node by ID
|
|
103
|
+
*/
|
|
104
|
+
getNode(nodeId: string): DependencyNode | undefined;
|
|
105
|
+
/**
|
|
106
|
+
* Get all nodes
|
|
107
|
+
*/
|
|
108
|
+
getAllNodes(): DependencyNode[];
|
|
109
|
+
/**
|
|
110
|
+
* Get all edges
|
|
111
|
+
*/
|
|
112
|
+
getAllEdges(): DependencyEdge[];
|
|
113
|
+
/**
|
|
114
|
+
* Get dependencies of a node
|
|
115
|
+
*/
|
|
116
|
+
getDependencies(nodeId: string): DependencyNode[];
|
|
117
|
+
/**
|
|
118
|
+
* Get dependents of a node
|
|
119
|
+
*/
|
|
120
|
+
getDependents(nodeId: string): DependencyNode[];
|
|
121
|
+
/**
|
|
122
|
+
* Check if all dependencies of a node are satisfied
|
|
123
|
+
*/
|
|
124
|
+
areDependenciesSatisfied(nodeId: string): boolean;
|
|
125
|
+
/**
|
|
126
|
+
* Get nodes ready for execution
|
|
127
|
+
*/
|
|
128
|
+
getReadyNodes(): DependencyNode[];
|
|
129
|
+
/**
|
|
130
|
+
* Get nodes that are blocked
|
|
131
|
+
*/
|
|
132
|
+
getBlockedNodes(): DependencyNode[];
|
|
133
|
+
/**
|
|
134
|
+
* Detect circular dependencies using DFS
|
|
135
|
+
*/
|
|
136
|
+
detectCircularDependencies(): string[][];
|
|
137
|
+
/**
|
|
138
|
+
* Find orphaned nodes (nodes with missing dependencies)
|
|
139
|
+
*/
|
|
140
|
+
findOrphanedNodes(): string[];
|
|
141
|
+
/**
|
|
142
|
+
* Find the critical path (longest dependency chain)
|
|
143
|
+
*/
|
|
144
|
+
findCriticalPath(): string[];
|
|
145
|
+
/**
|
|
146
|
+
* Calculate completion percentage
|
|
147
|
+
*/
|
|
148
|
+
calculateCompletionPercent(): number;
|
|
149
|
+
/**
|
|
150
|
+
* Analyze the dependency graph
|
|
151
|
+
*/
|
|
152
|
+
analyze(): DependencyAnalysis;
|
|
153
|
+
/**
|
|
154
|
+
* Identify gaps in the dependency graph
|
|
155
|
+
*/
|
|
156
|
+
identifyGaps(): DependencyGap[];
|
|
157
|
+
/**
|
|
158
|
+
* Clear the graph
|
|
159
|
+
*/
|
|
160
|
+
clear(): void;
|
|
161
|
+
/**
|
|
162
|
+
* Serialize to JSON
|
|
163
|
+
*/
|
|
164
|
+
toJSON(): {
|
|
165
|
+
nodes: DependencyNode[];
|
|
166
|
+
edges: DependencyEdge[];
|
|
167
|
+
};
|
|
168
|
+
/**
|
|
169
|
+
* Load from JSON
|
|
170
|
+
*/
|
|
171
|
+
static fromJSON(data: {
|
|
172
|
+
nodes: DependencyNode[];
|
|
173
|
+
edges: DependencyEdge[];
|
|
174
|
+
}): DependencyGraph;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Create a dependency graph from tasks
|
|
178
|
+
*/
|
|
179
|
+
export declare function createGraphFromTasks(tasks: Array<{
|
|
180
|
+
id: string;
|
|
181
|
+
title: string;
|
|
182
|
+
status: string;
|
|
183
|
+
dependencies: string[];
|
|
184
|
+
}>): DependencyGraph;
|
|
185
|
+
/**
|
|
186
|
+
* Format dependency analysis for display
|
|
187
|
+
*/
|
|
188
|
+
export declare function formatDependencyAnalysis(analysis: DependencyAnalysis): string;
|
|
189
|
+
/**
|
|
190
|
+
* Format gaps for display
|
|
191
|
+
*/
|
|
192
|
+
export declare function formatDependencyGaps(gaps: DependencyGap[]): string;
|
|
193
|
+
//# sourceMappingURL=dependency-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-graph.d.ts","sourceRoot":"","sources":["../../../src/core/agents/dependency-graph.ts"],"names":[],"mappings":"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"}
|