@jmtrin/opencode-kevin 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -6
- package/dist/migrations/005_v04_signal.sql +57 -0
- package/dist/plugin/CausalChain.d.ts +13 -2
- package/dist/plugin/CausalChain.js +83 -13
- package/dist/plugin/CausalChain.js.map +1 -1
- package/dist/plugin/ContextInjector.d.ts +80 -4
- package/dist/plugin/ContextInjector.js +262 -88
- package/dist/plugin/ContextInjector.js.map +1 -1
- package/dist/plugin/InjectionLedger.d.ts +85 -0
- package/dist/plugin/InjectionLedger.js +189 -0
- package/dist/plugin/InjectionLedger.js.map +1 -0
- package/dist/plugin/LessonFixer.d.ts +44 -0
- package/dist/plugin/LessonFixer.js +46 -0
- package/dist/plugin/LessonFixer.js.map +1 -0
- package/dist/plugin/MemoryService.d.ts +62 -1
- package/dist/plugin/MemoryService.js +206 -43
- package/dist/plugin/MemoryService.js.map +1 -1
- package/dist/plugin/Migrate.js +10 -0
- package/dist/plugin/Migrate.js.map +1 -1
- package/dist/plugin/QualityGate.d.ts +71 -0
- package/dist/plugin/QualityGate.js +78 -0
- package/dist/plugin/QualityGate.js.map +1 -0
- package/dist/plugin/Reflector.d.ts +17 -0
- package/dist/plugin/Reflector.js +81 -26
- package/dist/plugin/Reflector.js.map +1 -1
- package/dist/plugin/Retrospective.js +10 -1
- package/dist/plugin/Retrospective.js.map +1 -1
- package/dist/plugin/ToolCallObserver.d.ts +1 -0
- package/dist/plugin/ToolCallObserver.js +15 -8
- package/dist/plugin/ToolCallObserver.js.map +1 -1
- package/dist/plugin/confidence.d.ts +6 -0
- package/dist/plugin/confidence.js +23 -0
- package/dist/plugin/confidence.js.map +1 -0
- package/dist/plugin/index.d.ts +5 -0
- package/dist/plugin/index.js +216 -44
- package/dist/plugin/index.js.map +1 -1
- package/dist/plugin/kevin_why.d.ts +4 -0
- package/dist/plugin/kevin_why.js +51 -35
- package/dist/plugin/kevin_why.js.map +1 -1
- package/dist/plugin/memory-format.d.ts +12 -0
- package/dist/plugin/memory-format.js +45 -5
- package/dist/plugin/memory-format.js.map +1 -1
- package/dist/plugin/metrics.d.ts +7 -1
- package/dist/plugin/metrics.js +16 -0
- package/dist/plugin/metrics.js.map +1 -1
- package/dist/plugin/okf-export.js +63 -22
- package/dist/plugin/okf-export.js.map +1 -1
- package/dist/plugin/okf-import.d.ts +4 -1
- package/dist/plugin/okf-import.js +45 -12
- package/dist/plugin/okf-import.js.map +1 -1
- package/dist/plugin/query-tokenizer.d.ts +13 -0
- package/dist/plugin/query-tokenizer.js +86 -0
- package/dist/plugin/query-tokenizer.js.map +1 -0
- package/migrations/005_v04_signal.sql +57 -0
- package/package.json +1 -1
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { SUGGESTIONS } from "./Reflector.js";
|
|
2
|
+
/**
|
|
3
|
+
* v0.4.0 (K4-003/K4-004 / plan §5.1) — QualityGate.
|
|
4
|
+
*
|
|
5
|
+
* Pure, NO-LLM predicates deciding whether a lesson is worth injecting into
|
|
6
|
+
* the model's prompt. Principle 11: never inject noise.
|
|
7
|
+
*
|
|
8
|
+
* - `evaluate` — classifies a lesson (rescued errorType, non-generic
|
|
9
|
+
* suggestion, isActionable, strength).
|
|
10
|
+
* - `rescueErrorType` — a dispatched code overrides the coarse
|
|
11
|
+
* `errorType` (e.g. `'unknown'` → `'TS2304'`), fixing the defect where
|
|
12
|
+
* lessons said "fails with unknown" even when the Reflector DID identify
|
|
13
|
+
* the error code.
|
|
14
|
+
* - `canInject` — per-session + per-fingerprint admission rules (K4-004).
|
|
15
|
+
*/
|
|
16
|
+
/** The v0.1.x fallback suggestions. A lesson whose suggestion is one of these
|
|
17
|
+
* (and has no dispatched code) carries no actionable information. */
|
|
18
|
+
export const GENERIC_SUGGESTIONS = new Set(Object.values(SUGGESTIONS));
|
|
19
|
+
export function isGenericSuggestion(suggestion) {
|
|
20
|
+
return GENERIC_SUGGESTIONS.has(suggestion);
|
|
21
|
+
}
|
|
22
|
+
export const QualityGate = {
|
|
23
|
+
/**
|
|
24
|
+
* A dispatched code always overrides the coarse errorType for display:
|
|
25
|
+
* `'unknown'` + `TS2304` → `'TS2304'`.
|
|
26
|
+
*/
|
|
27
|
+
rescueErrorType(dispatch, errorType) {
|
|
28
|
+
if (dispatch?.code)
|
|
29
|
+
return dispatch.code;
|
|
30
|
+
return errorType;
|
|
31
|
+
},
|
|
32
|
+
/** Classify a lesson per §5.1 rule 1 (rescue) and the generic ban. */
|
|
33
|
+
evaluate(lesson, dispatch, errorType) {
|
|
34
|
+
const rescued = this.rescueErrorType(dispatch, errorType);
|
|
35
|
+
const generic = isGenericSuggestion(lesson.suggestion);
|
|
36
|
+
// §5.1 rule 2: the generic ban applies only when there is no
|
|
37
|
+
// dispatched code — a matched code always makes the lesson
|
|
38
|
+
// actionable (the lesson then carries a "Likely cause" hint).
|
|
39
|
+
const isActionable = !generic || dispatch?.code != null;
|
|
40
|
+
const strength = dispatch?.code != null || rescued !== "unknown" ? "strong" : "weak";
|
|
41
|
+
return {
|
|
42
|
+
errorType: rescued,
|
|
43
|
+
suggestion: lesson.suggestion,
|
|
44
|
+
isActionable,
|
|
45
|
+
strength,
|
|
46
|
+
};
|
|
47
|
+
},
|
|
48
|
+
/**
|
|
49
|
+
* v0.4.0 (K4-004 / plan §5.1 rules 2-4) — admission gate evaluated at
|
|
50
|
+
* injection time. A lesson is injectable only when:
|
|
51
|
+
*
|
|
52
|
+
* 1. its memory id was not already injected this session (seen-set),
|
|
53
|
+
* 2. its memory is not `stale`,
|
|
54
|
+
* 3. its fingerprint has not recurred since injection (`recurrenceCount
|
|
55
|
+
* === 0` — a lesson that failed to prevent the error leaves the
|
|
56
|
+
* prompt),
|
|
57
|
+
* 4. it is actionable AND strong — weak lessons with generic suggestions
|
|
58
|
+
* are never injected (unless `qualityGateEnabled = false` for debug,
|
|
59
|
+
* K4-023).
|
|
60
|
+
*/
|
|
61
|
+
canInject(memory, ctx, qualityGateEnabled = true) {
|
|
62
|
+
if (ctx.seenThisSession.has(memory.id))
|
|
63
|
+
return false;
|
|
64
|
+
if (memory.status !== undefined && memory.status !== "active") {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
if (ctx.recurrenceCount > 0)
|
|
68
|
+
return false;
|
|
69
|
+
if (!memory.isActionable || memory.strength === "weak") {
|
|
70
|
+
if (qualityGateEnabled)
|
|
71
|
+
return false;
|
|
72
|
+
// K4-023 debug mode: weak lessons are admitted but must be
|
|
73
|
+
// flagged by the caller (ContextInjector adds the marker).
|
|
74
|
+
}
|
|
75
|
+
return true;
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=QualityGate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QualityGate.js","sourceRoot":"","sources":["../../plugin/QualityGate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C;;;;;;;;;;;;;GAaG;AAEH;qEACqE;AACrE,MAAM,CAAC,MAAM,mBAAmB,GAAwB,IAAI,GAAG,CAC9D,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAC1B,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,UAAkB;IACrD,OAAO,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAC5C,CAAC;AA6BD,MAAM,CAAC,MAAM,WAAW,GAAG;IAC1B;;;OAGG;IACH,eAAe,CACd,QAAiC,EACjC,SAAiB;QAEjB,IAAI,QAAQ,EAAE,IAAI;YAAE,OAAO,QAAQ,CAAC,IAAI,CAAC;QACzC,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,sEAAsE;IACtE,QAAQ,CACP,MAAqB,EACrB,QAAiC,EACjC,SAAiB;QAEjB,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACvD,6DAA6D;QAC7D,2DAA2D;QAC3D,8DAA8D;QAC9D,MAAM,YAAY,GAAG,CAAC,OAAO,IAAI,QAAQ,EAAE,IAAI,IAAI,IAAI,CAAC;QACxD,MAAM,QAAQ,GACb,QAAQ,EAAE,IAAI,IAAI,IAAI,IAAI,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;QACrE,OAAO;YACN,SAAS,EAAE,OAAO;YAClB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,YAAY;YACZ,QAAQ;SACR,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,SAAS,CACR,MAKC,EACD,GAAqB,EACrB,kBAAkB,GAAG,IAAI;QAEzB,IAAI,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAAE,OAAO,KAAK,CAAC;QACrD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/D,OAAO,KAAK,CAAC;QACd,CAAC;QACD,IAAI,GAAG,CAAC,eAAe,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAC1C,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;YACxD,IAAI,kBAAkB;gBAAE,OAAO,KAAK,CAAC;YACrC,2DAA2D;YAC3D,2DAA2D;QAC5D,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;CACD,CAAC"}
|
|
@@ -30,6 +30,12 @@ export interface ReflectorOptions {
|
|
|
30
30
|
export interface HeuristicLessonInput {
|
|
31
31
|
toolName: string;
|
|
32
32
|
errorType: string;
|
|
33
|
+
/** v0.4.0 (K4-005) — errorType shown in the `fails with` slot after
|
|
34
|
+
* rescue: the dispatched code when one matched, else the coarse
|
|
35
|
+
* errorType. Suggestion lookup still uses `errorType` (the coarse
|
|
36
|
+
* category) so the category suggestion is kept even when a code
|
|
37
|
+
* overrides the display. */
|
|
38
|
+
displayErrorType?: string;
|
|
33
39
|
firstErrorLine: string;
|
|
34
40
|
/** v0.2.0 (K2-018) — optional pre-computed dispatch result. When absent,
|
|
35
41
|
* dispatch is performed on `firstErrorLine` alone. */
|
|
@@ -47,6 +53,17 @@ export interface DispatchedLesson {
|
|
|
47
53
|
}
|
|
48
54
|
export declare const ERROR_LINE_RE: RegExp;
|
|
49
55
|
export declare const STRONG_ERROR_RE: RegExp;
|
|
56
|
+
/**
|
|
57
|
+
* v0.1.x fallback table — keyed by `errorType`. RETAINED in v0.2.0 as the
|
|
58
|
+
* fallback for memos whose output does not match a deterministic code rule.
|
|
59
|
+
* The v0.2.0 per-error-code rule table below layers ON TOP of this fallback:
|
|
60
|
+
* when a code is matched, the hint is appended to the v0.1.x suggestion as a
|
|
61
|
+
* 'Likely cause:' line; when no code is matched, output is identical to v0.1.x.
|
|
62
|
+
*
|
|
63
|
+
* Exported since v0.4.0 (K4-003) so QualityGate can detect the generic
|
|
64
|
+
* fallback suggestions without duplicating the strings.
|
|
65
|
+
*/
|
|
66
|
+
export declare const SUGGESTIONS: Record<string, string>;
|
|
50
67
|
export declare const TS_CODE_RULES: Record<string, string>;
|
|
51
68
|
export declare class Reflector {
|
|
52
69
|
private memoryService;
|
package/dist/plugin/Reflector.js
CHANGED
|
@@ -7,13 +7,17 @@ const TRUNC_SUFFIX = "... [truncated]";
|
|
|
7
7
|
const CONTEXT_PREFIX = "\n\nContext:\n";
|
|
8
8
|
export const ERROR_LINE_RE = /\b(error|failed|fail|cannot find|cannot resolve|TS\d{4,}|exception|traceback|panic|fatal|referenceerror|typeerror|syntaxerror|command failed|non-zero exit)\b/i;
|
|
9
9
|
export const STRONG_ERROR_RE = /\b(cannot find|cannot resolve|TS\d{4,}|error TS\d|command failed|non-zero exit|exit code [1-9]\d*|traceback|referenceerror|typeerror|syntaxerror|fatal error|exception|failed to compile|build failed|compilation failed)\b/i;
|
|
10
|
-
/**
|
|
10
|
+
/**
|
|
11
|
+
* v0.1.x fallback table — keyed by `errorType`. RETAINED in v0.2.0 as the
|
|
11
12
|
* fallback for memos whose output does not match a deterministic code rule.
|
|
12
13
|
* The v0.2.0 per-error-code rule table below layers ON TOP of this fallback:
|
|
13
14
|
* when a code is matched, the hint is appended to the v0.1.x suggestion as a
|
|
14
15
|
* 'Likely cause:' line; when no code is matched, output is identical to v0.1.x.
|
|
16
|
+
*
|
|
17
|
+
* Exported since v0.4.0 (K4-003) so QualityGate can detect the generic
|
|
18
|
+
* fallback suggestions without duplicating the strings.
|
|
15
19
|
*/
|
|
16
|
-
const SUGGESTIONS = {
|
|
20
|
+
export const SUGGESTIONS = {
|
|
17
21
|
typecheck: "Verify types and imports before running.",
|
|
18
22
|
lint: "Run linter and fix warnings before committing.",
|
|
19
23
|
test: "Run tests and fix failures before proceeding.",
|
|
@@ -28,24 +32,42 @@ const SUGGESTIONS = {
|
|
|
28
32
|
// v0.2.0 (K2-018) — shared per-error-code rule table. Exported so
|
|
29
33
|
// kevin_why.ts reuses the SAME hints instead of duplicating them
|
|
30
34
|
// (bug #6).
|
|
35
|
+
// v0.4.0 (K4-022 / plan §5.4, D4-07) — expanded with the observed §3.3
|
|
36
|
+
// cases: TS2307 (cannot find module), TS2339/TS2305 (missing member),
|
|
37
|
+
// TS6133 (unused).
|
|
31
38
|
export const TS_CODE_RULES = {
|
|
32
39
|
"2304": "import or typo",
|
|
33
40
|
"2322": "type mismatch",
|
|
34
41
|
"2740": "missing or wrong property",
|
|
35
42
|
"2552": "undefined identifier",
|
|
36
43
|
"18047": "possibly null",
|
|
44
|
+
"2307": "install the dependency or add it to package.json before importing",
|
|
45
|
+
"2339": "check the imported surface for the correct member name",
|
|
46
|
+
"2305": "check the imported surface for the correct member name",
|
|
47
|
+
"6133": "remove the declaration or use it",
|
|
37
48
|
};
|
|
38
|
-
const TS_CODE_RE = /\bTS(\d{4,5})\b
|
|
49
|
+
const TS_CODE_RE = /\bTS(\d{4,5})\b/i;
|
|
39
50
|
const PY_LINT_RE = /\b(ELIF\d{0,4})\b|\b(F\d{3,4})\b|flake8:\s+(\S+)/;
|
|
40
51
|
const SYSCALL_RE = /\b(EADDRINUSE|ENOENT|EACCES|EPERM)\b/;
|
|
52
|
+
// v0.4.0 (K4-022) — rust unresolved item/module (E0433/E0432).
|
|
53
|
+
const RUST_CODE_RE = /\b(E0433|E0432)\b/;
|
|
54
|
+
// v0.4.0 (K4-022) — shell command-not-found (`cmd: command not found`,
|
|
55
|
+
// `The term 'cmd' is not recognized ...`).
|
|
56
|
+
const COMMAND_NOT_FOUND_RE = /\b([a-zA-Z0-9_.-]+):\s+(?:command not found|The term\s+['"][^'"]+['"]\s+is not recognized)\b/i;
|
|
41
57
|
const GENERIC_ERROR_RE = /\bError:\s+(\w+)/;
|
|
42
58
|
const COMMAND_FAILED_RE = /Command\s+"([^"]+)"\s+failed/;
|
|
43
59
|
const SECRET_PATTERNS = [
|
|
44
|
-
|
|
60
|
+
/\b(API_KEY|SECRET|PASSWORD|TOKEN)\b\s*[=:]\s*\S+/gi,
|
|
45
61
|
/\bBearer\s+\S+/gi,
|
|
46
|
-
|
|
62
|
+
// BUG-013 — same narrowing as ToolCallObserver: the old
|
|
63
|
+
// `\btoken\s+\S+/gi` mangled harmless phrasing ("token budget",
|
|
64
|
+
// "token count") in stderr/stdout — corrupting stored summaries AND
|
|
65
|
+
// the fingerprints derived from the redacted text. Credential
|
|
66
|
+
// contexts only: named token variables WITH an assignment, and
|
|
67
|
+
// `token=<value>` / `token: <value>` assignments.
|
|
68
|
+
/\b(access_?token|auth_?token|api_?token)\b\s*[=:]\s*\S+/gi,
|
|
69
|
+
/\btoken\s*[=:]\s*\S+/gi,
|
|
47
70
|
];
|
|
48
|
-
const SECRET_VALUE_PATTERN = /\s*=\s*\S+(.*)$/;
|
|
49
71
|
const PATH_PATTERNS_DEPRECATED = null;
|
|
50
72
|
export class Reflector {
|
|
51
73
|
memoryService;
|
|
@@ -67,11 +89,15 @@ export class Reflector {
|
|
|
67
89
|
const redactedStdout = this.redactSecrets(this.redactPaths(input.stdout));
|
|
68
90
|
const sourceOutput = redactedStderr.length > 0 ? redactedStderr : redactedStdout;
|
|
69
91
|
const firstErrorLine = this.extractFirstErrorLine(sourceOutput);
|
|
92
|
+
// v0.4.0 (K4-005) — dispatch once and reuse for the rescued
|
|
93
|
+
// errorType AND metadata.dispatch.
|
|
94
|
+
const dispatched = this.dispatchLesson(redactedStderr, redactedStdout, input.errorType);
|
|
70
95
|
const lesson = this.generateHeuristicLesson({
|
|
71
96
|
toolName: input.toolName,
|
|
72
97
|
errorType: input.errorType,
|
|
98
|
+
displayErrorType: dispatched.code ?? input.errorType,
|
|
73
99
|
firstErrorLine,
|
|
74
|
-
dispatched
|
|
100
|
+
dispatched,
|
|
75
101
|
});
|
|
76
102
|
// v0.3.0 fix (bug #5) — the per-fingerprint throttle check runs
|
|
77
103
|
// BEFORE the optional LLM enrichment, so throttled repeats never
|
|
@@ -81,6 +107,21 @@ export class Reflector {
|
|
|
81
107
|
const projectId = input.projectId ?? null;
|
|
82
108
|
const fpContent = sourceOutput.length > 0 ? sourceOutput : lesson;
|
|
83
109
|
const fp = computeFingerprint(fpContent, projectId ?? undefined);
|
|
110
|
+
// v0.3.0 fix — stamp the failing tool_call with the stderr-based
|
|
111
|
+
// fingerprint so the feedback loop's recurrence queries can match
|
|
112
|
+
// it (closes the fingerprint-mismatch bug). Runs BEFORE the
|
|
113
|
+
// throttle check: throttled repeats (K4-025 recurrences) still
|
|
114
|
+
// stamp — the throttle only skips the expensive enrichment/save,
|
|
115
|
+
// but the recurrence signal (settle's COUNT, QualityGate,
|
|
116
|
+
// penalizeRecurringReflectors) must see every failing call.
|
|
117
|
+
if (input.callID && this.onLinkErrorFn) {
|
|
118
|
+
try {
|
|
119
|
+
this.onLinkErrorFn(input.callID, fp);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// linking failure is non-blocking
|
|
123
|
+
}
|
|
124
|
+
}
|
|
84
125
|
const last = this.lastReflectionByFp.get(fp) ?? 0;
|
|
85
126
|
if (now - last < this.throttleMs) {
|
|
86
127
|
this.metrics?.incr("reflections_throttled", 1);
|
|
@@ -103,6 +144,11 @@ export class Reflector {
|
|
|
103
144
|
if (input.callID) {
|
|
104
145
|
metadata.origin_call_id = input.callID;
|
|
105
146
|
}
|
|
147
|
+
// v0.4.0 (K4-005) — persist the dispatch result so injection and
|
|
148
|
+
// promotion can reuse the rescued errorType and hint without
|
|
149
|
+
// re-dispatching. Stored even when no code matched ({code:null,hint:null})
|
|
150
|
+
// so callers can distinguish "checked and unmatched" from "absent".
|
|
151
|
+
metadata.dispatch = { code: dispatched.code, hint: dispatched.hint };
|
|
106
152
|
let finalContent;
|
|
107
153
|
if (sourceOutput.length > 0) {
|
|
108
154
|
const fullLen = enrichedLesson.length + CONTEXT_PREFIX.length + sourceOutput.length;
|
|
@@ -136,29 +182,17 @@ export class Reflector {
|
|
|
136
182
|
projectId: projectId ?? undefined,
|
|
137
183
|
fingerprint: fp,
|
|
138
184
|
});
|
|
139
|
-
// v0.3.0 fix — stamp the failing tool_call with the stderr-based
|
|
140
|
-
// fingerprint so the feedback loop's recurrence queries can match
|
|
141
|
-
// it (closes the fingerprint-mismatch bug). Fires even after the
|
|
142
|
-
// dedup path returned an existing memory id, since the current
|
|
143
|
-
// call IS a new occurrence of the same error.
|
|
144
|
-
if (input.callID && this.onLinkErrorFn) {
|
|
145
|
-
try {
|
|
146
|
-
this.onLinkErrorFn(input.callID, fp);
|
|
147
|
-
}
|
|
148
|
-
catch {
|
|
149
|
-
// linking failure is non-blocking
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
185
|
return id;
|
|
153
186
|
}
|
|
154
187
|
generateHeuristicLesson(input) {
|
|
155
188
|
const dispatched = input.dispatched ??
|
|
156
189
|
this.dispatchLesson(input.firstErrorLine, "", input.errorType);
|
|
157
190
|
const suggestion = SUGGESTIONS[input.errorType] ?? SUGGESTIONS.unknown;
|
|
191
|
+
const shownErrorType = input.displayErrorType ?? input.errorType;
|
|
158
192
|
const line = input.firstErrorLine.length > MAX_ERROR_LINE_CHARS
|
|
159
193
|
? `${input.firstErrorLine.slice(0, MAX_ERROR_LINE_CHARS)}...`
|
|
160
194
|
: input.firstErrorLine;
|
|
161
|
-
let lesson = `When ${input.toolName} fails with ${
|
|
195
|
+
let lesson = `When ${input.toolName} fails with ${shownErrorType}: ${line}\nSuggestion: ${suggestion}`;
|
|
162
196
|
if (dispatched.code && dispatched.hint) {
|
|
163
197
|
lesson += `\nLikely cause: ${dispatched.hint} (code ${dispatched.code})`;
|
|
164
198
|
}
|
|
@@ -186,10 +220,29 @@ export class Reflector {
|
|
|
186
220
|
const rule = pyMatch[1] || pyMatch[2] || pyMatch[3] || "unknown";
|
|
187
221
|
return { code: rule, hint: `review python lint: ${rule}` };
|
|
188
222
|
}
|
|
223
|
+
const rustMatch = combined.match(RUST_CODE_RE);
|
|
224
|
+
if (rustMatch) {
|
|
225
|
+
const code = rustMatch[1];
|
|
226
|
+
return {
|
|
227
|
+
code,
|
|
228
|
+
hint: "add the dependency to Cargo.toml or use a full path (crate::...)",
|
|
229
|
+
};
|
|
230
|
+
}
|
|
189
231
|
const sysMatch = combined.match(SYSCALL_RE);
|
|
190
232
|
if (sysMatch) {
|
|
191
233
|
const code = sysMatch[1];
|
|
192
|
-
|
|
234
|
+
const hint = code === "EADDRINUSE"
|
|
235
|
+
? "free the port (netstat -ano | findstr :PORT) or change the port"
|
|
236
|
+
: `review syscall: ${code}`;
|
|
237
|
+
return { code, hint };
|
|
238
|
+
}
|
|
239
|
+
const cmdNotFoundMatch = combined.match(COMMAND_NOT_FOUND_RE);
|
|
240
|
+
if (cmdNotFoundMatch) {
|
|
241
|
+
const cmd = cmdNotFoundMatch[1];
|
|
242
|
+
return {
|
|
243
|
+
code: cmd,
|
|
244
|
+
hint: `install the tool (e.g. npm i -g ${cmd}) or call it by its full path`,
|
|
245
|
+
};
|
|
193
246
|
}
|
|
194
247
|
const errMatch = combined.match(GENERIC_ERROR_RE);
|
|
195
248
|
if (errMatch) {
|
|
@@ -210,10 +263,12 @@ export class Reflector {
|
|
|
210
263
|
let out = text;
|
|
211
264
|
for (const pat of SECRET_PATTERNS) {
|
|
212
265
|
out = out.replace(pat, (match) => {
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
266
|
+
// BUG-013 — preserve the original separator so
|
|
267
|
+
// `auth_token = abc123` keeps its spacing: only the
|
|
268
|
+
// value is replaced.
|
|
269
|
+
const m = match.match(/^(.+?)(\s*[=:]\s*)(\S+)$/);
|
|
270
|
+
if (m) {
|
|
271
|
+
return `${m[1]}${m[2]}<redacted>`;
|
|
217
272
|
}
|
|
218
273
|
const parts = match.split(/\s+/);
|
|
219
274
|
return `${parts[0]} <redacted>`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Reflector.js","sourceRoot":"","sources":["../../plugin/Reflector.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,IAAI,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAErE,OAAO,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"Reflector.js","sourceRoot":"","sources":["../../plugin/Reflector.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,15 @@ const METRIC_KEY_LABELS = {
|
|
|
9
9
|
duplicate_suppressions: "Supresiones por dedup",
|
|
10
10
|
tool_calls_deduped: "Tool calls deduped",
|
|
11
11
|
patterns_mined: "Patrones minados",
|
|
12
|
+
// BUG-014 — v0.4.0 keys (K4-006/K4-008/K4-025) had no Spanish labels,
|
|
13
|
+
// so the "## Métricas" section printed raw keys for them.
|
|
14
|
+
injections_total: "Inyecciones totales",
|
|
15
|
+
injections_effective: "Inyecciones efectivas",
|
|
16
|
+
injections_ineffective: "Inyecciones ineficaces",
|
|
17
|
+
patterns_promoted_new: "Patrones promovidos (nuevos)",
|
|
18
|
+
patterns_causal: "Patrones causales",
|
|
19
|
+
causal_links: "Enlaces causales",
|
|
20
|
+
memories_superseded: "Memorias superadas",
|
|
12
21
|
};
|
|
13
22
|
function originLabel(origin) {
|
|
14
23
|
if (origin === "reflector")
|
|
@@ -84,7 +93,7 @@ export class Retrospective {
|
|
|
84
93
|
const fp = lesson.fingerprint;
|
|
85
94
|
const row = this.store
|
|
86
95
|
.prepare(`SELECT COUNT(*) AS c FROM tool_calls
|
|
87
|
-
WHERE fingerprint = ?
|
|
96
|
+
WHERE COALESCE(error_fingerprint, fingerprint) = ?
|
|
88
97
|
AND success = 0
|
|
89
98
|
AND (project_id IS ? OR (project_id IS NULL AND ? IS NULL))`)
|
|
90
99
|
.get(fp, lesson.project_id, lesson.project_id);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Retrospective.js","sourceRoot":"","sources":["../../plugin/Retrospective.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAkCnC,MAAM,iBAAiB,GAA2B;IACjD,0BAA0B,EAAE,gCAAgC;IAC5D,0BAA0B,EAAE,gCAAgC;IAC5D,qBAAqB,EAAE,uBAAuB;IAC9C,sBAAsB,EAAE,uBAAuB;IAC/C,kBAAkB,EAAE,oBAAoB;IACxC,cAAc,EAAE,kBAAkB;
|
|
1
|
+
{"version":3,"file":"Retrospective.js","sourceRoot":"","sources":["../../plugin/Retrospective.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,11 +2,16 @@ import { fingerprint as computeFingerprint } from "./fingerprint.js";
|
|
|
2
2
|
import { redactPaths, stripPrivate } from "./redact.js";
|
|
3
3
|
import { uuidv7 } from "./uuid.js";
|
|
4
4
|
const SECRET_PATTERNS = [
|
|
5
|
-
|
|
5
|
+
/\b(API_KEY|SECRET|PASSWORD|TOKEN)\b\s*[=:]\s*\S+/gi,
|
|
6
6
|
/\bBearer\s+\S+/gi,
|
|
7
|
-
|
|
7
|
+
// BUG-013 — the old `\btoken\s+\S+/gi` mangled harmless phrasing
|
|
8
|
+
// ("token budget", "token count", "max token limit") that LLM tools
|
|
9
|
+
// emit routinely. Narrowed to credential contexts: named token
|
|
10
|
+
// variables WITH an assignment, and `token=<value>` / `token:
|
|
11
|
+
// <value>` assignments.
|
|
12
|
+
/\b(access_?token|auth_?token|api_?token)\b\s*[=:]\s*\S+/gi,
|
|
13
|
+
/\btoken\s*[=:]\s*\S+/gi,
|
|
8
14
|
];
|
|
9
|
-
const SECRET_VALUE_PATTERN = /\s*=\s*\S+(.*)$/;
|
|
10
15
|
export class ToolCallObserver {
|
|
11
16
|
store;
|
|
12
17
|
startTs = new Map();
|
|
@@ -34,7 +39,7 @@ export class ToolCallObserver {
|
|
|
34
39
|
? this.inferErrorType(stderr, stdout, output.exitCode)
|
|
35
40
|
: null;
|
|
36
41
|
const metadata = JSON.stringify(this.redactArgs(input.args ?? {}));
|
|
37
|
-
const projectId = null;
|
|
42
|
+
const projectId = input.projectId ?? null;
|
|
38
43
|
const fp = computeFingerprint(`${input.tool}|${argsSummary}|${success}`, projectId ?? undefined);
|
|
39
44
|
if (this.isDedupEnabled()) {
|
|
40
45
|
const existing = this.store
|
|
@@ -70,10 +75,12 @@ export class ToolCallObserver {
|
|
|
70
75
|
let out = text;
|
|
71
76
|
for (const pat of SECRET_PATTERNS) {
|
|
72
77
|
out = out.replace(pat, (match) => {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
78
|
+
// BUG-013 — preserve the original separator so
|
|
79
|
+
// `auth_token = abc123` keeps its spacing: only the
|
|
80
|
+
// value is replaced.
|
|
81
|
+
const m = match.match(/^(.+?)(\s*[=:]\s*)(\S+)$/);
|
|
82
|
+
if (m) {
|
|
83
|
+
return `${m[1]}${m[2]}<redacted>`;
|
|
77
84
|
}
|
|
78
85
|
const parts = match.split(/\s+/);
|
|
79
86
|
return `${parts[0]} <redacted>`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolCallObserver.js","sourceRoot":"","sources":["../../plugin/ToolCallObserver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,IAAI,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAErE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"ToolCallObserver.js","sourceRoot":"","sources":["../../plugin/ToolCallObserver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const CONFIDENCE_MIN = 0.05;
|
|
2
|
+
export declare const CONFIDENCE_MAX = 0.95;
|
|
3
|
+
export declare const CONFIDENCE_BASE = 0.5;
|
|
4
|
+
export declare const EVIDENCE_STEP = 0.1;
|
|
5
|
+
export declare const RECURRENCE_PENALTY = 0.15;
|
|
6
|
+
export declare function computeConfidence(evidenceCount: number, recurrenceCount: number): number;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// v0.4.0 (K4-010) — shared two-sided confidence formula.
|
|
2
|
+
//
|
|
3
|
+
// Confidence is derived from both positive evidence (confirmed fixes) and
|
|
4
|
+
// negative evidence (recurrences): recurrence of the same fingerprint
|
|
5
|
+
// DEMOTES a pattern's confidence, so that a "causal pattern" with a
|
|
6
|
+
// history of recurring failures stops being presented as reliable.
|
|
7
|
+
//
|
|
8
|
+
// confidence = clamp(0.5 + 0.1 * evidenceCount - 0.15 * recurrenceCount, 0.05, 0.95)
|
|
9
|
+
//
|
|
10
|
+
// Used by `MemoryService.promoteToPattern`, `MemoryService.mapRow` and
|
|
11
|
+
// `kevin_why` — keep the formula here, never inline it again.
|
|
12
|
+
export const CONFIDENCE_MIN = 0.05;
|
|
13
|
+
export const CONFIDENCE_MAX = 0.95;
|
|
14
|
+
export const CONFIDENCE_BASE = 0.5;
|
|
15
|
+
export const EVIDENCE_STEP = 0.1;
|
|
16
|
+
export const RECURRENCE_PENALTY = 0.15;
|
|
17
|
+
export function computeConfidence(evidenceCount, recurrenceCount) {
|
|
18
|
+
const raw = CONFIDENCE_BASE +
|
|
19
|
+
EVIDENCE_STEP * evidenceCount -
|
|
20
|
+
RECURRENCE_PENALTY * recurrenceCount;
|
|
21
|
+
return Math.min(CONFIDENCE_MAX, Math.max(CONFIDENCE_MIN, raw));
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=confidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confidence.js","sourceRoot":"","sources":["../../plugin/confidence.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,EAAE;AACF,0EAA0E;AAC1E,sEAAsE;AACtE,oEAAoE;AACpE,mEAAmE;AACnE,EAAE;AACF,qFAAqF;AACrF,EAAE;AACF,uEAAuE;AACvE,8DAA8D;AAE9D,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AACnC,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AACnC,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAC;AACnC,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAC;AACjC,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEvC,MAAM,UAAU,iBAAiB,CAChC,aAAqB,EACrB,eAAuB;IAEvB,MAAM,GAAG,GACR,eAAe;QACf,aAAa,GAAG,aAAa;QAC7B,kBAAkB,GAAG,eAAe,CAAC;IACtC,OAAO,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC;AAChE,CAAC"}
|
package/dist/plugin/index.d.ts
CHANGED
|
@@ -5,5 +5,10 @@ export interface KevinPluginOptions {
|
|
|
5
5
|
retrospectivesDir?: string;
|
|
6
6
|
throttleMs?: number;
|
|
7
7
|
}
|
|
8
|
+
/**
|
|
9
|
+
* v0.4.0 (K4-021) — settings surfaced by `kevin_config` (plan §8.8).
|
|
10
|
+
* Unknown keys are rejected on `set` unless `strict: false`.
|
|
11
|
+
*/
|
|
12
|
+
export declare const KEVIN_CONFIG_KEYS: readonly ["quality_gate_enabled", "lesson_snippet_injection", "patternminer_enabled", "cross_project_enabled", "llm_reflection_enabled", "tool_calls_dedup_enabled"];
|
|
8
13
|
export declare const KevinPlugin: Plugin;
|
|
9
14
|
export default KevinPlugin;
|