@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.
- package/README.md +588 -432
- package/dist/cli/commands/git.d.ts +0 -0
- package/dist/cli/commands/git.d.ts.map +0 -0
- package/dist/cli/commands/git.js +0 -0
- package/dist/cli/commands/git.js.map +0 -0
- package/dist/cli/commands/guardrails.d.ts +3 -0
- package/dist/cli/commands/guardrails.d.ts.map +1 -0
- package/dist/cli/commands/guardrails.js +429 -0
- package/dist/cli/commands/guardrails.js.map +1 -0
- package/dist/cli/commands/import.d.ts +0 -0
- package/dist/cli/commands/import.d.ts.map +0 -0
- package/dist/cli/commands/import.js +0 -0
- package/dist/cli/commands/import.js.map +0 -0
- package/dist/cli/commands/init.d.ts +0 -0
- package/dist/cli/commands/init.d.ts.map +0 -0
- package/dist/cli/commands/init.js +0 -0
- package/dist/cli/commands/init.js.map +0 -0
- package/dist/cli/commands/mcp-serve.d.ts +0 -0
- package/dist/cli/commands/mcp-serve.d.ts.map +0 -0
- package/dist/cli/commands/mcp-serve.js +0 -0
- package/dist/cli/commands/mcp-serve.js.map +0 -0
- package/dist/cli/commands/query.d.ts +0 -0
- package/dist/cli/commands/query.d.ts.map +0 -0
- package/dist/cli/commands/query.js +0 -0
- package/dist/cli/commands/query.js.map +0 -0
- package/dist/cli/commands/reindex.d.ts +7 -0
- package/dist/cli/commands/reindex.d.ts.map +1 -0
- package/dist/cli/commands/reindex.js +117 -0
- package/dist/cli/commands/reindex.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +0 -0
- package/dist/cli/commands/setup.d.ts.map +0 -0
- package/dist/cli/commands/setup.js +0 -0
- package/dist/cli/commands/setup.js.map +0 -0
- package/dist/cli/commands/start.d.ts +0 -0
- package/dist/cli/commands/start.d.ts.map +0 -0
- package/dist/cli/commands/start.js +0 -0
- package/dist/cli/commands/start.js.map +0 -0
- package/dist/cli/commands/status.d.ts +0 -0
- package/dist/cli/commands/status.d.ts.map +0 -0
- package/dist/cli/commands/status.js +0 -0
- package/dist/cli/commands/status.js.map +0 -0
- package/dist/cli/commands/stop.d.ts +0 -0
- package/dist/cli/commands/stop.d.ts.map +0 -0
- package/dist/cli/commands/stop.js +0 -0
- package/dist/cli/commands/stop.js.map +0 -0
- package/dist/cli/commands/visualize.d.ts +0 -0
- package/dist/cli/commands/visualize.d.ts.map +0 -0
- package/dist/cli/commands/visualize.js +0 -0
- package/dist/cli/commands/visualize.js.map +0 -0
- package/dist/cli/index.d.ts +0 -0
- package/dist/cli/index.d.ts.map +0 -0
- package/dist/cli/index.js +15 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/db/index.d.ts +45 -1
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +489 -169
- package/dist/db/index.js.map +1 -1
- package/dist/db/schema.d.ts +1 -0
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +251 -188
- package/dist/db/schema.js.map +1 -1
- package/dist/extractor/index.d.ts +0 -0
- package/dist/extractor/index.d.ts.map +0 -0
- package/dist/extractor/index.js +0 -0
- package/dist/extractor/index.js.map +0 -0
- package/dist/git/extractor.d.ts +0 -0
- package/dist/git/extractor.d.ts.map +0 -0
- package/dist/git/extractor.js +0 -0
- package/dist/git/extractor.js.map +0 -0
- package/dist/git/hooks.d.ts +0 -0
- package/dist/git/hooks.d.ts.map +0 -0
- package/dist/git/hooks.js +0 -0
- package/dist/git/hooks.js.map +0 -0
- package/dist/git/index.d.ts +0 -0
- package/dist/git/index.d.ts.map +0 -0
- package/dist/git/index.js +0 -0
- package/dist/git/index.js.map +0 -0
- package/dist/guardrails/analyzer.d.ts +20 -0
- package/dist/guardrails/analyzer.d.ts.map +1 -0
- package/dist/guardrails/analyzer.js +329 -0
- package/dist/guardrails/analyzer.js.map +1 -0
- package/dist/guardrails/calculator.d.ts +46 -0
- package/dist/guardrails/calculator.d.ts.map +1 -0
- package/dist/guardrails/calculator.js +97 -0
- package/dist/guardrails/calculator.js.map +1 -0
- package/dist/guardrails/enforcer.d.ts +29 -0
- package/dist/guardrails/enforcer.d.ts.map +1 -0
- package/dist/guardrails/enforcer.js +180 -0
- package/dist/guardrails/enforcer.js.map +1 -0
- package/dist/guardrails/index.d.ts +14 -0
- package/dist/guardrails/index.d.ts.map +1 -0
- package/dist/guardrails/index.js +21 -0
- package/dist/guardrails/index.js.map +1 -0
- package/dist/guardrails/linter-import.d.ts +31 -0
- package/dist/guardrails/linter-import.d.ts.map +1 -0
- package/dist/guardrails/linter-import.js +547 -0
- package/dist/guardrails/linter-import.js.map +1 -0
- package/dist/guardrails/responder.d.ts +28 -0
- package/dist/guardrails/responder.d.ts.map +1 -0
- package/dist/guardrails/responder.js +98 -0
- package/dist/guardrails/responder.js.map +1 -0
- package/dist/guardrails/vindication-checker.d.ts +24 -0
- package/dist/guardrails/vindication-checker.d.ts.map +1 -0
- package/dist/guardrails/vindication-checker.js +209 -0
- package/dist/guardrails/vindication-checker.js.map +1 -0
- package/dist/guardrails/vindication-queue.d.ts +63 -0
- package/dist/guardrails/vindication-queue.d.ts.map +1 -0
- package/dist/guardrails/vindication-queue.js +98 -0
- package/dist/guardrails/vindication-queue.js.map +1 -0
- package/dist/indexer/index.d.ts +0 -0
- package/dist/indexer/index.d.ts.map +0 -0
- package/dist/indexer/index.js +0 -0
- package/dist/indexer/index.js.map +0 -0
- package/dist/indexer/parsers/base.d.ts +0 -0
- package/dist/indexer/parsers/base.d.ts.map +0 -0
- package/dist/indexer/parsers/base.js +0 -0
- package/dist/indexer/parsers/base.js.map +0 -0
- package/dist/indexer/parsers/cpp.d.ts +0 -0
- package/dist/indexer/parsers/cpp.d.ts.map +0 -0
- package/dist/indexer/parsers/cpp.js +0 -0
- package/dist/indexer/parsers/cpp.js.map +0 -0
- package/dist/indexer/parsers/go.d.ts +0 -0
- package/dist/indexer/parsers/go.d.ts.map +0 -0
- package/dist/indexer/parsers/go.js +0 -0
- package/dist/indexer/parsers/go.js.map +0 -0
- package/dist/indexer/parsers/java.d.ts +0 -0
- package/dist/indexer/parsers/java.d.ts.map +0 -0
- package/dist/indexer/parsers/java.js +0 -0
- package/dist/indexer/parsers/java.js.map +0 -0
- package/dist/indexer/parsers/javascript.d.ts +0 -0
- package/dist/indexer/parsers/javascript.d.ts.map +0 -0
- package/dist/indexer/parsers/javascript.js +0 -0
- package/dist/indexer/parsers/javascript.js.map +0 -0
- package/dist/indexer/parsers/kotlin.d.ts +0 -0
- package/dist/indexer/parsers/kotlin.d.ts.map +0 -0
- package/dist/indexer/parsers/kotlin.js +0 -0
- package/dist/indexer/parsers/kotlin.js.map +0 -0
- package/dist/indexer/parsers/php.d.ts +0 -0
- package/dist/indexer/parsers/php.d.ts.map +0 -0
- package/dist/indexer/parsers/php.js +0 -0
- package/dist/indexer/parsers/php.js.map +0 -0
- package/dist/indexer/parsers/python.d.ts +0 -0
- package/dist/indexer/parsers/python.d.ts.map +0 -0
- package/dist/indexer/parsers/python.js +0 -0
- package/dist/indexer/parsers/python.js.map +0 -0
- package/dist/indexer/parsers/ruby.d.ts +0 -0
- package/dist/indexer/parsers/ruby.d.ts.map +0 -0
- package/dist/indexer/parsers/ruby.js +0 -0
- package/dist/indexer/parsers/ruby.js.map +0 -0
- package/dist/indexer/parsers/rust.d.ts +0 -0
- package/dist/indexer/parsers/rust.d.ts.map +0 -0
- package/dist/indexer/parsers/rust.js +0 -0
- package/dist/indexer/parsers/rust.js.map +0 -0
- package/dist/indexer/watcher-daemon.d.ts +0 -0
- package/dist/indexer/watcher-daemon.d.ts.map +0 -0
- package/dist/indexer/watcher-daemon.js +10 -0
- package/dist/indexer/watcher-daemon.js.map +1 -1
- package/dist/indexer/watcher.d.ts +2 -0
- package/dist/indexer/watcher.d.ts.map +1 -1
- package/dist/indexer/watcher.js +8 -0
- package/dist/indexer/watcher.js.map +1 -1
- package/dist/mcp/server.d.ts +0 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +343 -45
- package/dist/mcp/server.js.map +1 -1
- package/dist/proxy/interceptor-mockttp.d.ts +0 -0
- package/dist/proxy/interceptor-mockttp.d.ts.map +0 -0
- package/dist/proxy/interceptor-mockttp.js +0 -0
- package/dist/proxy/interceptor-mockttp.js.map +0 -0
- package/dist/proxy/proxy-daemon.d.ts +0 -0
- package/dist/proxy/proxy-daemon.d.ts.map +0 -0
- package/dist/proxy/proxy-daemon.js +0 -0
- package/dist/proxy/proxy-daemon.js.map +0 -0
- package/dist/query/index.d.ts +0 -0
- package/dist/query/index.d.ts.map +0 -0
- package/dist/query/index.js +0 -0
- package/dist/query/index.js.map +0 -0
- package/dist/types/index.d.ts +96 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +0 -0
- package/dist/types/index.js.map +0 -0
- package/dist/visualize/index.d.ts +0 -0
- package/dist/visualize/index.d.ts.map +0 -0
- package/dist/visualize/index.js +0 -0
- package/dist/visualize/index.js.map +0 -0
- package/dist/visualize/server.d.ts +0 -0
- package/dist/visualize/server.d.ts.map +0 -0
- package/dist/visualize/server.js +0 -0
- package/dist/visualize/server.js.map +0 -0
- package/dist/visualize/template.d.ts +0 -0
- package/dist/visualize/template.d.ts.map +0 -0
- package/dist/visualize/template.js +0 -0
- package/dist/visualize/template.js.map +0 -0
- package/package.json +67 -56
- package/dist/cli/commands/hook-session-end.d.ts +0 -7
- package/dist/cli/commands/hook-session-end.d.ts.map +0 -1
- package/dist/cli/commands/hook-session-end.js +0 -109
- package/dist/cli/commands/hook-session-end.js.map +0 -1
- package/dist/cli/commands/hook-session-start.d.ts +0 -7
- package/dist/cli/commands/hook-session-start.d.ts.map +0 -1
- package/dist/cli/commands/hook-session-start.js +0 -116
- 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"}
|
package/dist/indexer/index.d.ts
CHANGED
|
File without changes
|
|
File without changes
|
package/dist/indexer/index.js
CHANGED
|
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
|