dino-spec 17.4.3 → 17.6.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/README.md +16 -1
- 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/ambiguity-resolver.d.ts +14 -1
- package/dist/core/agents/ambiguity-resolver.d.ts.map +1 -1
- package/dist/core/agents/ambiguity-resolver.js +24 -2
- package/dist/core/agents/ambiguity-resolver.js.map +1 -1
- 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 +133 -4
- package/dist/core/agents/confidence-gate.d.ts.map +1 -1
- package/dist/core/agents/confidence-gate.js +376 -9
- 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/auto-injection-engine.d.ts +7 -1
- package/dist/core/context/auto-injection-engine.d.ts.map +1 -1
- package/dist/core/context/auto-injection-engine.js +46 -1
- package/dist/core/context/auto-injection-engine.js.map +1 -1
- 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/ralph/__tests__/prd-generator-session-context.test.d.ts +7 -0
- package/dist/core/ralph/__tests__/prd-generator-session-context.test.d.ts.map +1 -0
- package/dist/core/ralph/__tests__/prd-generator-session-context.test.js +143 -0
- package/dist/core/ralph/__tests__/prd-generator-session-context.test.js.map +1 -0
- package/dist/core/ralph/index.d.ts +3 -3
- package/dist/core/ralph/index.d.ts.map +1 -1
- package/dist/core/ralph/index.js +2 -2
- package/dist/core/ralph/index.js.map +1 -1
- package/dist/core/ralph/prd-generator.d.ts +18 -3
- package/dist/core/ralph/prd-generator.d.ts.map +1 -1
- package/dist/core/ralph/prd-generator.js +33 -11
- package/dist/core/ralph/prd-generator.js.map +1 -1
- package/dist/core/ralph/progress-tracker.d.ts.map +1 -1
- package/dist/core/ralph/progress-tracker.js +2 -1
- package/dist/core/ralph/progress-tracker.js.map +1 -1
- package/dist/core/ralph/sub-agent-spawner.d.ts +4 -2
- package/dist/core/ralph/sub-agent-spawner.d.ts.map +1 -1
- package/dist/core/ralph/sub-agent-spawner.js +48 -3
- package/dist/core/ralph/sub-agent-spawner.js.map +1 -1
- package/dist/core/ralph/task-integration.d.ts.map +1 -1
- package/dist/core/ralph/task-integration.js +6 -3
- package/dist/core/ralph/task-integration.js.map +1 -1
- package/dist/core/ralph/types.d.ts +62 -3
- package/dist/core/ralph/types.d.ts.map +1 -1
- package/dist/core/ralph/types.js.map +1 -1
- package/dist/core/recommendations/recommendation-engine.d.ts +6 -0
- package/dist/core/recommendations/recommendation-engine.d.ts.map +1 -1
- package/dist/core/recommendations/recommendation-engine.js.map +1 -1
- 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 +22 -2
- package/dist/core/spec-analyzer/index.d.ts.map +1 -1
- package/dist/core/spec-analyzer/index.js +21 -3
- 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/auto-inject.d.ts +4 -0
- package/dist/mcp/tools/auto-inject.d.ts.map +1 -1
- package/dist/mcp/tools/auto-inject.js +13 -4
- package/dist/mcp/tools/auto-inject.js.map +1 -1
- package/dist/mcp/tools/chunking.d.ts +3 -0
- package/dist/mcp/tools/chunking.d.ts.map +1 -1
- package/dist/mcp/tools/chunking.js +10 -4
- package/dist/mcp/tools/chunking.js.map +1 -1
- package/dist/mcp/tools/embeddings.d.ts +4 -0
- package/dist/mcp/tools/embeddings.d.ts.map +1 -1
- package/dist/mcp/tools/embeddings.js +16 -6
- package/dist/mcp/tools/embeddings.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/knowledge-graph.d.ts +3 -0
- package/dist/mcp/tools/knowledge-graph.d.ts.map +1 -1
- package/dist/mcp/tools/knowledge-graph.js +19 -8
- package/dist/mcp/tools/knowledge-graph.js.map +1 -1
- package/dist/mcp/tools/lazy-context.d.ts +2 -0
- package/dist/mcp/tools/lazy-context.d.ts.map +1 -1
- package/dist/mcp/tools/lazy-context.js +10 -4
- package/dist/mcp/tools/lazy-context.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/dist/mcp/tools/memory-decay.d.ts.map +1 -1
- package/dist/mcp/tools/memory-decay.js +4 -2
- package/dist/mcp/tools/memory-decay.js.map +1 -1
- package/dist/mcp/tools/prefetch.d.ts +4 -1
- package/dist/mcp/tools/prefetch.d.ts.map +1 -1
- package/dist/mcp/tools/prefetch.js +18 -7
- package/dist/mcp/tools/prefetch.js.map +1 -1
- package/dist/mcp/tools/ralph.d.ts +2 -0
- package/dist/mcp/tools/ralph.d.ts.map +1 -1
- package/dist/mcp/tools/ralph.js +96 -6
- package/dist/mcp/tools/ralph.js.map +1 -1
- package/dist/mcp/tools/recommendations.d.ts +2 -0
- package/dist/mcp/tools/recommendations.d.ts.map +1 -1
- package/dist/mcp/tools/recommendations.js +13 -4
- package/dist/mcp/tools/recommendations.js.map +1 -1
- package/dist/mcp/tools/retrieval.d.ts +4 -0
- package/dist/mcp/tools/retrieval.d.ts.map +1 -1
- package/dist/mcp/tools/retrieval.js +25 -10
- package/dist/mcp/tools/retrieval.js.map +1 -1
- package/dist/mcp/tools/spec-feedback.d.ts +2 -0
- package/dist/mcp/tools/spec-feedback.d.ts.map +1 -1
- package/dist/mcp/tools/spec-feedback.js +33 -16
- package/dist/mcp/tools/spec-feedback.js.map +1 -1
- package/dist/mcp/utils/index.d.ts +1 -0
- package/dist/mcp/utils/index.d.ts.map +1 -1
- package/dist/mcp/utils/index.js +2 -0
- package/dist/mcp/utils/index.js.map +1 -1
- package/dist/mcp/utils/session-context.d.ts +108 -0
- package/dist/mcp/utils/session-context.d.ts.map +1 -0
- package/dist/mcp/utils/session-context.js +157 -0
- package/dist/mcp/utils/session-context.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,197 @@
|
|
|
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
|
+
/**
|
|
16
|
+
* Type of correction detected
|
|
17
|
+
*/
|
|
18
|
+
export type CorrectionType = 'explicit' | 'implicit' | 'preference' | 'style';
|
|
19
|
+
/**
|
|
20
|
+
* Context when correction occurred
|
|
21
|
+
*/
|
|
22
|
+
export interface CorrectionContext {
|
|
23
|
+
/** What Claude originally suggested/wrote */
|
|
24
|
+
original: string;
|
|
25
|
+
/** What the user corrected it to */
|
|
26
|
+
corrected: string;
|
|
27
|
+
/** File path if applicable */
|
|
28
|
+
filePath?: string;
|
|
29
|
+
/** Line number if applicable */
|
|
30
|
+
lineNumber?: number;
|
|
31
|
+
/** Focus area at time of correction */
|
|
32
|
+
focusArea?: string;
|
|
33
|
+
/** Phase when correction occurred */
|
|
34
|
+
phase?: string;
|
|
35
|
+
/** Relevant code/content surrounding the correction */
|
|
36
|
+
surroundingContext?: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* A tracked correction entry
|
|
40
|
+
*/
|
|
41
|
+
export interface Correction {
|
|
42
|
+
id: string;
|
|
43
|
+
type: CorrectionType;
|
|
44
|
+
context: CorrectionContext;
|
|
45
|
+
timestamp: Date;
|
|
46
|
+
/** Keywords extracted for pattern matching */
|
|
47
|
+
keywords: string[];
|
|
48
|
+
/** Normalized form for comparison */
|
|
49
|
+
normalizedPattern: string;
|
|
50
|
+
/** Whether this has been promoted to a learned pattern */
|
|
51
|
+
promoted: boolean;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Correction cluster (similar corrections grouped)
|
|
55
|
+
*/
|
|
56
|
+
export interface CorrectionCluster {
|
|
57
|
+
id: string;
|
|
58
|
+
/** Representative correction from the cluster */
|
|
59
|
+
representative: Correction;
|
|
60
|
+
/** All corrections in this cluster */
|
|
61
|
+
corrections: Correction[];
|
|
62
|
+
/** Number of occurrences */
|
|
63
|
+
count: number;
|
|
64
|
+
/** Average similarity within cluster */
|
|
65
|
+
similarity: number;
|
|
66
|
+
/** When first correction occurred */
|
|
67
|
+
firstSeen: Date;
|
|
68
|
+
/** When last correction occurred */
|
|
69
|
+
lastSeen: Date;
|
|
70
|
+
/** Whether this cluster meets automation threshold */
|
|
71
|
+
meetsThreshold: boolean;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Configuration for correction tracking
|
|
75
|
+
*/
|
|
76
|
+
export interface CorrectionTrackerConfig {
|
|
77
|
+
/** Minimum occurrences for automation (default: 3) */
|
|
78
|
+
automationThreshold: number;
|
|
79
|
+
/** Similarity threshold for clustering (default: 0.7) */
|
|
80
|
+
clusteringSimilarity: number;
|
|
81
|
+
/** Maximum corrections to keep (default: 500) */
|
|
82
|
+
maxCorrections: number;
|
|
83
|
+
/** Days to keep corrections (default: 90) */
|
|
84
|
+
retentionDays: number;
|
|
85
|
+
}
|
|
86
|
+
export declare const DEFAULT_TRACKER_CONFIG: CorrectionTrackerConfig;
|
|
87
|
+
/**
|
|
88
|
+
* Tracks and clusters user corrections for pattern learning
|
|
89
|
+
*/
|
|
90
|
+
export declare class CorrectionTracker {
|
|
91
|
+
private corrections;
|
|
92
|
+
private clusters;
|
|
93
|
+
private config;
|
|
94
|
+
constructor(config?: Partial<CorrectionTrackerConfig>);
|
|
95
|
+
/**
|
|
96
|
+
* Track a new correction
|
|
97
|
+
*/
|
|
98
|
+
track(context: CorrectionContext, type?: CorrectionType): Correction;
|
|
99
|
+
/**
|
|
100
|
+
* Parse user text for explicit corrections
|
|
101
|
+
*/
|
|
102
|
+
parseCorrection(userText: string): {
|
|
103
|
+
detected: boolean;
|
|
104
|
+
pattern?: string;
|
|
105
|
+
replacement?: string;
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* Get all corrections
|
|
109
|
+
*/
|
|
110
|
+
getCorrections(): Correction[];
|
|
111
|
+
/**
|
|
112
|
+
* Get correction by ID
|
|
113
|
+
*/
|
|
114
|
+
getCorrection(id: string): Correction | undefined;
|
|
115
|
+
/**
|
|
116
|
+
* Get clusters that meet automation threshold
|
|
117
|
+
*/
|
|
118
|
+
getPromotableClusters(): CorrectionCluster[];
|
|
119
|
+
/**
|
|
120
|
+
* Get all clusters
|
|
121
|
+
*/
|
|
122
|
+
getClusters(): CorrectionCluster[];
|
|
123
|
+
/**
|
|
124
|
+
* Get cluster by ID
|
|
125
|
+
*/
|
|
126
|
+
getCluster(id: string): CorrectionCluster | undefined;
|
|
127
|
+
/**
|
|
128
|
+
* Find similar corrections to a new one
|
|
129
|
+
*/
|
|
130
|
+
findSimilar(context: CorrectionContext, minSimilarity?: number): Correction[];
|
|
131
|
+
/**
|
|
132
|
+
* Mark a cluster as promoted (pattern learned)
|
|
133
|
+
*/
|
|
134
|
+
markPromoted(clusterId: string): boolean;
|
|
135
|
+
/**
|
|
136
|
+
* Get statistics
|
|
137
|
+
*/
|
|
138
|
+
getStats(): {
|
|
139
|
+
totalCorrections: number;
|
|
140
|
+
totalClusters: number;
|
|
141
|
+
promotableClusters: number;
|
|
142
|
+
byType: Record<CorrectionType, number>;
|
|
143
|
+
oldestCorrection: Date | null;
|
|
144
|
+
newestCorrection: Date | null;
|
|
145
|
+
};
|
|
146
|
+
/**
|
|
147
|
+
* Clear all corrections
|
|
148
|
+
*/
|
|
149
|
+
clear(): void;
|
|
150
|
+
/**
|
|
151
|
+
* Export state for persistence
|
|
152
|
+
*/
|
|
153
|
+
export(): {
|
|
154
|
+
corrections: Correction[];
|
|
155
|
+
clusters: CorrectionCluster[];
|
|
156
|
+
};
|
|
157
|
+
/**
|
|
158
|
+
* Import state from persistence
|
|
159
|
+
*/
|
|
160
|
+
import(state: {
|
|
161
|
+
corrections: Correction[];
|
|
162
|
+
clusters: CorrectionCluster[];
|
|
163
|
+
}): void;
|
|
164
|
+
private generateId;
|
|
165
|
+
private extractKeywords;
|
|
166
|
+
private normalizePattern;
|
|
167
|
+
private updateClusters;
|
|
168
|
+
private calculateClusterSimilarity;
|
|
169
|
+
private enforceRetention;
|
|
170
|
+
}
|
|
171
|
+
/** Global correction tracker */
|
|
172
|
+
export declare const correctionTracker: CorrectionTracker;
|
|
173
|
+
/**
|
|
174
|
+
* Track a correction using the global tracker
|
|
175
|
+
*/
|
|
176
|
+
export declare function trackCorrection(context: CorrectionContext, type?: CorrectionType): Correction;
|
|
177
|
+
/**
|
|
178
|
+
* Get promotable clusters from global tracker
|
|
179
|
+
*/
|
|
180
|
+
export declare function getPromotableClusters(): CorrectionCluster[];
|
|
181
|
+
/**
|
|
182
|
+
* Check if user text contains a correction
|
|
183
|
+
*/
|
|
184
|
+
export declare function detectCorrection(userText: string): {
|
|
185
|
+
detected: boolean;
|
|
186
|
+
pattern?: string;
|
|
187
|
+
replacement?: string;
|
|
188
|
+
};
|
|
189
|
+
/**
|
|
190
|
+
* Format correction for display
|
|
191
|
+
*/
|
|
192
|
+
export declare function formatCorrection(correction: Correction): string;
|
|
193
|
+
/**
|
|
194
|
+
* Format cluster for display
|
|
195
|
+
*/
|
|
196
|
+
export declare function formatCluster(cluster: CorrectionCluster): string;
|
|
197
|
+
//# sourceMappingURL=correction-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"correction-tracker.d.ts","sourceRoot":"","sources":["../../../src/core/agents/correction-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -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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"}
|