@rangerchaz/aimem 0.2.0 → 0.2.2
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 +10 -11
- 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.map +1 -1
- package/dist/cli/commands/guardrails.js +90 -1
- package/dist/cli/commands/guardrails.js.map +1 -1
- 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.js +4 -4
- 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 +0 -0
- package/dist/cli/index.js.map +0 -0
- package/dist/db/index.d.ts +16 -1
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +325 -196
- package/dist/db/index.js.map +1 -1
- package/dist/db/schema.d.ts +0 -0
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +247 -238
- 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/enforcer.d.ts +3 -2
- package/dist/guardrails/enforcer.d.ts.map +1 -1
- package/dist/guardrails/enforcer.js +30 -3
- package/dist/guardrails/enforcer.js.map +1 -1
- package/dist/guardrails/index.d.ts +2 -0
- package/dist/guardrails/index.d.ts.map +1 -1
- package/dist/guardrails/index.js +4 -0
- package/dist/guardrails/index.js.map +1 -1
- 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 +176 -274
- 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 +1 -1
- package/dist/proxy/interceptor-mockttp.js +4 -2
- package/dist/proxy/interceptor-mockttp.js.map +1 -1
- 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 +38 -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 +16 -5
- 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
package/dist/git/index.js.map
CHANGED
|
File without changes
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Checks if proposed actions violate any guardrails.
|
|
5
5
|
*/
|
|
6
|
-
import type { GuardrailCheckResult } from '../types/index.js';
|
|
6
|
+
import type { GuardrailCheckResult, OverrideContext } from '../types/index.js';
|
|
7
7
|
/**
|
|
8
8
|
* Check if an action violates any guardrails.
|
|
9
9
|
*
|
|
@@ -18,8 +18,9 @@ export declare function checkGuardrails(projectId: number, action: string, conte
|
|
|
18
18
|
export declare function acceptGuardrail(guardrailId: number, projectId: number): void;
|
|
19
19
|
/**
|
|
20
20
|
* Record that a user overrode a triggered guardrail.
|
|
21
|
+
* If vindication context is provided, the override will be tracked for auto-vindication.
|
|
21
22
|
*/
|
|
22
|
-
export declare function overrideGuardrail(guardrailId: number, projectId: number, reason: string): number;
|
|
23
|
+
export declare function overrideGuardrail(guardrailId: number, projectId: number, reason: string, context?: OverrideContext): number;
|
|
23
24
|
/**
|
|
24
25
|
* Mark an override as vindicated (user regretted it).
|
|
25
26
|
* This is gold for DIK.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enforcer.d.ts","sourceRoot":"","sources":["../../src/guardrails/enforcer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"enforcer.d.ts","sourceRoot":"","sources":["../../src/guardrails/enforcer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAeH,OAAO,KAAK,EAAiC,oBAAoB,EAAqB,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEjI;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,GACf,oBAAoB,CAsDtB;AAmED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAM5E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,eAAe,GACxB,MAAM,CAsCR;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAc5E"}
|
|
@@ -3,9 +3,11 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Checks if proposed actions violate any guardrails.
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
6
|
+
import { readFileSync, existsSync } from 'fs';
|
|
7
|
+
import { getProjectGuardrails, getOrCreateProjectDik, getGuardrailHistory, insertGuardrailEvent, insertGuardrailEventWithContext, incrementDikCounter, getGuardrailEvent, } from '../db/index.js';
|
|
7
8
|
import { calculateDik } from './calculator.js';
|
|
8
9
|
import { generateCombinedResponse } from './responder.js';
|
|
10
|
+
import { computeContentHash, readCodeAtLines } from './vindication-checker.js';
|
|
9
11
|
/**
|
|
10
12
|
* Check if an action violates any guardrails.
|
|
11
13
|
*
|
|
@@ -127,11 +129,36 @@ export function acceptGuardrail(guardrailId, projectId) {
|
|
|
127
129
|
}
|
|
128
130
|
/**
|
|
129
131
|
* Record that a user overrode a triggered guardrail.
|
|
132
|
+
* If vindication context is provided, the override will be tracked for auto-vindication.
|
|
130
133
|
*/
|
|
131
|
-
export function overrideGuardrail(guardrailId, projectId, reason) {
|
|
134
|
+
export function overrideGuardrail(guardrailId, projectId, reason, context) {
|
|
132
135
|
const dikData = getOrCreateProjectDik(projectId);
|
|
133
136
|
const dikLevel = calculateDik(dikData);
|
|
134
|
-
|
|
137
|
+
// If we have context with a file path, capture code for vindication tracking
|
|
138
|
+
let vindicationContext;
|
|
139
|
+
if (context?.filePath && context?.suggestion) {
|
|
140
|
+
vindicationContext = { ...context };
|
|
141
|
+
// Read current code at the specified lines (if provided)
|
|
142
|
+
if (context.lineStart && context.lineEnd) {
|
|
143
|
+
const code = readCodeAtLines(context.filePath, context.lineStart, context.lineEnd);
|
|
144
|
+
if (code) {
|
|
145
|
+
vindicationContext.codeContext = code;
|
|
146
|
+
vindicationContext.contentHash = computeContentHash(code);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
else if (existsSync(context.filePath)) {
|
|
150
|
+
// Read entire file if no line range specified
|
|
151
|
+
try {
|
|
152
|
+
const code = readFileSync(context.filePath, 'utf-8');
|
|
153
|
+
vindicationContext.codeContext = code.slice(0, 5000); // Limit size
|
|
154
|
+
vindicationContext.contentHash = computeContentHash(code);
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
// Ignore read errors
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
const event = insertGuardrailEventWithContext(guardrailId, 'overridden', reason, null, dikLevel, vindicationContext);
|
|
135
162
|
return event.id;
|
|
136
163
|
}
|
|
137
164
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enforcer.js","sourceRoot":"","sources":["../../src/guardrails/enforcer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"enforcer.js","sourceRoot":"","sources":["../../src/guardrails/enforcer.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,4 +9,6 @@ export { analyzeProject, saveProposedRules, } from './analyzer.js';
|
|
|
9
9
|
export { checkGuardrails, acceptGuardrail, overrideGuardrail, vindicateOverride, } from './enforcer.js';
|
|
10
10
|
export { generateResponse, generateCombinedResponse, formatSeverityPrefix, } from './responder.js';
|
|
11
11
|
export { importLinterRules, type LinterConfig, type ImportedRule, } from './linter-import.js';
|
|
12
|
+
export { getAllPending, getPendingForFiles, queueCheck, getQueuedChecks, getQueuedChecksLimited, dequeueCheck, clearQueue, recordResult, markChecked, expireOld, hasQueuedChecks, getQueuedCount, } from './vindication-queue.js';
|
|
13
|
+
export { checkForVindication, checkFileForVindications, computeContentHash, readCodeAtLines, } from './vindication-checker.js';
|
|
12
14
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/guardrails/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,YAAY,EACZ,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,uBAAuB,EACvB,KAAK,YAAY,GAClB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,cAAc,EACd,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,iBAAiB,EACjB,KAAK,YAAY,EACjB,KAAK,YAAY,GAClB,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/guardrails/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,YAAY,EACZ,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,uBAAuB,EACvB,KAAK,YAAY,GAClB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,cAAc,EACd,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,iBAAiB,EACjB,KAAK,YAAY,EACjB,KAAK,YAAY,GAClB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,UAAU,EACV,eAAe,EACf,sBAAsB,EACtB,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,WAAW,EACX,SAAS,EACT,eAAe,EACf,cAAc,GACf,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,GAChB,MAAM,0BAA0B,CAAC"}
|
package/dist/guardrails/index.js
CHANGED
|
@@ -14,4 +14,8 @@ export { checkGuardrails, acceptGuardrail, overrideGuardrail, vindicateOverride,
|
|
|
14
14
|
export { generateResponse, generateCombinedResponse, formatSeverityPrefix, } from './responder.js';
|
|
15
15
|
// Linter import exports
|
|
16
16
|
export { importLinterRules, } from './linter-import.js';
|
|
17
|
+
// Vindication queue exports
|
|
18
|
+
export { getAllPending, getPendingForFiles, queueCheck, getQueuedChecks, getQueuedChecksLimited, dequeueCheck, clearQueue, recordResult, markChecked, expireOld, hasQueuedChecks, getQueuedCount, } from './vindication-queue.js';
|
|
19
|
+
// Vindication checker exports
|
|
20
|
+
export { checkForVindication, checkFileForVindications, computeContentHash, readCodeAtLines, } from './vindication-checker.js';
|
|
17
21
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/guardrails/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qBAAqB;AACrB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,uBAAuB,GAExB,MAAM,iBAAiB,CAAC;AAEzB,mBAAmB;AACnB,OAAO,EACL,cAAc,EACd,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAEvB,mBAAmB;AACnB,OAAO,EACL,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAEvB,oBAAoB;AACpB,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAExB,wBAAwB;AACxB,OAAO,EACL,iBAAiB,GAGlB,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/guardrails/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qBAAqB;AACrB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,uBAAuB,GAExB,MAAM,iBAAiB,CAAC;AAEzB,mBAAmB;AACnB,OAAO,EACL,cAAc,EACd,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAEvB,mBAAmB;AACnB,OAAO,EACL,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAEvB,oBAAoB;AACpB,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAExB,wBAAwB;AACxB,OAAO,EACL,iBAAiB,GAGlB,MAAM,oBAAoB,CAAC;AAE5B,4BAA4B;AAC5B,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,UAAU,EACV,eAAe,EACf,sBAAsB,EACtB,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,WAAW,EACX,SAAS,EACT,eAAe,EACf,cAAc,GACf,MAAM,wBAAwB,CAAC;AAEhC,8BAA8B;AAC9B,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,GAChB,MAAM,0BAA0B,CAAC"}
|
|
@@ -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
|