@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.
Files changed (181) hide show
  1. package/dist/broker/completion.d.ts +9 -0
  2. package/dist/broker/completion.d.ts.map +1 -0
  3. package/dist/broker/completion.js +51 -0
  4. package/dist/broker/completion.js.map +1 -0
  5. package/dist/broker/evidence.d.ts +11 -0
  6. package/dist/broker/evidence.d.ts.map +1 -0
  7. package/dist/broker/evidence.js +39 -0
  8. package/dist/broker/evidence.js.map +1 -0
  9. package/dist/broker/index.d.ts +14 -0
  10. package/dist/broker/index.d.ts.map +1 -0
  11. package/dist/broker/index.js +14 -0
  12. package/dist/broker/index.js.map +1 -0
  13. package/dist/broker/memory-lookup.d.ts +41 -0
  14. package/dist/broker/memory-lookup.d.ts.map +1 -0
  15. package/dist/broker/memory-lookup.js +70 -0
  16. package/dist/broker/memory-lookup.js.map +1 -0
  17. package/dist/broker/preamble.d.ts +19 -0
  18. package/dist/broker/preamble.d.ts.map +1 -0
  19. package/dist/broker/preamble.js +13 -0
  20. package/dist/broker/preamble.js.map +1 -0
  21. package/dist/broker/structural.d.ts +10 -0
  22. package/dist/broker/structural.d.ts.map +1 -0
  23. package/dist/broker/structural.js +52 -0
  24. package/dist/broker/structural.js.map +1 -0
  25. package/dist/broker/task-resolution.d.ts +17 -0
  26. package/dist/broker/task-resolution.d.ts.map +1 -0
  27. package/dist/broker/task-resolution.js +386 -0
  28. package/dist/broker/task-resolution.js.map +1 -0
  29. package/dist/broker/validation.d.ts +14 -0
  30. package/dist/broker/validation.d.ts.map +1 -0
  31. package/dist/broker/validation.js +75 -0
  32. package/dist/broker/validation.js.map +1 -0
  33. package/dist/claims/claims.d.ts +14 -0
  34. package/dist/claims/claims.d.ts.map +1 -0
  35. package/dist/claims/claims.js +125 -0
  36. package/dist/claims/claims.js.map +1 -0
  37. package/dist/claims/index.d.ts +2 -0
  38. package/dist/claims/index.d.ts.map +1 -0
  39. package/dist/claims/index.js +2 -0
  40. package/dist/claims/index.js.map +1 -0
  41. package/dist/dashboard/index.d.ts +3 -0
  42. package/dist/dashboard/index.d.ts.map +1 -0
  43. package/dist/dashboard/index.js +3 -0
  44. package/dist/dashboard/index.js.map +1 -0
  45. package/dist/dashboard/metrics.d.ts +24 -0
  46. package/dist/dashboard/metrics.d.ts.map +1 -0
  47. package/dist/dashboard/metrics.js +358 -0
  48. package/dist/dashboard/metrics.js.map +1 -0
  49. package/dist/dashboard/store.d.ts +26 -0
  50. package/dist/dashboard/store.d.ts.map +1 -0
  51. package/dist/dashboard/store.js +97 -0
  52. package/dist/dashboard/store.js.map +1 -0
  53. package/dist/index.d.ts +12 -0
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +23 -0
  56. package/dist/index.js.map +1 -1
  57. package/dist/insight/collector.d.ts +31 -0
  58. package/dist/insight/collector.d.ts.map +1 -0
  59. package/dist/insight/collector.js +172 -0
  60. package/dist/insight/collector.js.map +1 -0
  61. package/dist/insight/engine.d.ts +18 -0
  62. package/dist/insight/engine.d.ts.map +1 -0
  63. package/dist/insight/engine.js +84 -0
  64. package/dist/insight/engine.js.map +1 -0
  65. package/dist/insight/formatter.d.ts +9 -0
  66. package/dist/insight/formatter.d.ts.map +1 -0
  67. package/dist/insight/formatter.js +87 -0
  68. package/dist/insight/formatter.js.map +1 -0
  69. package/dist/insight/index.d.ts +13 -0
  70. package/dist/insight/index.d.ts.map +1 -0
  71. package/dist/insight/index.js +11 -0
  72. package/dist/insight/index.js.map +1 -0
  73. package/dist/insight/session.d.ts +11 -0
  74. package/dist/insight/session.d.ts.map +1 -0
  75. package/dist/insight/session.js +60 -0
  76. package/dist/insight/session.js.map +1 -0
  77. package/dist/integration/ambient-coordinator.d.ts +75 -0
  78. package/dist/integration/ambient-coordinator.d.ts.map +1 -0
  79. package/dist/integration/ambient-coordinator.js +183 -0
  80. package/dist/integration/ambient-coordinator.js.map +1 -0
  81. package/dist/integration/index.d.ts +4 -0
  82. package/dist/integration/index.d.ts.map +1 -0
  83. package/dist/integration/index.js +3 -0
  84. package/dist/integration/index.js.map +1 -0
  85. package/dist/integration/warning-throttle.d.ts +63 -0
  86. package/dist/integration/warning-throttle.d.ts.map +1 -0
  87. package/dist/integration/warning-throttle.js +347 -0
  88. package/dist/integration/warning-throttle.js.map +1 -0
  89. package/dist/intervention/escalation.d.ts +23 -0
  90. package/dist/intervention/escalation.d.ts.map +1 -0
  91. package/dist/intervention/escalation.js +149 -0
  92. package/dist/intervention/escalation.js.map +1 -0
  93. package/dist/intervention/generator.d.ts +12 -0
  94. package/dist/intervention/generator.d.ts.map +1 -0
  95. package/dist/intervention/generator.js +191 -0
  96. package/dist/intervention/generator.js.map +1 -0
  97. package/dist/intervention/index.d.ts +4 -0
  98. package/dist/intervention/index.d.ts.map +1 -0
  99. package/dist/intervention/index.js +4 -0
  100. package/dist/intervention/index.js.map +1 -0
  101. package/dist/intervention/signal-aggregator.d.ts +26 -0
  102. package/dist/intervention/signal-aggregator.d.ts.map +1 -0
  103. package/dist/intervention/signal-aggregator.js +274 -0
  104. package/dist/intervention/signal-aggregator.js.map +1 -0
  105. package/dist/layer-d/conflict-detector.d.ts +12 -0
  106. package/dist/layer-d/conflict-detector.d.ts.map +1 -0
  107. package/dist/layer-d/conflict-detector.js +150 -0
  108. package/dist/layer-d/conflict-detector.js.map +1 -0
  109. package/dist/layer-d/index.d.ts +3 -0
  110. package/dist/layer-d/index.d.ts.map +1 -0
  111. package/dist/layer-d/index.js +3 -0
  112. package/dist/layer-d/index.js.map +1 -0
  113. package/dist/layer-d/surface-extractor.d.ts +10 -0
  114. package/dist/layer-d/surface-extractor.d.ts.map +1 -0
  115. package/dist/layer-d/surface-extractor.js +96 -0
  116. package/dist/layer-d/surface-extractor.js.map +1 -0
  117. package/dist/policy-domains/domains.d.ts +31 -0
  118. package/dist/policy-domains/domains.d.ts.map +1 -0
  119. package/dist/policy-domains/domains.js +445 -0
  120. package/dist/policy-domains/domains.js.map +1 -0
  121. package/dist/policy-domains/index.d.ts +8 -0
  122. package/dist/policy-domains/index.d.ts.map +1 -0
  123. package/dist/policy-domains/index.js +8 -0
  124. package/dist/policy-domains/index.js.map +1 -0
  125. package/dist/pulse/index.d.ts +2 -0
  126. package/dist/pulse/index.d.ts.map +1 -0
  127. package/dist/pulse/index.js +2 -0
  128. package/dist/pulse/index.js.map +1 -0
  129. package/dist/pulse/pulse.d.ts +20 -0
  130. package/dist/pulse/pulse.d.ts.map +1 -0
  131. package/dist/pulse/pulse.js +253 -0
  132. package/dist/pulse/pulse.js.map +1 -0
  133. package/dist/severity/index.d.ts +2 -0
  134. package/dist/severity/index.d.ts.map +1 -0
  135. package/dist/severity/index.js +2 -0
  136. package/dist/severity/index.js.map +1 -0
  137. package/dist/severity/severity.d.ts +48 -0
  138. package/dist/severity/severity.d.ts.map +1 -0
  139. package/dist/severity/severity.js +134 -0
  140. package/dist/severity/severity.js.map +1 -0
  141. package/dist/staleness/index.d.ts +2 -0
  142. package/dist/staleness/index.d.ts.map +1 -0
  143. package/dist/staleness/index.js +2 -0
  144. package/dist/staleness/index.js.map +1 -0
  145. package/dist/staleness/jit-staleness.d.ts +29 -0
  146. package/dist/staleness/jit-staleness.d.ts.map +1 -0
  147. package/dist/staleness/jit-staleness.js +240 -0
  148. package/dist/staleness/jit-staleness.js.map +1 -0
  149. package/dist/team-policy/index.d.ts +1 -1
  150. package/dist/team-policy/index.d.ts.map +1 -1
  151. package/dist/team-policy/index.js +1 -1
  152. package/dist/team-policy/index.js.map +1 -1
  153. package/dist/team-policy/policy.d.ts +7 -0
  154. package/dist/team-policy/policy.d.ts.map +1 -1
  155. package/dist/team-policy/policy.js +38 -0
  156. package/dist/team-policy/policy.js.map +1 -1
  157. package/dist/trust/approval.d.ts +16 -0
  158. package/dist/trust/approval.d.ts.map +1 -0
  159. package/dist/trust/approval.js +183 -0
  160. package/dist/trust/approval.js.map +1 -0
  161. package/dist/trust/capsule.d.ts +36 -0
  162. package/dist/trust/capsule.d.ts.map +1 -0
  163. package/dist/trust/capsule.js +206 -0
  164. package/dist/trust/capsule.js.map +1 -0
  165. package/dist/trust/index.d.ts +6 -0
  166. package/dist/trust/index.d.ts.map +1 -0
  167. package/dist/trust/index.js +6 -0
  168. package/dist/trust/index.js.map +1 -0
  169. package/dist/trust/learning-feedback.d.ts +18 -0
  170. package/dist/trust/learning-feedback.d.ts.map +1 -0
  171. package/dist/trust/learning-feedback.js +146 -0
  172. package/dist/trust/learning-feedback.js.map +1 -0
  173. package/dist/trust/risk-scoring.d.ts +16 -0
  174. package/dist/trust/risk-scoring.d.ts.map +1 -0
  175. package/dist/trust/risk-scoring.js +142 -0
  176. package/dist/trust/risk-scoring.js.map +1 -0
  177. package/dist/trust/timeline.d.ts +42 -0
  178. package/dist/trust/timeline.d.ts.map +1 -0
  179. package/dist/trust/timeline.js +154 -0
  180. package/dist/trust/timeline.js.map +1 -0
  181. 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,2 @@
1
+ export { DEFAULT_SEVERITY_WEIGHTS, DEFAULT_SEVERITY_THRESHOLDS, DEFAULT_SEVERITY_CONFIG, classifySeverity, computeSeverity, buildSignal, buildSignalsFromOverlap, } from './severity.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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,2 @@
1
+ export { DEFAULT_SEVERITY_WEIGHTS, DEFAULT_SEVERITY_THRESHOLDS, DEFAULT_SEVERITY_CONFIG, classifySeverity, computeSeverity, buildSignal, buildSignalsFromOverlap, } from './severity.js';
2
+ //# sourceMappingURL=index.js.map
@@ -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,2 @@
1
+ export { classifyStaleness, classifyStalenessWeighted, getChangesSince, computeShadowUpdate, formatShadowAdvisory, } from './jit-staleness.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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,2 @@
1
+ export { classifyStaleness, classifyStalenessWeighted, getChangesSince, computeShadowUpdate, formatShadowAdvisory, } from './jit-staleness.js';
2
+ //# sourceMappingURL=index.js.map
@@ -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"}