@promptwheel/core 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/codebase-index/index.d.ts +23 -0
- package/dist/codebase-index/index.d.ts.map +1 -0
- package/dist/codebase-index/index.js +361 -0
- package/dist/codebase-index/index.js.map +1 -0
- package/dist/codebase-index/shared.d.ts +95 -0
- package/dist/codebase-index/shared.d.ts.map +1 -0
- package/dist/codebase-index/shared.js +319 -0
- package/dist/codebase-index/shared.js.map +1 -0
- package/dist/config/defaults.d.ts +45 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +79 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/critic/shared.d.ts +49 -0
- package/dist/critic/shared.d.ts.map +1 -0
- package/dist/critic/shared.js +204 -0
- package/dist/critic/shared.js.map +1 -0
- package/dist/db/adapter.d.ts +191 -0
- package/dist/db/adapter.d.ts.map +1 -0
- package/dist/db/adapter.js +40 -0
- package/dist/db/adapter.js.map +1 -0
- package/dist/db/contract.d.ts +47 -0
- package/dist/db/contract.d.ts.map +1 -0
- package/dist/db/contract.js +258 -0
- package/dist/db/contract.js.map +1 -0
- package/dist/db/index.d.ts +6 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +7 -0
- package/dist/db/index.js.map +1 -0
- package/dist/dedup/shared.d.ts +82 -0
- package/dist/dedup/shared.d.ts.map +1 -0
- package/dist/dedup/shared.js +215 -0
- package/dist/dedup/shared.js.map +1 -0
- package/dist/exec/index.d.ts +5 -0
- package/dist/exec/index.d.ts.map +1 -0
- package/dist/exec/index.js +5 -0
- package/dist/exec/index.js.map +1 -0
- package/dist/exec/types.d.ts +64 -0
- package/dist/exec/types.d.ts.map +1 -0
- package/dist/exec/types.js +8 -0
- package/dist/exec/types.js.map +1 -0
- package/dist/formulas/shared.d.ts +42 -0
- package/dist/formulas/shared.d.ts.map +1 -0
- package/dist/formulas/shared.js +204 -0
- package/dist/formulas/shared.js.map +1 -0
- package/dist/guidelines/shared.d.ts +46 -0
- package/dist/guidelines/shared.d.ts.map +1 -0
- package/dist/guidelines/shared.js +128 -0
- package/dist/guidelines/shared.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/learnings/shared.d.ts +112 -0
- package/dist/learnings/shared.d.ts.map +1 -0
- package/dist/learnings/shared.js +402 -0
- package/dist/learnings/shared.js.map +1 -0
- package/dist/proposals/shared.d.ts +137 -0
- package/dist/proposals/shared.d.ts.map +1 -0
- package/dist/proposals/shared.js +254 -0
- package/dist/proposals/shared.js.map +1 -0
- package/dist/repos/index.d.ts +15 -0
- package/dist/repos/index.d.ts.map +1 -0
- package/dist/repos/index.js +11 -0
- package/dist/repos/index.js.map +1 -0
- package/dist/repos/projects.d.ts +41 -0
- package/dist/repos/projects.d.ts.map +1 -0
- package/dist/repos/projects.js +75 -0
- package/dist/repos/projects.js.map +1 -0
- package/dist/repos/run_steps.d.ts +152 -0
- package/dist/repos/run_steps.d.ts.map +1 -0
- package/dist/repos/run_steps.js +328 -0
- package/dist/repos/run_steps.js.map +1 -0
- package/dist/repos/runs.d.ts +92 -0
- package/dist/repos/runs.d.ts.map +1 -0
- package/dist/repos/runs.js +185 -0
- package/dist/repos/runs.js.map +1 -0
- package/dist/repos/tickets.d.ts +71 -0
- package/dist/repos/tickets.d.ts.map +1 -0
- package/dist/repos/tickets.js +158 -0
- package/dist/repos/tickets.js.map +1 -0
- package/dist/scope/shared.d.ts +67 -0
- package/dist/scope/shared.d.ts.map +1 -0
- package/dist/scope/shared.js +355 -0
- package/dist/scope/shared.js.map +1 -0
- package/dist/scout/index.d.ts +18 -0
- package/dist/scout/index.d.ts.map +1 -0
- package/dist/scout/index.js +445 -0
- package/dist/scout/index.js.map +1 -0
- package/dist/scout/kimi-runner.d.ts +21 -0
- package/dist/scout/kimi-runner.d.ts.map +1 -0
- package/dist/scout/kimi-runner.js +76 -0
- package/dist/scout/kimi-runner.js.map +1 -0
- package/dist/scout/mcp-batch-server.d.ts +37 -0
- package/dist/scout/mcp-batch-server.d.ts.map +1 -0
- package/dist/scout/mcp-batch-server.js +144 -0
- package/dist/scout/mcp-batch-server.js.map +1 -0
- package/dist/scout/openai-local-runner.d.ts +20 -0
- package/dist/scout/openai-local-runner.d.ts.map +1 -0
- package/dist/scout/openai-local-runner.js +82 -0
- package/dist/scout/openai-local-runner.js.map +1 -0
- package/dist/scout/prompt.d.ts +49 -0
- package/dist/scout/prompt.d.ts.map +1 -0
- package/dist/scout/prompt.js +153 -0
- package/dist/scout/prompt.js.map +1 -0
- package/dist/scout/runner.d.ts +101 -0
- package/dist/scout/runner.d.ts.map +1 -0
- package/dist/scout/runner.js +521 -0
- package/dist/scout/runner.js.map +1 -0
- package/dist/scout/scanner.d.ts +61 -0
- package/dist/scout/scanner.d.ts.map +1 -0
- package/dist/scout/scanner.js +315 -0
- package/dist/scout/scanner.js.map +1 -0
- package/dist/scout/types.d.ts +221 -0
- package/dist/scout/types.d.ts.map +1 -0
- package/dist/scout/types.js +44 -0
- package/dist/scout/types.js.map +1 -0
- package/dist/sectors/shared.d.ts +146 -0
- package/dist/sectors/shared.d.ts.map +1 -0
- package/dist/sectors/shared.js +408 -0
- package/dist/sectors/shared.js.map +1 -0
- package/dist/services/index.d.ts +10 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +9 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/qa.d.ts +76 -0
- package/dist/services/qa.d.ts.map +1 -0
- package/dist/services/qa.js +228 -0
- package/dist/services/qa.js.map +1 -0
- package/dist/services/scout.d.ts +164 -0
- package/dist/services/scout.d.ts.map +1 -0
- package/dist/services/scout.js +215 -0
- package/dist/services/scout.js.map +1 -0
- package/dist/spindle/shared.d.ts +14 -0
- package/dist/spindle/shared.d.ts.map +1 -0
- package/dist/spindle/shared.js +65 -0
- package/dist/spindle/shared.js.map +1 -0
- package/dist/tools/shared.d.ts +35 -0
- package/dist/tools/shared.d.ts.map +1 -0
- package/dist/tools/shared.js +247 -0
- package/dist/tools/shared.js.map +1 -0
- package/dist/trace/shared.d.ts +147 -0
- package/dist/trace/shared.d.ts.map +1 -0
- package/dist/trace/shared.js +414 -0
- package/dist/trace/shared.js.map +1 -0
- package/dist/trajectory/shared.d.ts +69 -0
- package/dist/trajectory/shared.d.ts.map +1 -0
- package/dist/trajectory/shared.js +336 -0
- package/dist/trajectory/shared.js.map +1 -0
- package/dist/utils/id.d.ts +12 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js +24 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/utils/id.test.d.ts +5 -0
- package/dist/utils/id.test.d.ts.map +1 -0
- package/dist/utils/id.test.js +173 -0
- package/dist/utils/id.test.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/json.d.ts +9 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +19 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/waves/shared.d.ts +106 -0
- package/dist/waves/shared.d.ts.map +1 -0
- package/dist/waves/shared.js +356 -0
- package/dist/waves/shared.js.map +1 -0
- package/package.json +126 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure learnings algorithms — no filesystem, no database, no crypto.
|
|
3
|
+
*
|
|
4
|
+
* Shared by both @promptwheel/cli and @promptwheel/mcp.
|
|
5
|
+
* Callers handle file I/O (reading/writing learnings.json) and ID generation.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Structured knowledge attached to a learning.
|
|
9
|
+
* Optional — learnings without this field use text-only matching (backward compat).
|
|
10
|
+
*/
|
|
11
|
+
export interface StructuredKnowledge {
|
|
12
|
+
/** Files that must co-change together (learned from execution diffs) */
|
|
13
|
+
cochange_files?: string[];
|
|
14
|
+
/** Files with high failure rate when modified */
|
|
15
|
+
fragile_paths?: string[];
|
|
16
|
+
/** Root cause explanation for a failure */
|
|
17
|
+
root_cause?: string;
|
|
18
|
+
/** What type of knowledge this represents */
|
|
19
|
+
pattern_type?: 'dependency' | 'convention' | 'antipattern' | 'environment';
|
|
20
|
+
/** Glob scope this knowledge applies to */
|
|
21
|
+
applies_to?: string;
|
|
22
|
+
/** Failure context from QA/execution */
|
|
23
|
+
failure_context?: {
|
|
24
|
+
/** Which QA command failed */
|
|
25
|
+
command: string;
|
|
26
|
+
/** Normalized error signature (e.g. "TypeError: X is not a function") */
|
|
27
|
+
error_signature: string;
|
|
28
|
+
/** What fix was applied (populated on subsequent success) */
|
|
29
|
+
fix_applied?: string;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export interface Learning {
|
|
33
|
+
id: string;
|
|
34
|
+
text: string;
|
|
35
|
+
category: 'gotcha' | 'pattern' | 'warning' | 'context' | 'compaction';
|
|
36
|
+
source: {
|
|
37
|
+
type: 'qa_failure' | 'ticket_failure' | 'ticket_success' | 'review_downgrade' | 'plan_rejection' | 'scope_violation' | 'reviewer_feedback' | 'cross_sector_pattern' | 'process_insight' | 'manual';
|
|
38
|
+
detail?: string;
|
|
39
|
+
};
|
|
40
|
+
tags: string[];
|
|
41
|
+
weight: number;
|
|
42
|
+
created_at: string;
|
|
43
|
+
last_confirmed_at: string;
|
|
44
|
+
access_count: number;
|
|
45
|
+
/** Effectiveness tracking: times learning was applied */
|
|
46
|
+
applied_count?: number;
|
|
47
|
+
/** Effectiveness tracking: successful outcomes when applied */
|
|
48
|
+
success_count?: number;
|
|
49
|
+
/** Structured knowledge for richer retrieval and prompt injection */
|
|
50
|
+
structured?: StructuredKnowledge;
|
|
51
|
+
}
|
|
52
|
+
export declare const LEARNINGS_DEFAULTS: {
|
|
53
|
+
readonly DECAY_RATE: 3;
|
|
54
|
+
readonly DEFAULT_WEIGHT: 50;
|
|
55
|
+
readonly MAX_WEIGHT: 100;
|
|
56
|
+
readonly CONSOLIDATION_THRESHOLD: 50;
|
|
57
|
+
readonly SIMILARITY_MERGE_THRESHOLD: 0.7;
|
|
58
|
+
readonly CONFIRMATION_WINDOW_MS: number;
|
|
59
|
+
readonly DEFAULT_BUDGET: 2000;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Apply temporal decay to learnings, returning only entries with weight > 0.
|
|
63
|
+
* Access bonus halves decay; recent confirmation halves it again.
|
|
64
|
+
*/
|
|
65
|
+
export declare function applyLearningsDecay(learnings: Learning[], decayRate?: number, now?: number): Learning[];
|
|
66
|
+
/**
|
|
67
|
+
* Consolidate near-duplicate learnings (>70% text similarity).
|
|
68
|
+
* Keeps the higher weight entry, sums access counts.
|
|
69
|
+
* Returns null if no consolidation needed (below threshold or too aggressive).
|
|
70
|
+
*/
|
|
71
|
+
export declare function consolidateLearnings(learnings: Learning[]): Learning[] | null;
|
|
72
|
+
/**
|
|
73
|
+
* Format learnings for prompt injection.
|
|
74
|
+
* Sorts by weight descending, respects char budget.
|
|
75
|
+
* Includes structured knowledge annotations when available.
|
|
76
|
+
*/
|
|
77
|
+
export declare function formatLearningsForPrompt(learnings: Learning[], budget?: number): string;
|
|
78
|
+
/**
|
|
79
|
+
* Extract top keywords from text for fuzzy matching.
|
|
80
|
+
*/
|
|
81
|
+
export declare function extractKeywords(text: string): string[];
|
|
82
|
+
/**
|
|
83
|
+
* Extract tags from paths and commands for tag matching.
|
|
84
|
+
*/
|
|
85
|
+
export declare function extractTags(paths: string[], commands: string[]): string[];
|
|
86
|
+
/**
|
|
87
|
+
* Select learnings relevant to the current context.
|
|
88
|
+
* Scores by tag overlap × weight with enhanced relevance.
|
|
89
|
+
* Structured knowledge fields provide additional scoring signals.
|
|
90
|
+
* Returns scored and sorted learnings (highest relevance first).
|
|
91
|
+
*/
|
|
92
|
+
export declare function selectRelevant(learnings: Learning[], context: {
|
|
93
|
+
paths?: string[];
|
|
94
|
+
commands?: string[];
|
|
95
|
+
titleHint?: string;
|
|
96
|
+
}, opts?: {
|
|
97
|
+
maxResults?: number;
|
|
98
|
+
}, now?: number): Learning[];
|
|
99
|
+
export type AdaptiveRiskLevel = 'low' | 'normal' | 'elevated' | 'high';
|
|
100
|
+
export interface AdaptiveRiskAssessment {
|
|
101
|
+
level: AdaptiveRiskLevel;
|
|
102
|
+
score: number;
|
|
103
|
+
fragile_paths: string[];
|
|
104
|
+
known_issues: string[];
|
|
105
|
+
failure_count: number;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Assess adaptive risk for a ticket based on failure history in learnings.
|
|
109
|
+
* Only counts failure-sourced learnings with path overlap.
|
|
110
|
+
*/
|
|
111
|
+
export declare function assessAdaptiveRisk(learnings: Learning[], ticketPaths: string[]): AdaptiveRiskAssessment;
|
|
112
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/learnings/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure learnings algorithms — no filesystem, no database, no crypto.
|
|
3
|
+
*
|
|
4
|
+
* Shared by both @promptwheel/cli and @promptwheel/mcp.
|
|
5
|
+
* Callers handle file I/O (reading/writing learnings.json) and ID generation.
|
|
6
|
+
*/
|
|
7
|
+
import { bigramSimilarity } from '../dedup/shared.js';
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// Constants
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
export const LEARNINGS_DEFAULTS = {
|
|
12
|
+
DECAY_RATE: 3,
|
|
13
|
+
DEFAULT_WEIGHT: 50,
|
|
14
|
+
MAX_WEIGHT: 100,
|
|
15
|
+
CONSOLIDATION_THRESHOLD: 50,
|
|
16
|
+
SIMILARITY_MERGE_THRESHOLD: 0.7,
|
|
17
|
+
CONFIRMATION_WINDOW_MS: 7 * 24 * 60 * 60 * 1000, // 7 days
|
|
18
|
+
DEFAULT_BUDGET: 2000,
|
|
19
|
+
};
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// Decay (pure — operates on array, returns surviving entries)
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
/**
|
|
24
|
+
* Apply temporal decay to learnings, returning only entries with weight > 0.
|
|
25
|
+
* Access bonus halves decay; recent confirmation halves it again.
|
|
26
|
+
*/
|
|
27
|
+
export function applyLearningsDecay(learnings, decayRate = LEARNINGS_DEFAULTS.DECAY_RATE, now = Date.now()) {
|
|
28
|
+
const surviving = [];
|
|
29
|
+
for (const l of learnings) {
|
|
30
|
+
let decay = decayRate;
|
|
31
|
+
// Access bonus: halve decay if accessed
|
|
32
|
+
if (l.access_count > 0) {
|
|
33
|
+
decay /= 2;
|
|
34
|
+
}
|
|
35
|
+
// Confirmation bonus: halve again if confirmed within 7 days
|
|
36
|
+
const confirmedAt = new Date(l.last_confirmed_at).getTime();
|
|
37
|
+
if (now - confirmedAt < LEARNINGS_DEFAULTS.CONFIRMATION_WINDOW_MS) {
|
|
38
|
+
decay /= 2;
|
|
39
|
+
}
|
|
40
|
+
l.weight = Math.min(LEARNINGS_DEFAULTS.MAX_WEIGHT, l.weight - decay);
|
|
41
|
+
if (l.weight > 0) {
|
|
42
|
+
surviving.push(l);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return surviving;
|
|
46
|
+
}
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
// Consolidation (pure — merges near-duplicate learnings)
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
/**
|
|
51
|
+
* Consolidate near-duplicate learnings (>70% text similarity).
|
|
52
|
+
* Keeps the higher weight entry, sums access counts.
|
|
53
|
+
* Returns null if no consolidation needed (below threshold or too aggressive).
|
|
54
|
+
*/
|
|
55
|
+
export function consolidateLearnings(learnings) {
|
|
56
|
+
if (learnings.length <= LEARNINGS_DEFAULTS.CONSOLIDATION_THRESHOLD)
|
|
57
|
+
return null;
|
|
58
|
+
// Deep-clone entries so the original array is never mutated
|
|
59
|
+
const entries = learnings.map(l => ({
|
|
60
|
+
...l,
|
|
61
|
+
source: { ...l.source },
|
|
62
|
+
tags: [...l.tags],
|
|
63
|
+
structured: l.structured ? { ...l.structured } : undefined,
|
|
64
|
+
}));
|
|
65
|
+
const merged = new Set();
|
|
66
|
+
for (let i = 0; i < entries.length; i++) {
|
|
67
|
+
if (merged.has(i))
|
|
68
|
+
continue;
|
|
69
|
+
for (let j = i + 1; j < entries.length; j++) {
|
|
70
|
+
if (merged.has(j))
|
|
71
|
+
continue;
|
|
72
|
+
if (bigramSimilarity(entries[i].text, entries[j].text) >= LEARNINGS_DEFAULTS.SIMILARITY_MERGE_THRESHOLD) {
|
|
73
|
+
// Guard: don't merge across different categories
|
|
74
|
+
if (entries[i].category !== entries[j].category)
|
|
75
|
+
continue;
|
|
76
|
+
// Guard: don't merge across different source types
|
|
77
|
+
if (entries[i].source.type !== entries[j].source.type)
|
|
78
|
+
continue;
|
|
79
|
+
// Guard: don't merge different failure types
|
|
80
|
+
const ftI = entries[i].tags.find(t => t.startsWith('failureType:'));
|
|
81
|
+
const ftJ = entries[j].tags.find(t => t.startsWith('failureType:'));
|
|
82
|
+
if (ftI && ftJ && ftI !== ftJ)
|
|
83
|
+
continue;
|
|
84
|
+
// Guard: don't merge frequently accessed learnings
|
|
85
|
+
if (entries[i].access_count >= 3 || entries[j].access_count >= 3)
|
|
86
|
+
continue;
|
|
87
|
+
// Merge j into i (keep higher weight)
|
|
88
|
+
if (entries[j].weight > entries[i].weight) {
|
|
89
|
+
entries[i].weight = entries[j].weight;
|
|
90
|
+
entries[i].text = entries[j].text;
|
|
91
|
+
}
|
|
92
|
+
entries[i].access_count += entries[j].access_count;
|
|
93
|
+
// Merge tags
|
|
94
|
+
const tagSet = new Set([...entries[i].tags, ...entries[j].tags]);
|
|
95
|
+
entries[i].tags = [...tagSet];
|
|
96
|
+
// Merge structured knowledge (union cochange_files and fragile_paths, keep winner's other fields)
|
|
97
|
+
if (entries[i].structured || entries[j].structured) {
|
|
98
|
+
const si = entries[i].structured ?? {};
|
|
99
|
+
const sj = entries[j].structured ?? {};
|
|
100
|
+
entries[i].structured = {
|
|
101
|
+
...si,
|
|
102
|
+
cochange_files: si.cochange_files || sj.cochange_files
|
|
103
|
+
? [...new Set([...(si.cochange_files ?? []), ...(sj.cochange_files ?? [])])]
|
|
104
|
+
: undefined,
|
|
105
|
+
fragile_paths: si.fragile_paths || sj.fragile_paths
|
|
106
|
+
? [...new Set([...(si.fragile_paths ?? []), ...(sj.fragile_paths ?? [])])]
|
|
107
|
+
: undefined,
|
|
108
|
+
// Keep winner's root_cause (already set by weight comparison above)
|
|
109
|
+
root_cause: si.root_cause ?? sj.root_cause,
|
|
110
|
+
failure_context: si.failure_context ?? sj.failure_context,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
// Preserve most recent confirmation date for decay calculations
|
|
114
|
+
if (new Date(entries[j].last_confirmed_at).getTime() > new Date(entries[i].last_confirmed_at).getTime()) {
|
|
115
|
+
entries[i].last_confirmed_at = entries[j].last_confirmed_at;
|
|
116
|
+
}
|
|
117
|
+
merged.add(j);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
const result = entries.filter((_, idx) => !merged.has(idx));
|
|
122
|
+
// Guard: if consolidation was too aggressive, skip
|
|
123
|
+
if (result.length < Math.ceil(LEARNINGS_DEFAULTS.CONSOLIDATION_THRESHOLD * 0.4))
|
|
124
|
+
return null;
|
|
125
|
+
return result;
|
|
126
|
+
}
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
// Prompt formatting (pure)
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
/**
|
|
131
|
+
* Format a single structured knowledge block as an inline annotation.
|
|
132
|
+
* Returns empty string if no actionable structured data.
|
|
133
|
+
*/
|
|
134
|
+
function formatStructuredAnnotation(sk) {
|
|
135
|
+
const parts = [];
|
|
136
|
+
if (sk.cochange_files && sk.cochange_files.length > 0) {
|
|
137
|
+
parts.push(`Co-change: ${sk.cochange_files.join(', ')}`);
|
|
138
|
+
}
|
|
139
|
+
if (sk.fragile_paths && sk.fragile_paths.length > 0) {
|
|
140
|
+
parts.push(`Fragile: ${sk.fragile_paths.join(', ')}`);
|
|
141
|
+
}
|
|
142
|
+
if (sk.root_cause) {
|
|
143
|
+
parts.push(`Cause: ${sk.root_cause}`);
|
|
144
|
+
}
|
|
145
|
+
if (sk.failure_context?.error_signature) {
|
|
146
|
+
parts.push(`Error: ${sk.failure_context.error_signature}`);
|
|
147
|
+
}
|
|
148
|
+
if (sk.failure_context?.fix_applied) {
|
|
149
|
+
parts.push(`Fix: ${sk.failure_context.fix_applied}`);
|
|
150
|
+
}
|
|
151
|
+
if (parts.length === 0)
|
|
152
|
+
return '';
|
|
153
|
+
return ` → ${parts.join(' | ')}`;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Format learnings for prompt injection.
|
|
157
|
+
* Sorts by weight descending, respects char budget.
|
|
158
|
+
* Includes structured knowledge annotations when available.
|
|
159
|
+
*/
|
|
160
|
+
export function formatLearningsForPrompt(learnings, budget = LEARNINGS_DEFAULTS.DEFAULT_BUDGET) {
|
|
161
|
+
if (learnings.length === 0)
|
|
162
|
+
return '';
|
|
163
|
+
const sorted = [...learnings].sort((a, b) => b.weight - a.weight);
|
|
164
|
+
const lines = [];
|
|
165
|
+
let charCount = 0;
|
|
166
|
+
const header = '<project-learnings>\n## Learnings from Previous Runs\n';
|
|
167
|
+
const footer = '\n</project-learnings>';
|
|
168
|
+
charCount += header.length + footer.length;
|
|
169
|
+
for (const l of sorted) {
|
|
170
|
+
const tag = l.category.toUpperCase();
|
|
171
|
+
let line = `- [${tag}] ${l.text} (w:${Math.round(l.weight)})`;
|
|
172
|
+
// Append structured annotation if present and budget allows
|
|
173
|
+
if (l.structured) {
|
|
174
|
+
const annotation = formatStructuredAnnotation(l.structured);
|
|
175
|
+
if (annotation) {
|
|
176
|
+
line += '\n' + annotation;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (charCount + line.length + 1 > budget)
|
|
180
|
+
break;
|
|
181
|
+
lines.push(line);
|
|
182
|
+
charCount += line.length + 1;
|
|
183
|
+
}
|
|
184
|
+
if (lines.length === 0)
|
|
185
|
+
return '';
|
|
186
|
+
return header + lines.join('\n') + footer;
|
|
187
|
+
}
|
|
188
|
+
// ---------------------------------------------------------------------------
|
|
189
|
+
// Keyword extraction and relevance scoring (pure)
|
|
190
|
+
// ---------------------------------------------------------------------------
|
|
191
|
+
const STOPWORDS = new Set([
|
|
192
|
+
'the', 'and', 'for', 'that', 'this', 'with', 'from', 'are', 'was', 'were',
|
|
193
|
+
'been', 'have', 'has', 'had', 'not', 'but', 'all', 'can', 'her', 'his',
|
|
194
|
+
'its', 'may', 'new', 'now', 'old', 'see', 'way', 'who', 'did', 'get',
|
|
195
|
+
'let', 'say', 'she', 'too', 'use', 'add', 'fix', 'run', 'set', 'try',
|
|
196
|
+
'import', 'export', 'function', 'const', 'return', 'type', 'interface',
|
|
197
|
+
'class', 'async', 'await', 'string', 'number', 'boolean', 'null', 'undefined',
|
|
198
|
+
'file', 'files', 'code', 'should', 'would', 'could',
|
|
199
|
+
]);
|
|
200
|
+
/**
|
|
201
|
+
* Extract top keywords from text for fuzzy matching.
|
|
202
|
+
*/
|
|
203
|
+
export function extractKeywords(text) {
|
|
204
|
+
const words = text
|
|
205
|
+
.toLowerCase()
|
|
206
|
+
.replace(/[^a-z0-9\s]/g, '')
|
|
207
|
+
.split(/\s+/)
|
|
208
|
+
.filter(w => w.length > 2 && !STOPWORDS.has(w));
|
|
209
|
+
const unique = [...new Set(words)];
|
|
210
|
+
// Sort by length descending (longer words are more specific)
|
|
211
|
+
unique.sort((a, b) => b.length - a.length);
|
|
212
|
+
return unique.slice(0, 5);
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Extract tags from paths and commands for tag matching.
|
|
216
|
+
*/
|
|
217
|
+
export function extractTags(paths, commands) {
|
|
218
|
+
const tags = [];
|
|
219
|
+
for (const p of paths) {
|
|
220
|
+
// Normalize: strip trailing globs
|
|
221
|
+
const clean = p.replace(/\/?\*\*?$/, '');
|
|
222
|
+
if (clean)
|
|
223
|
+
tags.push(`path:${clean}`);
|
|
224
|
+
}
|
|
225
|
+
for (const c of commands) {
|
|
226
|
+
tags.push(`cmd:${c}`);
|
|
227
|
+
}
|
|
228
|
+
return tags;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Select learnings relevant to the current context.
|
|
232
|
+
* Scores by tag overlap × weight with enhanced relevance.
|
|
233
|
+
* Structured knowledge fields provide additional scoring signals.
|
|
234
|
+
* Returns scored and sorted learnings (highest relevance first).
|
|
235
|
+
*/
|
|
236
|
+
export function selectRelevant(learnings, context, opts, now = Date.now()) {
|
|
237
|
+
const contextTags = extractTags(context.paths ?? [], context.commands ?? []);
|
|
238
|
+
if (contextTags.length === 0)
|
|
239
|
+
return learnings;
|
|
240
|
+
const contextPathTags = contextTags.filter(t => t.startsWith('path:'));
|
|
241
|
+
const contextCmdTags = new Set(contextTags.filter(t => t.startsWith('cmd:')));
|
|
242
|
+
const contextPaths = (context.paths ?? []).map(p => p.replace(/\/?\*\*?$/, ''));
|
|
243
|
+
const hasCommands = (context.commands?.length ?? 0) > 0;
|
|
244
|
+
const scored = learnings.map(l => {
|
|
245
|
+
let tagScore = 0;
|
|
246
|
+
// Standard tag matching
|
|
247
|
+
for (const t of l.tags) {
|
|
248
|
+
if (t.startsWith('path:')) {
|
|
249
|
+
const lPath = t.slice(5);
|
|
250
|
+
if (contextPathTags.some(ct => ct.slice(5) === lPath)) {
|
|
251
|
+
tagScore += 30;
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
if (contextPathTags.some(ct => ct.slice(5).startsWith(lPath + '/') || lPath.startsWith(ct.slice(5) + '/'))) {
|
|
255
|
+
tagScore += 15;
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
else if (t.startsWith('cmd:') && contextCmdTags.has(t)) {
|
|
260
|
+
tagScore += 10;
|
|
261
|
+
}
|
|
262
|
+
else if (t.startsWith('failureType:') && contextCmdTags.size > 0) {
|
|
263
|
+
tagScore += 5;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
// Structured knowledge scoring
|
|
267
|
+
if (l.structured) {
|
|
268
|
+
const sk = l.structured;
|
|
269
|
+
// Cochange files: if any cochange file overlaps with context paths, strong signal
|
|
270
|
+
if (sk.cochange_files && sk.cochange_files.length > 0) {
|
|
271
|
+
for (const cf of sk.cochange_files) {
|
|
272
|
+
if (contextPaths.some(cp => cf.startsWith(cp + '/') || cf === cp || cp.startsWith(cf + '/'))) {
|
|
273
|
+
tagScore += 20;
|
|
274
|
+
break; // one match is enough
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
// Fragile paths: if context touches a known fragile path, boost
|
|
279
|
+
if (sk.fragile_paths && sk.fragile_paths.length > 0) {
|
|
280
|
+
for (const fp of sk.fragile_paths) {
|
|
281
|
+
if (contextPaths.some(cp => fp.startsWith(cp + '/') || fp === cp || cp.startsWith(fp + '/'))) {
|
|
282
|
+
tagScore += 15;
|
|
283
|
+
break;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
// Error signature: if context has the same failing command, boost
|
|
288
|
+
if (sk.failure_context?.command && contextCmdTags.has(`cmd:${sk.failure_context.command}`)) {
|
|
289
|
+
tagScore += 12;
|
|
290
|
+
}
|
|
291
|
+
// Pattern type bonuses: antipatterns and dependencies are high-value
|
|
292
|
+
if (sk.pattern_type === 'antipattern')
|
|
293
|
+
tagScore += 5;
|
|
294
|
+
if (sk.pattern_type === 'dependency')
|
|
295
|
+
tagScore += 5;
|
|
296
|
+
}
|
|
297
|
+
if (context.titleHint) {
|
|
298
|
+
const hintLower = context.titleHint.toLowerCase();
|
|
299
|
+
for (const kw of extractKeywords(l.text)) {
|
|
300
|
+
if (hintLower.includes(kw))
|
|
301
|
+
tagScore += 3;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
if (l.category === 'gotcha' && hasCommands)
|
|
305
|
+
tagScore += 10;
|
|
306
|
+
if (l.last_confirmed_at) {
|
|
307
|
+
const age = now - new Date(l.last_confirmed_at).getTime();
|
|
308
|
+
if (age < 3 * 24 * 60 * 60 * 1000)
|
|
309
|
+
tagScore += 5;
|
|
310
|
+
}
|
|
311
|
+
return { learning: l, score: tagScore + l.weight };
|
|
312
|
+
});
|
|
313
|
+
scored.sort((a, b) => b.score - a.score);
|
|
314
|
+
const max = opts?.maxResults ?? 15;
|
|
315
|
+
return scored.slice(0, max).map(s => s.learning);
|
|
316
|
+
}
|
|
317
|
+
/** Failure-sourced learning types that indicate risk. */
|
|
318
|
+
const FAILURE_SOURCES = new Set([
|
|
319
|
+
'qa_failure', 'ticket_failure', 'scope_violation', 'plan_rejection',
|
|
320
|
+
]);
|
|
321
|
+
/** Compaction-sourced learnings that indicate context pressure. */
|
|
322
|
+
const COMPACTION_CATEGORY = 'compaction';
|
|
323
|
+
/**
|
|
324
|
+
* Assess adaptive risk for a ticket based on failure history in learnings.
|
|
325
|
+
* Only counts failure-sourced learnings with path overlap.
|
|
326
|
+
*/
|
|
327
|
+
export function assessAdaptiveRisk(learnings, ticketPaths) {
|
|
328
|
+
const pathSet = new Set(ticketPaths.map(p => p.replace(/\/?\*\*?$/, '')));
|
|
329
|
+
let score = 0;
|
|
330
|
+
let failureCount = 0;
|
|
331
|
+
const fragilePaths = new Set();
|
|
332
|
+
const knownIssues = [];
|
|
333
|
+
for (const l of learnings) {
|
|
334
|
+
// Check compaction-sourced learnings — these indicate context pressure
|
|
335
|
+
if (l.category === COMPACTION_CATEGORY) {
|
|
336
|
+
// Check path overlap for compaction learnings
|
|
337
|
+
let compactionOverlap = false;
|
|
338
|
+
for (const tag of l.tags) {
|
|
339
|
+
if (tag.startsWith('path:')) {
|
|
340
|
+
const lPath = tag.slice(5);
|
|
341
|
+
if (pathSet.has(lPath) || [...pathSet].some(p => lPath.startsWith(p + '/') || p.startsWith(lPath + '/'))) {
|
|
342
|
+
compactionOverlap = true;
|
|
343
|
+
break;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
if (compactionOverlap) {
|
|
348
|
+
score += 12 * (l.weight / 50);
|
|
349
|
+
if (knownIssues.length < 5) {
|
|
350
|
+
knownIssues.push(l.text.slice(0, 150));
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
continue;
|
|
354
|
+
}
|
|
355
|
+
// Only count failure-sourced learnings
|
|
356
|
+
if (!FAILURE_SOURCES.has(l.source.type))
|
|
357
|
+
continue;
|
|
358
|
+
// Check path overlap via tags
|
|
359
|
+
let hasOverlap = false;
|
|
360
|
+
for (const tag of l.tags) {
|
|
361
|
+
if (tag.startsWith('path:')) {
|
|
362
|
+
const lPath = tag.slice(5);
|
|
363
|
+
if (pathSet.has(lPath) || [...pathSet].some(p => lPath.startsWith(p + '/') || p.startsWith(lPath + '/'))) {
|
|
364
|
+
hasOverlap = true;
|
|
365
|
+
break;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
if (!hasOverlap)
|
|
370
|
+
continue;
|
|
371
|
+
failureCount++;
|
|
372
|
+
score += 10 * (l.weight / 50);
|
|
373
|
+
// Collect fragile paths
|
|
374
|
+
if (l.structured?.fragile_paths) {
|
|
375
|
+
for (const fp of l.structured.fragile_paths) {
|
|
376
|
+
fragilePaths.add(fp);
|
|
377
|
+
}
|
|
378
|
+
score += 8 * (l.weight / 50);
|
|
379
|
+
}
|
|
380
|
+
// Collect antipattern bonus
|
|
381
|
+
if (l.structured?.pattern_type === 'antipattern') {
|
|
382
|
+
score += 5 * (l.weight / 50);
|
|
383
|
+
}
|
|
384
|
+
// Collect known issues (up to 5)
|
|
385
|
+
if (knownIssues.length < 5) {
|
|
386
|
+
knownIssues.push(l.text.slice(0, 150));
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
score = Math.min(100, score);
|
|
390
|
+
const level = score < 10 ? 'low' :
|
|
391
|
+
score < 30 ? 'normal' :
|
|
392
|
+
score < 60 ? 'elevated' :
|
|
393
|
+
'high';
|
|
394
|
+
return {
|
|
395
|
+
level,
|
|
396
|
+
score,
|
|
397
|
+
fragile_paths: [...fragilePaths],
|
|
398
|
+
known_issues: knownIssues,
|
|
399
|
+
failure_count: failureCount,
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/learnings/shared.ts"],"names":[],"mappings":"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"}
|