@codeledger/engine 0.7.2 → 0.7.5
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/broker/completion.d.ts +9 -0
- package/dist/broker/completion.d.ts.map +1 -0
- package/dist/broker/completion.js +51 -0
- package/dist/broker/completion.js.map +1 -0
- package/dist/broker/evidence.d.ts +11 -0
- package/dist/broker/evidence.d.ts.map +1 -0
- package/dist/broker/evidence.js +39 -0
- package/dist/broker/evidence.js.map +1 -0
- package/dist/broker/index.d.ts +14 -0
- package/dist/broker/index.d.ts.map +1 -0
- package/dist/broker/index.js +14 -0
- package/dist/broker/index.js.map +1 -0
- package/dist/broker/memory-lookup.d.ts +41 -0
- package/dist/broker/memory-lookup.d.ts.map +1 -0
- package/dist/broker/memory-lookup.js +70 -0
- package/dist/broker/memory-lookup.js.map +1 -0
- package/dist/broker/preamble.d.ts +19 -0
- package/dist/broker/preamble.d.ts.map +1 -0
- package/dist/broker/preamble.js +13 -0
- package/dist/broker/preamble.js.map +1 -0
- package/dist/broker/structural.d.ts +10 -0
- package/dist/broker/structural.d.ts.map +1 -0
- package/dist/broker/structural.js +52 -0
- package/dist/broker/structural.js.map +1 -0
- package/dist/broker/task-resolution.d.ts +17 -0
- package/dist/broker/task-resolution.d.ts.map +1 -0
- package/dist/broker/task-resolution.js +386 -0
- package/dist/broker/task-resolution.js.map +1 -0
- package/dist/broker/validation.d.ts +14 -0
- package/dist/broker/validation.d.ts.map +1 -0
- package/dist/broker/validation.js +75 -0
- package/dist/broker/validation.js.map +1 -0
- package/dist/claims/claims.d.ts +14 -0
- package/dist/claims/claims.d.ts.map +1 -0
- package/dist/claims/claims.js +125 -0
- package/dist/claims/claims.js.map +1 -0
- package/dist/claims/index.d.ts +2 -0
- package/dist/claims/index.d.ts.map +1 -0
- package/dist/claims/index.js +2 -0
- package/dist/claims/index.js.map +1 -0
- package/dist/dashboard/index.d.ts +3 -0
- package/dist/dashboard/index.d.ts.map +1 -0
- package/dist/dashboard/index.js +3 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/dashboard/metrics.d.ts +24 -0
- package/dist/dashboard/metrics.d.ts.map +1 -0
- package/dist/dashboard/metrics.js +358 -0
- package/dist/dashboard/metrics.js.map +1 -0
- package/dist/dashboard/store.d.ts +26 -0
- package/dist/dashboard/store.d.ts.map +1 -0
- package/dist/dashboard/store.js +97 -0
- package/dist/dashboard/store.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -1
- package/dist/insight/collector.d.ts +31 -0
- package/dist/insight/collector.d.ts.map +1 -0
- package/dist/insight/collector.js +172 -0
- package/dist/insight/collector.js.map +1 -0
- package/dist/insight/engine.d.ts +18 -0
- package/dist/insight/engine.d.ts.map +1 -0
- package/dist/insight/engine.js +84 -0
- package/dist/insight/engine.js.map +1 -0
- package/dist/insight/formatter.d.ts +9 -0
- package/dist/insight/formatter.d.ts.map +1 -0
- package/dist/insight/formatter.js +87 -0
- package/dist/insight/formatter.js.map +1 -0
- package/dist/insight/index.d.ts +13 -0
- package/dist/insight/index.d.ts.map +1 -0
- package/dist/insight/index.js +11 -0
- package/dist/insight/index.js.map +1 -0
- package/dist/insight/session.d.ts +11 -0
- package/dist/insight/session.d.ts.map +1 -0
- package/dist/insight/session.js +60 -0
- package/dist/insight/session.js.map +1 -0
- package/dist/integration/ambient-coordinator.d.ts +75 -0
- package/dist/integration/ambient-coordinator.d.ts.map +1 -0
- package/dist/integration/ambient-coordinator.js +183 -0
- package/dist/integration/ambient-coordinator.js.map +1 -0
- package/dist/integration/index.d.ts +4 -0
- package/dist/integration/index.d.ts.map +1 -0
- package/dist/integration/index.js +3 -0
- package/dist/integration/index.js.map +1 -0
- package/dist/integration/warning-throttle.d.ts +63 -0
- package/dist/integration/warning-throttle.d.ts.map +1 -0
- package/dist/integration/warning-throttle.js +347 -0
- package/dist/integration/warning-throttle.js.map +1 -0
- package/dist/intervention/escalation.d.ts +23 -0
- package/dist/intervention/escalation.d.ts.map +1 -0
- package/dist/intervention/escalation.js +149 -0
- package/dist/intervention/escalation.js.map +1 -0
- package/dist/intervention/generator.d.ts +12 -0
- package/dist/intervention/generator.d.ts.map +1 -0
- package/dist/intervention/generator.js +191 -0
- package/dist/intervention/generator.js.map +1 -0
- package/dist/intervention/index.d.ts +4 -0
- package/dist/intervention/index.d.ts.map +1 -0
- package/dist/intervention/index.js +4 -0
- package/dist/intervention/index.js.map +1 -0
- package/dist/intervention/signal-aggregator.d.ts +26 -0
- package/dist/intervention/signal-aggregator.d.ts.map +1 -0
- package/dist/intervention/signal-aggregator.js +274 -0
- package/dist/intervention/signal-aggregator.js.map +1 -0
- package/dist/layer-d/conflict-detector.d.ts +12 -0
- package/dist/layer-d/conflict-detector.d.ts.map +1 -0
- package/dist/layer-d/conflict-detector.js +150 -0
- package/dist/layer-d/conflict-detector.js.map +1 -0
- package/dist/layer-d/index.d.ts +3 -0
- package/dist/layer-d/index.d.ts.map +1 -0
- package/dist/layer-d/index.js +3 -0
- package/dist/layer-d/index.js.map +1 -0
- package/dist/layer-d/surface-extractor.d.ts +10 -0
- package/dist/layer-d/surface-extractor.d.ts.map +1 -0
- package/dist/layer-d/surface-extractor.js +96 -0
- package/dist/layer-d/surface-extractor.js.map +1 -0
- package/dist/policy-domains/domains.d.ts +31 -0
- package/dist/policy-domains/domains.d.ts.map +1 -0
- package/dist/policy-domains/domains.js +445 -0
- package/dist/policy-domains/domains.js.map +1 -0
- package/dist/policy-domains/index.d.ts +8 -0
- package/dist/policy-domains/index.d.ts.map +1 -0
- package/dist/policy-domains/index.js +8 -0
- package/dist/policy-domains/index.js.map +1 -0
- package/dist/pulse/index.d.ts +2 -0
- package/dist/pulse/index.d.ts.map +1 -0
- package/dist/pulse/index.js +2 -0
- package/dist/pulse/index.js.map +1 -0
- package/dist/pulse/pulse.d.ts +20 -0
- package/dist/pulse/pulse.d.ts.map +1 -0
- package/dist/pulse/pulse.js +253 -0
- package/dist/pulse/pulse.js.map +1 -0
- package/dist/severity/index.d.ts +2 -0
- package/dist/severity/index.d.ts.map +1 -0
- package/dist/severity/index.js +2 -0
- package/dist/severity/index.js.map +1 -0
- package/dist/severity/severity.d.ts +48 -0
- package/dist/severity/severity.d.ts.map +1 -0
- package/dist/severity/severity.js +134 -0
- package/dist/severity/severity.js.map +1 -0
- package/dist/staleness/index.d.ts +2 -0
- package/dist/staleness/index.d.ts.map +1 -0
- package/dist/staleness/index.js +2 -0
- package/dist/staleness/index.js.map +1 -0
- package/dist/staleness/jit-staleness.d.ts +29 -0
- package/dist/staleness/jit-staleness.d.ts.map +1 -0
- package/dist/staleness/jit-staleness.js +240 -0
- package/dist/staleness/jit-staleness.js.map +1 -0
- package/dist/team-policy/index.d.ts +1 -1
- package/dist/team-policy/index.d.ts.map +1 -1
- package/dist/team-policy/index.js +1 -1
- package/dist/team-policy/index.js.map +1 -1
- package/dist/team-policy/policy.d.ts +7 -0
- package/dist/team-policy/policy.d.ts.map +1 -1
- package/dist/team-policy/policy.js +38 -0
- package/dist/team-policy/policy.js.map +1 -1
- package/dist/trust/approval.d.ts +16 -0
- package/dist/trust/approval.d.ts.map +1 -0
- package/dist/trust/approval.js +183 -0
- package/dist/trust/approval.js.map +1 -0
- package/dist/trust/capsule.d.ts +36 -0
- package/dist/trust/capsule.d.ts.map +1 -0
- package/dist/trust/capsule.js +206 -0
- package/dist/trust/capsule.js.map +1 -0
- package/dist/trust/index.d.ts +6 -0
- package/dist/trust/index.d.ts.map +1 -0
- package/dist/trust/index.js +6 -0
- package/dist/trust/index.js.map +1 -0
- package/dist/trust/learning-feedback.d.ts +18 -0
- package/dist/trust/learning-feedback.d.ts.map +1 -0
- package/dist/trust/learning-feedback.js +146 -0
- package/dist/trust/learning-feedback.js.map +1 -0
- package/dist/trust/risk-scoring.d.ts +16 -0
- package/dist/trust/risk-scoring.d.ts.map +1 -0
- package/dist/trust/risk-scoring.js +142 -0
- package/dist/trust/risk-scoring.js.map +1 -0
- package/dist/trust/timeline.d.ts +42 -0
- package/dist/trust/timeline.d.ts.map +1 -0
- package/dist/trust/timeline.js +154 -0
- package/dist/trust/timeline.js.map +1 -0
- package/package.json +10 -2
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pulse — Ambient Session Discovery Engine
|
|
3
|
+
*
|
|
4
|
+
* Detects active work and infers sessions from file-system changes
|
|
5
|
+
* without requiring explicit CLI invocation.
|
|
6
|
+
*
|
|
7
|
+
* Phase 1: File-system based detection
|
|
8
|
+
* Phase 2: LSP enrichment (extension points only)
|
|
9
|
+
*/
|
|
10
|
+
import { createHash } from 'node:crypto';
|
|
11
|
+
import { execSync } from 'node:child_process';
|
|
12
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
|
|
13
|
+
import { join, dirname, sep } from 'node:path';
|
|
14
|
+
const PULSE_STATE_FILE = '.codeledger/pulse.json';
|
|
15
|
+
const MAX_RECENT_EVENTS = 500;
|
|
16
|
+
const CLUSTER_WINDOW_MS = 30 * 60 * 1000; // 30 minutes
|
|
17
|
+
const MODULE_DEPTH = 2; // infer modules from first N path segments
|
|
18
|
+
// ─── Working Set Clustering ────────────────────────────────────────────────
|
|
19
|
+
/** Cluster file events by time proximity into working sets */
|
|
20
|
+
export function clusterEvents(events) {
|
|
21
|
+
if (events.length === 0)
|
|
22
|
+
return [];
|
|
23
|
+
const sorted = [...events].sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
|
|
24
|
+
const clusters = [];
|
|
25
|
+
let current = [sorted[0]];
|
|
26
|
+
for (let i = 1; i < sorted.length; i++) {
|
|
27
|
+
const prev = new Date(sorted[i - 1].timestamp).getTime();
|
|
28
|
+
const curr = new Date(sorted[i].timestamp).getTime();
|
|
29
|
+
if (curr - prev > CLUSTER_WINDOW_MS) {
|
|
30
|
+
clusters.push(buildWorkingSet(current));
|
|
31
|
+
current = [sorted[i]];
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
current.push(sorted[i]);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (current.length > 0) {
|
|
38
|
+
clusters.push(buildWorkingSet(current));
|
|
39
|
+
}
|
|
40
|
+
return clusters;
|
|
41
|
+
}
|
|
42
|
+
function buildWorkingSet(events) {
|
|
43
|
+
const files = [...new Set(events.map(e => e.path))];
|
|
44
|
+
const modules = inferModules(files);
|
|
45
|
+
const timestamps = events.map(e => new Date(e.timestamp).getTime());
|
|
46
|
+
return {
|
|
47
|
+
files,
|
|
48
|
+
modules,
|
|
49
|
+
first_change: new Date(Math.min(...timestamps)).toISOString(),
|
|
50
|
+
last_change: new Date(Math.max(...timestamps)).toISOString(),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
// ─── Module Inference ──────────────────────────────────────────────────────
|
|
54
|
+
/** Infer module names from file paths (first N directory segments) */
|
|
55
|
+
export function inferModules(files) {
|
|
56
|
+
const moduleSet = new Set();
|
|
57
|
+
for (const f of files) {
|
|
58
|
+
const parts = f.split(sep).filter(Boolean);
|
|
59
|
+
if (parts.length >= MODULE_DEPTH) {
|
|
60
|
+
moduleSet.add(parts.slice(0, MODULE_DEPTH).join('/'));
|
|
61
|
+
}
|
|
62
|
+
else if (parts.length > 0 && parts[0] !== undefined) {
|
|
63
|
+
moduleSet.add(parts[0]);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return [...moduleSet].sort();
|
|
67
|
+
}
|
|
68
|
+
// ─── Intent Inference ──────────────────────────────────────────────────────
|
|
69
|
+
/** Module-to-domain keyword map for intent inference */
|
|
70
|
+
const DOMAIN_KEYWORDS = {
|
|
71
|
+
auth: ['authentication', 'authorization', 'login', 'session'],
|
|
72
|
+
api: ['endpoint', 'route', 'handler', 'controller'],
|
|
73
|
+
db: ['database', 'migration', 'schema', 'model'],
|
|
74
|
+
test: ['testing', 'spec', 'fixture'],
|
|
75
|
+
ui: ['component', 'view', 'page', 'layout'],
|
|
76
|
+
config: ['configuration', 'settings', 'environment'],
|
|
77
|
+
docs: ['documentation', 'readme'],
|
|
78
|
+
};
|
|
79
|
+
/** Infer a candidate intent label from file paths and module boundaries */
|
|
80
|
+
export function inferIntent(files) {
|
|
81
|
+
const modules = inferModules(files);
|
|
82
|
+
const allParts = files.flatMap(f => f.split(sep).filter(Boolean));
|
|
83
|
+
// Check for domain keyword matches
|
|
84
|
+
const domainHits = [];
|
|
85
|
+
for (const [domain, keywords] of Object.entries(DOMAIN_KEYWORDS)) {
|
|
86
|
+
for (const part of allParts) {
|
|
87
|
+
const lower = part.toLowerCase().replace(/[^a-z0-9]/g, '');
|
|
88
|
+
if (keywords.some(k => lower.includes(k)) || lower.includes(domain)) {
|
|
89
|
+
domainHits.push(domain);
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Detect operation type from file event patterns
|
|
95
|
+
const hasTests = files.some(f => /\.(test|spec)\.[jt]sx?$/.test(f));
|
|
96
|
+
const hasConfig = files.some(f => /\.(json|ya?ml|toml|env)$/.test(f));
|
|
97
|
+
const parts = [];
|
|
98
|
+
if (domainHits.length > 0) {
|
|
99
|
+
parts.push(domainHits.join('+'));
|
|
100
|
+
}
|
|
101
|
+
else if (modules.length > 0) {
|
|
102
|
+
parts.push(modules.slice(0, 2).join('+'));
|
|
103
|
+
}
|
|
104
|
+
if (hasTests)
|
|
105
|
+
parts.push('with-tests');
|
|
106
|
+
if (hasConfig)
|
|
107
|
+
parts.push('config-change');
|
|
108
|
+
if (parts.length === 0)
|
|
109
|
+
return 'general-edit';
|
|
110
|
+
return parts.join(' ');
|
|
111
|
+
}
|
|
112
|
+
// ─── Session Inference ─────────────────────────────────────────────────────
|
|
113
|
+
/** Compute a deterministic session ID from a working set */
|
|
114
|
+
export function computeSessionId(workingSet) {
|
|
115
|
+
const hash = createHash('sha256');
|
|
116
|
+
hash.update(workingSet.files.sort().join('\n'));
|
|
117
|
+
hash.update(workingSet.first_change);
|
|
118
|
+
return `pulse-${hash.digest('hex').slice(0, 12)}`;
|
|
119
|
+
}
|
|
120
|
+
/** Infer a PulseSession from a working set */
|
|
121
|
+
export function inferSession(workingSet) {
|
|
122
|
+
const sessionId = computeSessionId(workingSet);
|
|
123
|
+
const candidateIntent = inferIntent(workingSet.files);
|
|
124
|
+
// Compute dependency surface: directories containing touched files
|
|
125
|
+
const depSurface = [...new Set(workingSet.files.map(f => dirname(f)).filter(d => d !== '.'))].sort();
|
|
126
|
+
return {
|
|
127
|
+
sessionId,
|
|
128
|
+
candidateIntent,
|
|
129
|
+
touchedFiles: workingSet.files,
|
|
130
|
+
dependencySurface: depSurface,
|
|
131
|
+
modules: workingSet.modules,
|
|
132
|
+
timestamp: workingSet.last_change,
|
|
133
|
+
confidence: computeConfidence(workingSet),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/** Compute confidence score for inferred session (0-1) */
|
|
137
|
+
function computeConfidence(ws) {
|
|
138
|
+
let score = 0.5; // base
|
|
139
|
+
// More files = higher confidence (up to +0.2)
|
|
140
|
+
score += Math.min(ws.files.length / 10, 0.2);
|
|
141
|
+
// Files in same module = higher confidence (up to +0.2)
|
|
142
|
+
if (ws.modules.length === 1)
|
|
143
|
+
score += 0.2;
|
|
144
|
+
else if (ws.modules.length <= 3)
|
|
145
|
+
score += 0.1;
|
|
146
|
+
// Reasonable time span = higher confidence (+0.1)
|
|
147
|
+
const span = new Date(ws.last_change).getTime() - new Date(ws.first_change).getTime();
|
|
148
|
+
if (span > 60_000 && span < 4 * 3600_000)
|
|
149
|
+
score += 0.1;
|
|
150
|
+
return Math.min(score, 1.0);
|
|
151
|
+
}
|
|
152
|
+
// ─── Diff-Based Scanning ───────────────────────────────────────────────────
|
|
153
|
+
/** Scan git working tree for recent changes and produce PulseFileEvents */
|
|
154
|
+
export function scanGitChanges(repoRoot) {
|
|
155
|
+
const events = [];
|
|
156
|
+
const now = new Date().toISOString();
|
|
157
|
+
try {
|
|
158
|
+
// Uncommitted changes (staged + unstaged)
|
|
159
|
+
const diffOutput = execSync('git diff --name-status HEAD 2>/dev/null || git diff --name-status 2>/dev/null', {
|
|
160
|
+
cwd: repoRoot,
|
|
161
|
+
encoding: 'utf-8',
|
|
162
|
+
timeout: 5000,
|
|
163
|
+
}).trim();
|
|
164
|
+
if (diffOutput) {
|
|
165
|
+
for (const line of diffOutput.split('\n')) {
|
|
166
|
+
const [status, ...pathParts] = line.split('\t');
|
|
167
|
+
const filePath = pathParts.join('\t');
|
|
168
|
+
if (!filePath)
|
|
169
|
+
continue;
|
|
170
|
+
let kind = 'modify';
|
|
171
|
+
if (status?.startsWith('A'))
|
|
172
|
+
kind = 'create';
|
|
173
|
+
else if (status?.startsWith('D'))
|
|
174
|
+
kind = 'delete';
|
|
175
|
+
else if (status?.startsWith('R'))
|
|
176
|
+
kind = 'rename';
|
|
177
|
+
events.push({ path: filePath, kind, timestamp: now });
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// Untracked files
|
|
181
|
+
const untrackedOutput = execSync('git ls-files --others --exclude-standard', {
|
|
182
|
+
cwd: repoRoot,
|
|
183
|
+
encoding: 'utf-8',
|
|
184
|
+
timeout: 5000,
|
|
185
|
+
}).trim();
|
|
186
|
+
if (untrackedOutput) {
|
|
187
|
+
for (const filePath of untrackedOutput.split('\n')) {
|
|
188
|
+
if (filePath) {
|
|
189
|
+
events.push({ path: filePath, kind: 'create', timestamp: now });
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
// Non-fatal: return whatever we collected
|
|
196
|
+
}
|
|
197
|
+
return events;
|
|
198
|
+
}
|
|
199
|
+
// ─── State Persistence ─────────────────────────────────────────────────────
|
|
200
|
+
/** Load Pulse state from disk */
|
|
201
|
+
export function loadPulseState(repoRoot) {
|
|
202
|
+
const stateFile = join(repoRoot, PULSE_STATE_FILE);
|
|
203
|
+
if (existsSync(stateFile)) {
|
|
204
|
+
try {
|
|
205
|
+
const raw = readFileSync(stateFile, 'utf-8');
|
|
206
|
+
return JSON.parse(raw);
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
// Corrupted state — start fresh
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return {
|
|
213
|
+
schema_version: 'pulse/v1',
|
|
214
|
+
sessions: [],
|
|
215
|
+
recentEvents: [],
|
|
216
|
+
lastScanTimestamp: new Date(0).toISOString(),
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
/** Save Pulse state to disk */
|
|
220
|
+
export function savePulseState(repoRoot, state) {
|
|
221
|
+
const stateFile = join(repoRoot, PULSE_STATE_FILE);
|
|
222
|
+
const dir = dirname(stateFile);
|
|
223
|
+
if (!existsSync(dir))
|
|
224
|
+
mkdirSync(dir, { recursive: true });
|
|
225
|
+
writeFileSync(stateFile, JSON.stringify(state, null, 2) + '\n', 'utf-8');
|
|
226
|
+
}
|
|
227
|
+
// ─── Main Pulse Scan ───────────────────────────────────────────────────────
|
|
228
|
+
/** Run a Pulse scan: detect changes, cluster, infer sessions, persist */
|
|
229
|
+
export function runPulseScan(repoRoot) {
|
|
230
|
+
const state = loadPulseState(repoRoot);
|
|
231
|
+
const newEvents = scanGitChanges(repoRoot);
|
|
232
|
+
// Merge with recent events, deduplicate by path+kind
|
|
233
|
+
const seen = new Set(state.recentEvents.map(e => `${e.path}:${e.kind}`));
|
|
234
|
+
for (const evt of newEvents) {
|
|
235
|
+
const key = `${evt.path}:${evt.kind}`;
|
|
236
|
+
if (!seen.has(key)) {
|
|
237
|
+
state.recentEvents.push(evt);
|
|
238
|
+
seen.add(key);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// Trim old events
|
|
242
|
+
if (state.recentEvents.length > MAX_RECENT_EVENTS) {
|
|
243
|
+
state.recentEvents = state.recentEvents.slice(-MAX_RECENT_EVENTS);
|
|
244
|
+
}
|
|
245
|
+
// Cluster and infer sessions
|
|
246
|
+
const clusters = clusterEvents(state.recentEvents);
|
|
247
|
+
const sessions = clusters.map(inferSession);
|
|
248
|
+
state.sessions = sessions;
|
|
249
|
+
state.lastScanTimestamp = new Date().toISOString();
|
|
250
|
+
savePulseState(repoRoot, state);
|
|
251
|
+
return sessions;
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=pulse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pulse.js","sourceRoot":"","sources":["../../src/pulse/pulse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/severity/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,2BAA2B,EAC3B,uBAAuB,EACvB,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,uBAAuB,GACxB,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/severity/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,2BAA2B,EAC3B,uBAAuB,EACvB,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,uBAAuB,GACxB,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conflict Severity Matrix (Hardened v2.5.1)
|
|
3
|
+
*
|
|
4
|
+
* Computes weighted conflict severity scores from multiple signal types.
|
|
5
|
+
* Only HIGH severity triggers visible interruption; MEDIUM is advisory; LOW is passive.
|
|
6
|
+
*
|
|
7
|
+
* Hardening guarantees:
|
|
8
|
+
* - Exact file overlap weighted highest (1.0)
|
|
9
|
+
* - Dependency overlap requires minimum count to contribute meaningfully
|
|
10
|
+
* - Test overlap requires actual shared impacted tests, not vague inference
|
|
11
|
+
* - Weak signals (branch_divergence, single-dep overlap) are hard-capped
|
|
12
|
+
* and cannot escalate to MEDIUM on their own
|
|
13
|
+
* - Deterministic thresholds: HIGH ≥ 0.7, MEDIUM ≥ 0.4, LOW < 0.4
|
|
14
|
+
*/
|
|
15
|
+
import type { ConflictSignal, ConflictSignalType, ConflictSeverityLevel, ConflictSeverityAssessment, SeverityConfig, SeverityWeights, SeverityThresholds } from '@codeledger/types';
|
|
16
|
+
/** Default severity weights — exact file overlap is strongest signal */
|
|
17
|
+
export declare const DEFAULT_SEVERITY_WEIGHTS: SeverityWeights;
|
|
18
|
+
/** Default severity thresholds */
|
|
19
|
+
export declare const DEFAULT_SEVERITY_THRESHOLDS: SeverityThresholds;
|
|
20
|
+
/** Default config */
|
|
21
|
+
export declare const DEFAULT_SEVERITY_CONFIG: SeverityConfig;
|
|
22
|
+
/** Classify severity level from aggregate score */
|
|
23
|
+
export declare function classifySeverity(score: number, thresholds?: SeverityThresholds): ConflictSeverityLevel;
|
|
24
|
+
/**
|
|
25
|
+
* Compute aggregate severity from a set of conflict signals.
|
|
26
|
+
*
|
|
27
|
+
* Hardened algorithm:
|
|
28
|
+
* 1. Sort signals by weight descending
|
|
29
|
+
* 2. Primary score = max signal weight
|
|
30
|
+
* 3. Additional signals add 15% of their weight (diminishing returns)
|
|
31
|
+
* 4. Apply weak-signal caps when only weak signals are present
|
|
32
|
+
* 5. Cap at 1.0
|
|
33
|
+
* 6. Classify using deterministic thresholds
|
|
34
|
+
*/
|
|
35
|
+
export declare function computeSeverity(signals: ConflictSignal[], sessionPair: [string, string], config?: SeverityConfig): ConflictSeverityAssessment;
|
|
36
|
+
/** Build a conflict signal from raw data */
|
|
37
|
+
export declare function buildSignal(type: ConflictSignalType, details: string, weights?: SeverityWeights): ConflictSignal;
|
|
38
|
+
/**
|
|
39
|
+
* Build signals from conflict zone data.
|
|
40
|
+
*
|
|
41
|
+
* Hardened: applies minimum-count thresholds for weak signal types
|
|
42
|
+
* to prevent single-file dependency overlaps from over-triggering.
|
|
43
|
+
*/
|
|
44
|
+
export declare function buildSignalsFromOverlap(overlappingFiles: string[], dependencyOverlaps: string[], sharedTestFiles: string[], branchDivergence: boolean, semanticConflicts: Array<{
|
|
45
|
+
symbol: string;
|
|
46
|
+
file: string;
|
|
47
|
+
}>, weights?: SeverityWeights): ConflictSignal[];
|
|
48
|
+
//# sourceMappingURL=severity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"severity.d.ts","sourceRoot":"","sources":["../../src/severity/severity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,0BAA0B,EAC1B,cAAc,EACd,eAAe,EACf,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAE3B,wEAAwE;AACxE,eAAO,MAAM,wBAAwB,EAAE,eAMtC,CAAC;AAEF,kCAAkC;AAClC,eAAO,MAAM,2BAA2B,EAAE,kBAGzC,CAAC;AAEF,qBAAqB;AACrB,eAAO,MAAM,uBAAuB,EAAE,cAGrC,CAAC;AAcF,mDAAmD;AACnD,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,UAAU,GAAE,kBAAgD,GAC3D,qBAAqB,CAIvB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,cAAc,EAAE,EACzB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,MAAM,GAAE,cAAwC,GAC/C,0BAA0B,CA0D5B;AAED,4CAA4C;AAC5C,wBAAgB,WAAW,CACzB,IAAI,EAAE,kBAAkB,EACxB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,eAA0C,GAClD,cAAc,CAMhB;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,gBAAgB,EAAE,MAAM,EAAE,EAC1B,kBAAkB,EAAE,MAAM,EAAE,EAC5B,eAAe,EAAE,MAAM,EAAE,EACzB,gBAAgB,EAAE,OAAO,EACzB,iBAAiB,EAAE,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EAC1D,OAAO,GAAE,eAA0C,GAClD,cAAc,EAAE,CA8ClB"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/** Default severity weights — exact file overlap is strongest signal */
|
|
2
|
+
export const DEFAULT_SEVERITY_WEIGHTS = {
|
|
3
|
+
exact_file_overlap: 1.0,
|
|
4
|
+
semantic_signature_overlap: 0.85,
|
|
5
|
+
direct_dependency: 0.6,
|
|
6
|
+
shared_test_surface: 0.45,
|
|
7
|
+
branch_divergence: 0.2,
|
|
8
|
+
};
|
|
9
|
+
/** Default severity thresholds */
|
|
10
|
+
export const DEFAULT_SEVERITY_THRESHOLDS = {
|
|
11
|
+
high: 0.7,
|
|
12
|
+
medium: 0.4,
|
|
13
|
+
};
|
|
14
|
+
/** Default config */
|
|
15
|
+
export const DEFAULT_SEVERITY_CONFIG = {
|
|
16
|
+
weights: DEFAULT_SEVERITY_WEIGHTS,
|
|
17
|
+
thresholds: DEFAULT_SEVERITY_THRESHOLDS,
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Hard caps for weak signal types.
|
|
21
|
+
* A signal type listed here can never push the aggregate score above its cap value
|
|
22
|
+
* when it is the *only* signal. This prevents weak adjacency from escalating to
|
|
23
|
+
* MEDIUM or HIGH without corroborating evidence.
|
|
24
|
+
*/
|
|
25
|
+
const WEAK_SIGNAL_CAPS = {
|
|
26
|
+
branch_divergence: 0.25, // Cannot reach MEDIUM alone
|
|
27
|
+
shared_test_surface: 0.39, // Cannot reach MEDIUM alone without corroboration
|
|
28
|
+
direct_dependency: 0.55, // Cannot reach HIGH alone
|
|
29
|
+
};
|
|
30
|
+
/** Classify severity level from aggregate score */
|
|
31
|
+
export function classifySeverity(score, thresholds = DEFAULT_SEVERITY_THRESHOLDS) {
|
|
32
|
+
if (score >= thresholds.high)
|
|
33
|
+
return 'HIGH';
|
|
34
|
+
if (score >= thresholds.medium)
|
|
35
|
+
return 'MEDIUM';
|
|
36
|
+
return 'LOW';
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Compute aggregate severity from a set of conflict signals.
|
|
40
|
+
*
|
|
41
|
+
* Hardened algorithm:
|
|
42
|
+
* 1. Sort signals by weight descending
|
|
43
|
+
* 2. Primary score = max signal weight
|
|
44
|
+
* 3. Additional signals add 15% of their weight (diminishing returns)
|
|
45
|
+
* 4. Apply weak-signal caps when only weak signals are present
|
|
46
|
+
* 5. Cap at 1.0
|
|
47
|
+
* 6. Classify using deterministic thresholds
|
|
48
|
+
*/
|
|
49
|
+
export function computeSeverity(signals, sessionPair, config = DEFAULT_SEVERITY_CONFIG) {
|
|
50
|
+
if (signals.length === 0) {
|
|
51
|
+
return {
|
|
52
|
+
signals: [],
|
|
53
|
+
aggregateScore: 0,
|
|
54
|
+
level: 'LOW',
|
|
55
|
+
shouldInterrupt: false,
|
|
56
|
+
shouldAdvise: false,
|
|
57
|
+
sessionPair,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
// Aggregate: take the max weighted signal, then diminishing contributions
|
|
61
|
+
const sorted = [...signals].sort((a, b) => b.weight - a.weight);
|
|
62
|
+
let score = sorted[0].weight;
|
|
63
|
+
for (let i = 1; i < sorted.length; i++) {
|
|
64
|
+
// Hardened: reduced from 20% to 15% to prevent over-inflation
|
|
65
|
+
score += sorted[i].weight * 0.15;
|
|
66
|
+
}
|
|
67
|
+
// Cap at 1.0
|
|
68
|
+
score = Math.min(score, 1.0);
|
|
69
|
+
// Hardened: apply weak-signal caps when ALL signals are weak
|
|
70
|
+
const hasStrongSignal = sorted.some(s => s.type === 'exact_file_overlap' || s.type === 'semantic_signature_overlap');
|
|
71
|
+
if (!hasStrongSignal) {
|
|
72
|
+
// Find the strictest cap that applies
|
|
73
|
+
let effectiveCap = 1.0;
|
|
74
|
+
for (const s of sorted) {
|
|
75
|
+
const cap = WEAK_SIGNAL_CAPS[s.type];
|
|
76
|
+
if (cap !== undefined && cap < effectiveCap) {
|
|
77
|
+
// Only apply cap if this is the strongest signal
|
|
78
|
+
if (s === sorted[0]) {
|
|
79
|
+
effectiveCap = cap;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// If multiple weak signals, allow modest elevation above the primary cap
|
|
84
|
+
if (sorted.length > 1) {
|
|
85
|
+
effectiveCap = Math.min(effectiveCap + 0.1, 0.65);
|
|
86
|
+
}
|
|
87
|
+
score = Math.min(score, effectiveCap);
|
|
88
|
+
}
|
|
89
|
+
const level = classifySeverity(score, config.thresholds);
|
|
90
|
+
return {
|
|
91
|
+
signals,
|
|
92
|
+
aggregateScore: Math.round(score * 1000) / 1000,
|
|
93
|
+
level,
|
|
94
|
+
shouldInterrupt: level === 'HIGH',
|
|
95
|
+
shouldAdvise: level === 'MEDIUM',
|
|
96
|
+
sessionPair,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/** Build a conflict signal from raw data */
|
|
100
|
+
export function buildSignal(type, details, weights = DEFAULT_SEVERITY_WEIGHTS) {
|
|
101
|
+
return {
|
|
102
|
+
type,
|
|
103
|
+
weight: weights[type],
|
|
104
|
+
details,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Build signals from conflict zone data.
|
|
109
|
+
*
|
|
110
|
+
* Hardened: applies minimum-count thresholds for weak signal types
|
|
111
|
+
* to prevent single-file dependency overlaps from over-triggering.
|
|
112
|
+
*/
|
|
113
|
+
export function buildSignalsFromOverlap(overlappingFiles, dependencyOverlaps, sharedTestFiles, branchDivergence, semanticConflicts, weights = DEFAULT_SEVERITY_WEIGHTS) {
|
|
114
|
+
const signals = [];
|
|
115
|
+
if (overlappingFiles.length > 0) {
|
|
116
|
+
signals.push(buildSignal('exact_file_overlap', `${overlappingFiles.length} file(s): ${overlappingFiles.slice(0, 3).join(', ')}${overlappingFiles.length > 3 ? '...' : ''}`, weights));
|
|
117
|
+
}
|
|
118
|
+
// Hardened: require ≥2 dependency overlaps for signal (single dep is noise)
|
|
119
|
+
if (dependencyOverlaps.length >= 2) {
|
|
120
|
+
signals.push(buildSignal('direct_dependency', `${dependencyOverlaps.length} shared dependency path(s)`, weights));
|
|
121
|
+
}
|
|
122
|
+
// Hardened: require ≥2 shared test files (a single shared test is common)
|
|
123
|
+
if (sharedTestFiles.length >= 2) {
|
|
124
|
+
signals.push(buildSignal('shared_test_surface', `${sharedTestFiles.length} shared test file(s)`, weights));
|
|
125
|
+
}
|
|
126
|
+
if (branchDivergence) {
|
|
127
|
+
signals.push(buildSignal('branch_divergence', 'Branches have diverged from common ancestor', weights));
|
|
128
|
+
}
|
|
129
|
+
if (semanticConflicts.length > 0) {
|
|
130
|
+
signals.push(buildSignal('semantic_signature_overlap', `${semanticConflicts.length} semantic conflict(s): ${semanticConflicts.slice(0, 3).map(c => c.symbol).join(', ')}`, weights));
|
|
131
|
+
}
|
|
132
|
+
return signals;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=severity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"severity.js","sourceRoot":"","sources":["../../src/severity/severity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/staleness/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,eAAe,EACf,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/staleness/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,eAAe,EACf,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ShadowUpdate } from '@codeledger/types';
|
|
2
|
+
/** Classify staleness level from a weighted ratio */
|
|
3
|
+
export declare function classifyStaleness(weightedRatio: number): ShadowUpdate['stalenessLevel'];
|
|
4
|
+
/**
|
|
5
|
+
* Classify staleness with direct file precedence.
|
|
6
|
+
* Bundle file changes dominate; dependency-only changes are capped at MEDIUM.
|
|
7
|
+
*/
|
|
8
|
+
export declare function classifyStalenessWeighted(bundleChangedCount: number, bundleTotal: number, depChangedCount: number): ShadowUpdate['stalenessLevel'];
|
|
9
|
+
/** Get files changed since a given git ref */
|
|
10
|
+
export declare function getChangesSince(repoRoot: string, sinceRef: string): Array<{
|
|
11
|
+
path: string;
|
|
12
|
+
status: string;
|
|
13
|
+
author: string;
|
|
14
|
+
}>;
|
|
15
|
+
/**
|
|
16
|
+
* Compute a shadow update for a session.
|
|
17
|
+
*
|
|
18
|
+
* Hardened: uses weighted change relevance instead of raw file count ratio.
|
|
19
|
+
* Direct bundle file changes carry full weight, dependency changes carry half,
|
|
20
|
+
* and test-only changes carry a quarter.
|
|
21
|
+
*/
|
|
22
|
+
export declare function computeShadowUpdate(repoRoot: string, sessionId: string, bundleFiles: string[], dependencySurface: string[], sinceRef: string): ShadowUpdate;
|
|
23
|
+
/**
|
|
24
|
+
* Format a shadow update as an advisory message for the user.
|
|
25
|
+
*
|
|
26
|
+
* Hardened: concise, specific, actionable.
|
|
27
|
+
*/
|
|
28
|
+
export declare function formatShadowAdvisory(update: ShadowUpdate): string;
|
|
29
|
+
//# sourceMappingURL=jit-staleness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jit-staleness.d.ts","sourceRoot":"","sources":["../../src/staleness/jit-staleness.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EACV,YAAY,EAGb,MAAM,mBAAmB,CAAC;AAyB3B,qDAAqD;AACrD,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,MAAM,GACpB,YAAY,CAAC,gBAAgB,CAAC,CAKhC;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,kBAAkB,EAAE,MAAM,EAC1B,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,MAAM,GACtB,YAAY,CAAC,gBAAgB,CAAC,CAYhC;AAED,8CAA8C;AAC9C,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAsCzD;AAeD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EAAE,EACrB,iBAAiB,EAAE,MAAM,EAAE,EAC3B,QAAQ,EAAE,MAAM,GACf,YAAY,CAwDd;AAgDD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CA+BjE"}
|