@rangerchaz/aimem 0.1.5 → 0.2.1

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 (202) hide show
  1. package/README.md +588 -432
  2. package/dist/cli/commands/git.d.ts +0 -0
  3. package/dist/cli/commands/git.d.ts.map +0 -0
  4. package/dist/cli/commands/git.js +0 -0
  5. package/dist/cli/commands/git.js.map +0 -0
  6. package/dist/cli/commands/guardrails.d.ts +3 -0
  7. package/dist/cli/commands/guardrails.d.ts.map +1 -0
  8. package/dist/cli/commands/guardrails.js +429 -0
  9. package/dist/cli/commands/guardrails.js.map +1 -0
  10. package/dist/cli/commands/import.d.ts +0 -0
  11. package/dist/cli/commands/import.d.ts.map +0 -0
  12. package/dist/cli/commands/import.js +0 -0
  13. package/dist/cli/commands/import.js.map +0 -0
  14. package/dist/cli/commands/init.d.ts +0 -0
  15. package/dist/cli/commands/init.d.ts.map +0 -0
  16. package/dist/cli/commands/init.js +0 -0
  17. package/dist/cli/commands/init.js.map +0 -0
  18. package/dist/cli/commands/mcp-serve.d.ts +0 -0
  19. package/dist/cli/commands/mcp-serve.d.ts.map +0 -0
  20. package/dist/cli/commands/mcp-serve.js +0 -0
  21. package/dist/cli/commands/mcp-serve.js.map +0 -0
  22. package/dist/cli/commands/query.d.ts +0 -0
  23. package/dist/cli/commands/query.d.ts.map +0 -0
  24. package/dist/cli/commands/query.js +0 -0
  25. package/dist/cli/commands/query.js.map +0 -0
  26. package/dist/cli/commands/reindex.d.ts +7 -0
  27. package/dist/cli/commands/reindex.d.ts.map +1 -0
  28. package/dist/cli/commands/reindex.js +117 -0
  29. package/dist/cli/commands/reindex.js.map +1 -0
  30. package/dist/cli/commands/setup.d.ts +0 -0
  31. package/dist/cli/commands/setup.d.ts.map +0 -0
  32. package/dist/cli/commands/setup.js +0 -0
  33. package/dist/cli/commands/setup.js.map +0 -0
  34. package/dist/cli/commands/start.d.ts +0 -0
  35. package/dist/cli/commands/start.d.ts.map +0 -0
  36. package/dist/cli/commands/start.js +0 -0
  37. package/dist/cli/commands/start.js.map +0 -0
  38. package/dist/cli/commands/status.d.ts +0 -0
  39. package/dist/cli/commands/status.d.ts.map +0 -0
  40. package/dist/cli/commands/status.js +0 -0
  41. package/dist/cli/commands/status.js.map +0 -0
  42. package/dist/cli/commands/stop.d.ts +0 -0
  43. package/dist/cli/commands/stop.d.ts.map +0 -0
  44. package/dist/cli/commands/stop.js +0 -0
  45. package/dist/cli/commands/stop.js.map +0 -0
  46. package/dist/cli/commands/visualize.d.ts +0 -0
  47. package/dist/cli/commands/visualize.d.ts.map +0 -0
  48. package/dist/cli/commands/visualize.js +0 -0
  49. package/dist/cli/commands/visualize.js.map +0 -0
  50. package/dist/cli/index.d.ts +0 -0
  51. package/dist/cli/index.d.ts.map +0 -0
  52. package/dist/cli/index.js +15 -0
  53. package/dist/cli/index.js.map +1 -1
  54. package/dist/db/index.d.ts +45 -1
  55. package/dist/db/index.d.ts.map +1 -1
  56. package/dist/db/index.js +489 -169
  57. package/dist/db/index.js.map +1 -1
  58. package/dist/db/schema.d.ts +1 -0
  59. package/dist/db/schema.d.ts.map +1 -1
  60. package/dist/db/schema.js +251 -188
  61. package/dist/db/schema.js.map +1 -1
  62. package/dist/extractor/index.d.ts +0 -0
  63. package/dist/extractor/index.d.ts.map +0 -0
  64. package/dist/extractor/index.js +0 -0
  65. package/dist/extractor/index.js.map +0 -0
  66. package/dist/git/extractor.d.ts +0 -0
  67. package/dist/git/extractor.d.ts.map +0 -0
  68. package/dist/git/extractor.js +0 -0
  69. package/dist/git/extractor.js.map +0 -0
  70. package/dist/git/hooks.d.ts +0 -0
  71. package/dist/git/hooks.d.ts.map +0 -0
  72. package/dist/git/hooks.js +0 -0
  73. package/dist/git/hooks.js.map +0 -0
  74. package/dist/git/index.d.ts +0 -0
  75. package/dist/git/index.d.ts.map +0 -0
  76. package/dist/git/index.js +0 -0
  77. package/dist/git/index.js.map +0 -0
  78. package/dist/guardrails/analyzer.d.ts +20 -0
  79. package/dist/guardrails/analyzer.d.ts.map +1 -0
  80. package/dist/guardrails/analyzer.js +329 -0
  81. package/dist/guardrails/analyzer.js.map +1 -0
  82. package/dist/guardrails/calculator.d.ts +46 -0
  83. package/dist/guardrails/calculator.d.ts.map +1 -0
  84. package/dist/guardrails/calculator.js +97 -0
  85. package/dist/guardrails/calculator.js.map +1 -0
  86. package/dist/guardrails/enforcer.d.ts +29 -0
  87. package/dist/guardrails/enforcer.d.ts.map +1 -0
  88. package/dist/guardrails/enforcer.js +180 -0
  89. package/dist/guardrails/enforcer.js.map +1 -0
  90. package/dist/guardrails/index.d.ts +14 -0
  91. package/dist/guardrails/index.d.ts.map +1 -0
  92. package/dist/guardrails/index.js +21 -0
  93. package/dist/guardrails/index.js.map +1 -0
  94. package/dist/guardrails/linter-import.d.ts +31 -0
  95. package/dist/guardrails/linter-import.d.ts.map +1 -0
  96. package/dist/guardrails/linter-import.js +547 -0
  97. package/dist/guardrails/linter-import.js.map +1 -0
  98. package/dist/guardrails/responder.d.ts +28 -0
  99. package/dist/guardrails/responder.d.ts.map +1 -0
  100. package/dist/guardrails/responder.js +98 -0
  101. package/dist/guardrails/responder.js.map +1 -0
  102. package/dist/guardrails/vindication-checker.d.ts +24 -0
  103. package/dist/guardrails/vindication-checker.d.ts.map +1 -0
  104. package/dist/guardrails/vindication-checker.js +209 -0
  105. package/dist/guardrails/vindication-checker.js.map +1 -0
  106. package/dist/guardrails/vindication-queue.d.ts +63 -0
  107. package/dist/guardrails/vindication-queue.d.ts.map +1 -0
  108. package/dist/guardrails/vindication-queue.js +98 -0
  109. package/dist/guardrails/vindication-queue.js.map +1 -0
  110. package/dist/indexer/index.d.ts +0 -0
  111. package/dist/indexer/index.d.ts.map +0 -0
  112. package/dist/indexer/index.js +0 -0
  113. package/dist/indexer/index.js.map +0 -0
  114. package/dist/indexer/parsers/base.d.ts +0 -0
  115. package/dist/indexer/parsers/base.d.ts.map +0 -0
  116. package/dist/indexer/parsers/base.js +0 -0
  117. package/dist/indexer/parsers/base.js.map +0 -0
  118. package/dist/indexer/parsers/cpp.d.ts +0 -0
  119. package/dist/indexer/parsers/cpp.d.ts.map +0 -0
  120. package/dist/indexer/parsers/cpp.js +0 -0
  121. package/dist/indexer/parsers/cpp.js.map +0 -0
  122. package/dist/indexer/parsers/go.d.ts +0 -0
  123. package/dist/indexer/parsers/go.d.ts.map +0 -0
  124. package/dist/indexer/parsers/go.js +0 -0
  125. package/dist/indexer/parsers/go.js.map +0 -0
  126. package/dist/indexer/parsers/java.d.ts +0 -0
  127. package/dist/indexer/parsers/java.d.ts.map +0 -0
  128. package/dist/indexer/parsers/java.js +0 -0
  129. package/dist/indexer/parsers/java.js.map +0 -0
  130. package/dist/indexer/parsers/javascript.d.ts +0 -0
  131. package/dist/indexer/parsers/javascript.d.ts.map +0 -0
  132. package/dist/indexer/parsers/javascript.js +0 -0
  133. package/dist/indexer/parsers/javascript.js.map +0 -0
  134. package/dist/indexer/parsers/kotlin.d.ts +0 -0
  135. package/dist/indexer/parsers/kotlin.d.ts.map +0 -0
  136. package/dist/indexer/parsers/kotlin.js +0 -0
  137. package/dist/indexer/parsers/kotlin.js.map +0 -0
  138. package/dist/indexer/parsers/php.d.ts +0 -0
  139. package/dist/indexer/parsers/php.d.ts.map +0 -0
  140. package/dist/indexer/parsers/php.js +0 -0
  141. package/dist/indexer/parsers/php.js.map +0 -0
  142. package/dist/indexer/parsers/python.d.ts +0 -0
  143. package/dist/indexer/parsers/python.d.ts.map +0 -0
  144. package/dist/indexer/parsers/python.js +0 -0
  145. package/dist/indexer/parsers/python.js.map +0 -0
  146. package/dist/indexer/parsers/ruby.d.ts +0 -0
  147. package/dist/indexer/parsers/ruby.d.ts.map +0 -0
  148. package/dist/indexer/parsers/ruby.js +0 -0
  149. package/dist/indexer/parsers/ruby.js.map +0 -0
  150. package/dist/indexer/parsers/rust.d.ts +0 -0
  151. package/dist/indexer/parsers/rust.d.ts.map +0 -0
  152. package/dist/indexer/parsers/rust.js +0 -0
  153. package/dist/indexer/parsers/rust.js.map +0 -0
  154. package/dist/indexer/watcher-daemon.d.ts +0 -0
  155. package/dist/indexer/watcher-daemon.d.ts.map +0 -0
  156. package/dist/indexer/watcher-daemon.js +10 -0
  157. package/dist/indexer/watcher-daemon.js.map +1 -1
  158. package/dist/indexer/watcher.d.ts +2 -0
  159. package/dist/indexer/watcher.d.ts.map +1 -1
  160. package/dist/indexer/watcher.js +8 -0
  161. package/dist/indexer/watcher.js.map +1 -1
  162. package/dist/mcp/server.d.ts +0 -0
  163. package/dist/mcp/server.d.ts.map +1 -1
  164. package/dist/mcp/server.js +343 -45
  165. package/dist/mcp/server.js.map +1 -1
  166. package/dist/proxy/interceptor-mockttp.d.ts +0 -0
  167. package/dist/proxy/interceptor-mockttp.d.ts.map +0 -0
  168. package/dist/proxy/interceptor-mockttp.js +0 -0
  169. package/dist/proxy/interceptor-mockttp.js.map +0 -0
  170. package/dist/proxy/proxy-daemon.d.ts +0 -0
  171. package/dist/proxy/proxy-daemon.d.ts.map +0 -0
  172. package/dist/proxy/proxy-daemon.js +0 -0
  173. package/dist/proxy/proxy-daemon.js.map +0 -0
  174. package/dist/query/index.d.ts +0 -0
  175. package/dist/query/index.d.ts.map +0 -0
  176. package/dist/query/index.js +0 -0
  177. package/dist/query/index.js.map +0 -0
  178. package/dist/types/index.d.ts +96 -0
  179. package/dist/types/index.d.ts.map +1 -1
  180. package/dist/types/index.js +0 -0
  181. package/dist/types/index.js.map +0 -0
  182. package/dist/visualize/index.d.ts +0 -0
  183. package/dist/visualize/index.d.ts.map +0 -0
  184. package/dist/visualize/index.js +0 -0
  185. package/dist/visualize/index.js.map +0 -0
  186. package/dist/visualize/server.d.ts +0 -0
  187. package/dist/visualize/server.d.ts.map +0 -0
  188. package/dist/visualize/server.js +0 -0
  189. package/dist/visualize/server.js.map +0 -0
  190. package/dist/visualize/template.d.ts +0 -0
  191. package/dist/visualize/template.d.ts.map +0 -0
  192. package/dist/visualize/template.js +0 -0
  193. package/dist/visualize/template.js.map +0 -0
  194. package/package.json +67 -56
  195. package/dist/cli/commands/hook-session-end.d.ts +0 -7
  196. package/dist/cli/commands/hook-session-end.d.ts.map +0 -1
  197. package/dist/cli/commands/hook-session-end.js +0 -109
  198. package/dist/cli/commands/hook-session-end.js.map +0 -1
  199. package/dist/cli/commands/hook-session-start.d.ts +0 -7
  200. package/dist/cli/commands/hook-session-start.d.ts.map +0 -1
  201. package/dist/cli/commands/hook-session-start.js +0 -116
  202. package/dist/cli/commands/hook-session-start.js.map +0 -1
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Response Generator
3
+ *
4
+ * Generates DIK-adjusted pushback messages.
5
+ * Single personality: Senior dev who's been on the project too long.
6
+ */
7
+ import { getDikTier } from './calculator.js';
8
+ // Templates by DIK tier
9
+ const TEMPLATES = {
10
+ low: [
11
+ "I noticed we usually {pattern}. Is there a reason to do it differently here?",
12
+ "The codebase typically follows {pattern}. Want to match the existing approach?",
13
+ "Just checking - {pattern} seems to be the convention here. Intentional deviation?",
14
+ ],
15
+ medium: [
16
+ "We do {pattern} here. Any particular reason to do it differently?",
17
+ "This breaks our pattern: {pattern}. What's the reasoning?",
18
+ "{pattern} - that's how we do it here. You sure about this?",
19
+ ],
20
+ high: [
21
+ "No. {pattern}. We've been over this.",
22
+ "{pattern}. That's not changing.",
23
+ "I'm not doing that. {pattern}.",
24
+ ],
25
+ };
26
+ // Escalation additions
27
+ const OVERRIDE_ESCALATIONS = [
28
+ "You've overridden this before.",
29
+ "We've had this conversation.",
30
+ "Again?",
31
+ ];
32
+ const VINDICATION_ADDITIONS = [
33
+ "Remember what happened last time you ignored this?",
34
+ "How'd that work out for you last time?",
35
+ "You fixed it last time. Let's not repeat that.",
36
+ ];
37
+ /**
38
+ * Generate a pushback response for a violation.
39
+ */
40
+ export function generateResponse(violation, dikLevel, history = { previousOverrides: 0, wasVindicated: false }) {
41
+ const tier = getDikTier(dikLevel);
42
+ const templates = TEMPLATES[tier];
43
+ // Pick a template (deterministic based on violation id)
44
+ const template = templates[violation.id % templates.length];
45
+ // Format the pattern
46
+ let response = template.replace('{pattern}', violation.rule);
47
+ // Add escalation if they've overridden before
48
+ if (history.previousOverrides > 0 && tier !== 'low') {
49
+ const escalation = OVERRIDE_ESCALATIONS[history.previousOverrides % OVERRIDE_ESCALATIONS.length];
50
+ response += ' ' + escalation;
51
+ }
52
+ // Add vindication reference if applicable
53
+ if (history.wasVindicated && tier !== 'low') {
54
+ const vindication = VINDICATION_ADDITIONS[violation.id % VINDICATION_ADDITIONS.length];
55
+ response += ' ' + vindication;
56
+ }
57
+ return response;
58
+ }
59
+ /**
60
+ * Generate a combined response for multiple violations.
61
+ */
62
+ export function generateCombinedResponse(violations, dikLevel) {
63
+ if (violations.length === 0)
64
+ return '';
65
+ if (violations.length === 1) {
66
+ return generateResponse(violations[0].violation, dikLevel, violations[0].history);
67
+ }
68
+ const tier = getDikTier(dikLevel);
69
+ // For multiple violations, summarize
70
+ const rules = violations.map(v => v.violation.rule);
71
+ if (tier === 'low') {
72
+ return `I noticed a few patterns we might want to follow:\n${rules.map(r => `- ${r}`).join('\n')}\n\nAny reason to deviate?`;
73
+ }
74
+ if (tier === 'medium') {
75
+ return `Hold up. This breaks ${violations.length} patterns:\n${rules.map(r => `- ${r}`).join('\n')}\n\nWhat's the plan here?`;
76
+ }
77
+ // High tier
78
+ const hasVindication = violations.some(v => v.history.wasVindicated);
79
+ let response = `No. Multiple violations:\n${rules.map(r => `- ${r}`).join('\n')}`;
80
+ if (hasVindication) {
81
+ response += '\n\nWe\'ve been here before. It didn\'t end well.';
82
+ }
83
+ return response;
84
+ }
85
+ /**
86
+ * Format severity as a prefix.
87
+ */
88
+ export function formatSeverityPrefix(severity) {
89
+ switch (severity) {
90
+ case 'info':
91
+ return '[Note]';
92
+ case 'warn':
93
+ return '[Warning]';
94
+ case 'block':
95
+ return '[Blocked]';
96
+ }
97
+ }
98
+ //# sourceMappingURL=responder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responder.js","sourceRoot":"","sources":["../../src/guardrails/responder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Vindication Checker
3
+ *
4
+ * Heuristic-based detection of when user's code converges
5
+ * toward an AI suggestion they previously overrode.
6
+ */
7
+ import type { VindicationCandidate, VindicationResult, VindicationCheckResult } from '../types/index.js';
8
+ /**
9
+ * Check a single candidate for vindication using heuristics
10
+ */
11
+ export declare function checkForVindication(candidate: VindicationCandidate, newCode: string): VindicationResult;
12
+ /**
13
+ * Check all pending vindications for a specific file
14
+ */
15
+ export declare function checkFileForVindications(projectId: number, filePath: string): VindicationCheckResult[];
16
+ /**
17
+ * Compute content hash for a code snippet
18
+ */
19
+ export declare function computeContentHash(content: string): string;
20
+ /**
21
+ * Read code from file at specified line range
22
+ */
23
+ export declare function readCodeAtLines(filePath: string, lineStart: number, lineEnd: number): string | null;
24
+ //# sourceMappingURL=vindication-checker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vindication-checker.d.ts","sourceRoot":"","sources":["../../src/guardrails/vindication-checker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAEzG;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,oBAAoB,EAC/B,OAAO,EAAE,MAAM,GACd,iBAAiB,CA8DnB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,sBAAsB,EAAE,CA2C1B;AAoGD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,IAAI,CAcf"}
@@ -0,0 +1,209 @@
1
+ /**
2
+ * Vindication Checker
3
+ *
4
+ * Heuristic-based detection of when user's code converges
5
+ * toward an AI suggestion they previously overrode.
6
+ */
7
+ import { readFileSync, existsSync } from 'fs';
8
+ import { createHash } from 'crypto';
9
+ import { getPendingVindicationsForFile, markVindicationChecked, } from '../db/index.js';
10
+ import { vindicateOverride } from './enforcer.js';
11
+ /**
12
+ * Check a single candidate for vindication using heuristics
13
+ */
14
+ export function checkForVindication(candidate, newCode) {
15
+ // Calculate new hash
16
+ const newHash = createHash('md5').update(newCode).digest('hex');
17
+ // If hash is the same, no change - not vindicated
18
+ if (newHash === candidate.contentHash) {
19
+ return {
20
+ eventId: candidate.eventId,
21
+ vindicated: false,
22
+ confidence: 0,
23
+ reason: 'Code has not changed',
24
+ };
25
+ }
26
+ // Extract keywords from suggestion
27
+ const suggestionKeywords = extractKeywords(candidate.suggestion);
28
+ // Count how many suggestion keywords appear in new code
29
+ const newCodeLower = newCode.toLowerCase();
30
+ let matchedKeywords = 0;
31
+ const matchedWords = [];
32
+ for (const keyword of suggestionKeywords) {
33
+ if (newCodeLower.includes(keyword.toLowerCase())) {
34
+ matchedKeywords++;
35
+ matchedWords.push(keyword);
36
+ }
37
+ }
38
+ // Calculate confidence based on keyword match ratio
39
+ const keywordConfidence = suggestionKeywords.length > 0
40
+ ? matchedKeywords / suggestionKeywords.length
41
+ : 0;
42
+ // Check for pattern reversal (user undid what they did)
43
+ const patternConfidence = checkPatternReversal(candidate.originalCode, newCode, candidate.suggestion);
44
+ // Combined confidence
45
+ const confidence = Math.max(keywordConfidence, patternConfidence);
46
+ // Determine if vindicated
47
+ const vindicated = confidence >= 0.7;
48
+ let reason;
49
+ if (vindicated) {
50
+ reason = `Code now includes: ${matchedWords.slice(0, 3).join(', ')}`;
51
+ }
52
+ else if (confidence >= 0.4) {
53
+ reason = `Partial match (${Math.round(confidence * 100)}%): ${matchedWords.slice(0, 2).join(', ')}`;
54
+ }
55
+ else {
56
+ reason = 'Code changed but does not match suggestion';
57
+ }
58
+ return {
59
+ eventId: candidate.eventId,
60
+ vindicated,
61
+ confidence,
62
+ reason,
63
+ };
64
+ }
65
+ /**
66
+ * Check all pending vindications for a specific file
67
+ */
68
+ export function checkFileForVindications(projectId, filePath) {
69
+ const candidates = getPendingVindicationsForFile(projectId, filePath);
70
+ const results = [];
71
+ if (candidates.length === 0) {
72
+ return results;
73
+ }
74
+ // Read current file content
75
+ if (!existsSync(filePath)) {
76
+ return results;
77
+ }
78
+ const fileContent = readFileSync(filePath, 'utf-8');
79
+ const lines = fileContent.split('\n');
80
+ for (const candidate of candidates) {
81
+ // Extract relevant lines
82
+ const startLine = Math.max(0, (candidate.lineStart || 1) - 1);
83
+ const endLine = Math.min(lines.length, candidate.lineEnd || lines.length);
84
+ const relevantCode = lines.slice(startLine, endLine).join('\n');
85
+ const result = checkForVindication(candidate, relevantCode);
86
+ if (result.vindicated) {
87
+ // Auto-vindicate!
88
+ const newDikLevel = vindicateOverride(candidate.eventId, projectId);
89
+ results.push({
90
+ candidate,
91
+ result,
92
+ newDikLevel,
93
+ });
94
+ }
95
+ else {
96
+ // Mark as checked but not vindicated
97
+ markVindicationChecked(candidate.eventId);
98
+ results.push({
99
+ candidate,
100
+ result,
101
+ });
102
+ }
103
+ }
104
+ return results;
105
+ }
106
+ /**
107
+ * Extract meaningful keywords from suggestion text
108
+ */
109
+ function extractKeywords(suggestion) {
110
+ const keywords = [];
111
+ // Extract quoted strings
112
+ const quotedMatches = suggestion.match(/"[^"]+"|'[^']+'/g) || [];
113
+ for (const match of quotedMatches) {
114
+ keywords.push(match.slice(1, -1));
115
+ }
116
+ // Extract code snippets (backticks)
117
+ const codeMatches = suggestion.match(/`[^`]+`/g) || [];
118
+ for (const match of codeMatches) {
119
+ keywords.push(match.slice(1, -1));
120
+ }
121
+ // Extract identifiers (camelCase, PascalCase, snake_case)
122
+ const identifierPattern = /\b([a-z][a-zA-Z0-9]*|[A-Z][a-zA-Z0-9]*|[a-z]+_[a-z_]+)\b/g;
123
+ const identifierMatches = suggestion.match(identifierPattern) || [];
124
+ // Filter out common words
125
+ const commonWords = new Set([
126
+ 'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
127
+ 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',
128
+ 'should', 'may', 'might', 'must', 'can', 'this', 'that', 'these',
129
+ 'those', 'it', 'its', 'to', 'of', 'in', 'for', 'on', 'with', 'as',
130
+ 'at', 'by', 'from', 'or', 'and', 'but', 'if', 'then', 'else', 'when',
131
+ 'use', 'using', 'used', 'instead', 'rather', 'than', 'not', 'should',
132
+ 'you', 'we', 'they', 'your', 'our', 'their', 'my', 'i', 'me',
133
+ ]);
134
+ for (const match of identifierMatches) {
135
+ if (match.length >= 3 && !commonWords.has(match.toLowerCase())) {
136
+ keywords.push(match);
137
+ }
138
+ }
139
+ // Deduplicate
140
+ return [...new Set(keywords)];
141
+ }
142
+ /**
143
+ * Check if the code change represents a pattern reversal
144
+ */
145
+ function checkPatternReversal(originalCode, newCode, suggestion) {
146
+ const suggestionLower = suggestion.toLowerCase();
147
+ const originalLower = originalCode.toLowerCase();
148
+ const newLower = newCode.toLowerCase();
149
+ // Pattern: "Use X instead of Y"
150
+ const useInsteadMatch = suggestionLower.match(/use\s+(\w+)\s+instead\s+of\s+(\w+)/);
151
+ if (useInsteadMatch) {
152
+ const [, preferred, deprecated] = useInsteadMatch;
153
+ const hadDeprecated = originalLower.includes(deprecated);
154
+ const hasPreferred = newLower.includes(preferred);
155
+ const removedDeprecated = !newLower.includes(deprecated);
156
+ if (hadDeprecated && hasPreferred && removedDeprecated) {
157
+ return 0.9; // Strong indicator
158
+ }
159
+ if (hasPreferred) {
160
+ return 0.6; // Moderate indicator
161
+ }
162
+ }
163
+ // Pattern: "Add X" or "Include X"
164
+ const addMatch = suggestionLower.match(/(?:add|include|implement)\s+(\w+)/);
165
+ if (addMatch) {
166
+ const [, feature] = addMatch;
167
+ const hadFeature = originalLower.includes(feature);
168
+ const hasFeature = newLower.includes(feature);
169
+ if (!hadFeature && hasFeature) {
170
+ return 0.8; // Strong indicator - added what was suggested
171
+ }
172
+ }
173
+ // Pattern: "Remove X" or "Delete X"
174
+ const removeMatch = suggestionLower.match(/(?:remove|delete|drop)\s+(\w+)/);
175
+ if (removeMatch) {
176
+ const [, feature] = removeMatch;
177
+ const hadFeature = originalLower.includes(feature);
178
+ const hasFeature = newLower.includes(feature);
179
+ if (hadFeature && !hasFeature) {
180
+ return 0.8; // Strong indicator - removed what was suggested
181
+ }
182
+ }
183
+ return 0;
184
+ }
185
+ /**
186
+ * Compute content hash for a code snippet
187
+ */
188
+ export function computeContentHash(content) {
189
+ return createHash('md5').update(content).digest('hex');
190
+ }
191
+ /**
192
+ * Read code from file at specified line range
193
+ */
194
+ export function readCodeAtLines(filePath, lineStart, lineEnd) {
195
+ if (!existsSync(filePath)) {
196
+ return null;
197
+ }
198
+ try {
199
+ const content = readFileSync(filePath, 'utf-8');
200
+ const lines = content.split('\n');
201
+ const start = Math.max(0, lineStart - 1);
202
+ const end = Math.min(lines.length, lineEnd);
203
+ return lines.slice(start, end).join('\n');
204
+ }
205
+ catch {
206
+ return null;
207
+ }
208
+ }
209
+ //# sourceMappingURL=vindication-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vindication-checker.js","sourceRoot":"","sources":["../../src/guardrails/vindication-checker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Vindication Queue
3
+ *
4
+ * Manages pending vindication checks for overridden guardrails.
5
+ * When a file changes, we check if any pending vindications exist
6
+ * for that file and queue them for evaluation.
7
+ */
8
+ import type { VindicationCandidate, VindicationResult } from '../types/index.js';
9
+ interface QueuedCheck {
10
+ candidate: VindicationCandidate;
11
+ newCode: string;
12
+ queuedAt: Date;
13
+ }
14
+ /**
15
+ * Get all pending vindication candidates for a project
16
+ */
17
+ export declare function getAllPending(projectId: number): VindicationCandidate[];
18
+ /**
19
+ * Get pending vindication candidates for specific files
20
+ */
21
+ export declare function getPendingForFiles(projectId: number, files: string[]): VindicationCandidate[];
22
+ /**
23
+ * Queue a vindication check for processing
24
+ */
25
+ export declare function queueCheck(candidate: VindicationCandidate, newCode: string): void;
26
+ /**
27
+ * Get all queued checks waiting to be processed
28
+ */
29
+ export declare function getQueuedChecks(): QueuedCheck[];
30
+ /**
31
+ * Get queued checks limited to a max count (for injection)
32
+ */
33
+ export declare function getQueuedChecksLimited(maxChecks?: number): QueuedCheck[];
34
+ /**
35
+ * Clear a specific check from the queue
36
+ */
37
+ export declare function dequeueCheck(eventId: number): void;
38
+ /**
39
+ * Clear all queued checks
40
+ */
41
+ export declare function clearQueue(): void;
42
+ /**
43
+ * Record a vindication result
44
+ */
45
+ export declare function recordResult(eventId: number, result: VindicationResult): void;
46
+ /**
47
+ * Mark a check as completed (not vindicated)
48
+ */
49
+ export declare function markChecked(eventId: number): void;
50
+ /**
51
+ * Expire old pending vindications
52
+ */
53
+ export declare function expireOld(projectId: number, maxAgeDays?: number): number;
54
+ /**
55
+ * Check if there are any queued checks waiting
56
+ */
57
+ export declare function hasQueuedChecks(): boolean;
58
+ /**
59
+ * Get the count of queued checks
60
+ */
61
+ export declare function getQueuedCount(): number;
62
+ export {};
63
+ //# sourceMappingURL=vindication-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vindication-queue.d.ts","sourceRoot":"","sources":["../../src/guardrails/vindication-queue.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGjF,UAAU,WAAW;IACnB,SAAS,EAAE,oBAAoB,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,IAAI,CAAC;CAChB;AAID;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,oBAAoB,EAAE,CAEvE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,oBAAoB,EAAE,CAM7F;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAMjF;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,WAAW,EAAE,CAE/C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,GAAE,MAAU,GAAG,WAAW,EAAE,CAG3E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAO7E;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAGjD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,GAAE,MAAW,GAAG,MAAM,CAE5E;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Vindication Queue
3
+ *
4
+ * Manages pending vindication checks for overridden guardrails.
5
+ * When a file changes, we check if any pending vindications exist
6
+ * for that file and queue them for evaluation.
7
+ */
8
+ import { getPendingVindications, getPendingVindicationsForFile, markVindicationChecked, markVindicated, expireOldVindications, } from '../db/index.js';
9
+ const pendingChecks = new Map();
10
+ /**
11
+ * Get all pending vindication candidates for a project
12
+ */
13
+ export function getAllPending(projectId) {
14
+ return getPendingVindications(projectId);
15
+ }
16
+ /**
17
+ * Get pending vindication candidates for specific files
18
+ */
19
+ export function getPendingForFiles(projectId, files) {
20
+ const candidates = [];
21
+ for (const file of files) {
22
+ candidates.push(...getPendingVindicationsForFile(projectId, file));
23
+ }
24
+ return candidates;
25
+ }
26
+ /**
27
+ * Queue a vindication check for processing
28
+ */
29
+ export function queueCheck(candidate, newCode) {
30
+ pendingChecks.set(candidate.eventId, {
31
+ candidate,
32
+ newCode,
33
+ queuedAt: new Date(),
34
+ });
35
+ }
36
+ /**
37
+ * Get all queued checks waiting to be processed
38
+ */
39
+ export function getQueuedChecks() {
40
+ return Array.from(pendingChecks.values());
41
+ }
42
+ /**
43
+ * Get queued checks limited to a max count (for injection)
44
+ */
45
+ export function getQueuedChecksLimited(maxChecks = 3) {
46
+ const checks = Array.from(pendingChecks.values());
47
+ return checks.slice(0, maxChecks);
48
+ }
49
+ /**
50
+ * Clear a specific check from the queue
51
+ */
52
+ export function dequeueCheck(eventId) {
53
+ pendingChecks.delete(eventId);
54
+ }
55
+ /**
56
+ * Clear all queued checks
57
+ */
58
+ export function clearQueue() {
59
+ pendingChecks.clear();
60
+ }
61
+ /**
62
+ * Record a vindication result
63
+ */
64
+ export function recordResult(eventId, result) {
65
+ if (result.vindicated && result.confidence >= 0.7) {
66
+ markVindicated(eventId);
67
+ }
68
+ else {
69
+ markVindicationChecked(eventId);
70
+ }
71
+ dequeueCheck(eventId);
72
+ }
73
+ /**
74
+ * Mark a check as completed (not vindicated)
75
+ */
76
+ export function markChecked(eventId) {
77
+ markVindicationChecked(eventId);
78
+ dequeueCheck(eventId);
79
+ }
80
+ /**
81
+ * Expire old pending vindications
82
+ */
83
+ export function expireOld(projectId, maxAgeDays = 30) {
84
+ return expireOldVindications(projectId, maxAgeDays);
85
+ }
86
+ /**
87
+ * Check if there are any queued checks waiting
88
+ */
89
+ export function hasQueuedChecks() {
90
+ return pendingChecks.size > 0;
91
+ }
92
+ /**
93
+ * Get the count of queued checks
94
+ */
95
+ export function getQueuedCount() {
96
+ return pendingChecks.size;
97
+ }
98
+ //# sourceMappingURL=vindication-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vindication-queue.js","sourceRoot":"","sources":["../../src/guardrails/vindication-queue.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,sBAAsB,EACtB,6BAA6B,EAC7B,sBAAsB,EACtB,cAAc,EACd,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AAUxB,MAAM,aAAa,GAA6B,IAAI,GAAG,EAAE,CAAC;AAE1D;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,SAAiB;IAC7C,OAAO,sBAAsB,CAAC,SAAS,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiB,EAAE,KAAe;IACnE,MAAM,UAAU,GAA2B,EAAE,CAAC;IAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,UAAU,CAAC,IAAI,CAAC,GAAG,6BAA6B,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,SAA+B,EAAE,OAAe;IACzE,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE;QACnC,SAAS;QACT,OAAO;QACP,QAAQ,EAAE,IAAI,IAAI,EAAE;KACrB,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,YAAoB,CAAC;IAC1D,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;IAClD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,aAAa,CAAC,KAAK,EAAE,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,MAAyB;IACrE,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,IAAI,GAAG,EAAE,CAAC;QAClD,cAAc,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;SAAM,CAAC;QACN,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IACD,YAAY,CAAC,OAAO,CAAC,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAChC,YAAY,CAAC,OAAO,CAAC,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,SAAiB,EAAE,aAAqB,EAAE;IAClE,OAAO,qBAAqB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,aAAa,CAAC,IAAI,GAAG,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,aAAa,CAAC,IAAI,CAAC;AAC5B,CAAC"}
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes