@codeledger/engine 0.7.3 → 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/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -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/package.json +6 -2
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Insight Collector — ingests guardrail events, CIC transitions,
|
|
3
|
+
* validation ledger data, and pre-PR/release-check results.
|
|
4
|
+
*
|
|
5
|
+
* Every collected item MUST have a verifiable provenance (ID or ledger entry).
|
|
6
|
+
* No narrative hallucination — if it can't be traced, it's not collected.
|
|
7
|
+
*/
|
|
8
|
+
const COMPLETION_ORDER = [
|
|
9
|
+
'incomplete', 'edited', 'implemented', 'wired', 'verified', 'audited', 'release_safe',
|
|
10
|
+
];
|
|
11
|
+
const RELEASE_ORDER = [
|
|
12
|
+
'not_ready', 'ready_conditional', 'ready', 'ready_hardened',
|
|
13
|
+
];
|
|
14
|
+
const COMPLETION_DELTAS = {
|
|
15
|
+
'verified': 15,
|
|
16
|
+
'audited': 20,
|
|
17
|
+
'release_safe': 25,
|
|
18
|
+
};
|
|
19
|
+
const RELEASE_DELTAS = {
|
|
20
|
+
'ready_conditional': 5,
|
|
21
|
+
'ready': 10,
|
|
22
|
+
'ready_hardened': 25,
|
|
23
|
+
};
|
|
24
|
+
function isPromotion(order, from, to) {
|
|
25
|
+
return order.indexOf(to) > order.indexOf(from);
|
|
26
|
+
}
|
|
27
|
+
export function collect(input) {
|
|
28
|
+
const prevented = [];
|
|
29
|
+
const transitions = [];
|
|
30
|
+
const truth = {};
|
|
31
|
+
// ── Guardrail events → prevented issues ────────────────────────────────
|
|
32
|
+
if (input.guardrails) {
|
|
33
|
+
for (const g of input.guardrails) {
|
|
34
|
+
if (g.outcome === 'fail' || g.outcome === 'warn') {
|
|
35
|
+
prevented.push({
|
|
36
|
+
id: g.id,
|
|
37
|
+
description: g.detail,
|
|
38
|
+
severity: g.outcome === 'fail' ? 'high' : 'medium',
|
|
39
|
+
source: 'guardrail',
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// ── Pre-PR findings → prevented issues (severity >= medium) ────────────
|
|
45
|
+
if (input.prePRReport) {
|
|
46
|
+
const allFindings = [
|
|
47
|
+
...input.prePRReport.blockers,
|
|
48
|
+
...input.prePRReport.warnings,
|
|
49
|
+
];
|
|
50
|
+
for (const f of allFindings) {
|
|
51
|
+
if (f.severity === 'critical' || f.severity === 'high' || f.severity === 'medium') {
|
|
52
|
+
prevented.push({
|
|
53
|
+
id: `pre-pr:${f.category}:${f.title.slice(0, 40).replace(/\s+/g, '_')}`,
|
|
54
|
+
description: f.title,
|
|
55
|
+
severity: f.severity === 'critical' ? 'critical' : f.severity === 'high' ? 'high' : 'medium',
|
|
56
|
+
source: 'pre_pr',
|
|
57
|
+
recursiveImpact: f.files && f.files.length > 2
|
|
58
|
+
? `affects ${f.files.length} files — potential cascade`
|
|
59
|
+
: undefined,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// ── Release findings → prevented issues ────────────────────────────────
|
|
65
|
+
if (input.releaseResult) {
|
|
66
|
+
for (const f of input.releaseResult.findings) {
|
|
67
|
+
if (f.severity === 'critical' || f.severity === 'high' || f.severity === 'medium') {
|
|
68
|
+
prevented.push({
|
|
69
|
+
id: f.id,
|
|
70
|
+
description: f.title,
|
|
71
|
+
severity: f.severity === 'critical' ? 'critical' : f.severity === 'high' ? 'high' : 'medium',
|
|
72
|
+
source: 'release_check',
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// ── CIC drift/mismatch warnings → prevented issues ────────────────────
|
|
78
|
+
if (input.completionRecord) {
|
|
79
|
+
const rec = input.completionRecord;
|
|
80
|
+
if (rec.semanticDriftWarnings) {
|
|
81
|
+
for (const d of rec.semanticDriftWarnings) {
|
|
82
|
+
prevented.push({
|
|
83
|
+
id: `cic:drift:${d.term.replace(/\s+/g, '_')}`,
|
|
84
|
+
description: `Semantic drift: "${d.term}" expected ${d.expectedConcept} — ${d.detail}`,
|
|
85
|
+
severity: 'medium',
|
|
86
|
+
source: 'cic',
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (rec.realityMismatches) {
|
|
91
|
+
for (const m of rec.realityMismatches) {
|
|
92
|
+
if (!m.actualDiffPresence) {
|
|
93
|
+
prevented.push({
|
|
94
|
+
id: `cic:mismatch:${m.expectedTarget.replace(/\//g, '_')}`,
|
|
95
|
+
description: `Reality mismatch: claim "${m.claim}" — ${m.expectedTarget} not in diff`,
|
|
96
|
+
severity: m.severity === 'critical' ? 'critical' : m.severity === 'major' ? 'high' : 'medium',
|
|
97
|
+
source: 'cic',
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (rec.guards) {
|
|
103
|
+
for (const g of rec.guards) {
|
|
104
|
+
if (g.outcome === 'fail') {
|
|
105
|
+
prevented.push({
|
|
106
|
+
id: g.id,
|
|
107
|
+
description: g.detail,
|
|
108
|
+
severity: 'high',
|
|
109
|
+
source: 'guardrail',
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// ── CIC state transitions → truth + transitions ───────────────────────
|
|
116
|
+
if (input.completionRecord) {
|
|
117
|
+
truth.completionState = input.completionRecord.completionState;
|
|
118
|
+
if (input.previousCompletionState) {
|
|
119
|
+
const from = input.previousCompletionState;
|
|
120
|
+
const to = input.completionRecord.completionState;
|
|
121
|
+
if (isPromotion(COMPLETION_ORDER, from, to)) {
|
|
122
|
+
transitions.push({
|
|
123
|
+
from,
|
|
124
|
+
to,
|
|
125
|
+
label: `completion: ${from} → ${to}`,
|
|
126
|
+
delta: COMPLETION_DELTAS[to] ?? 10,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// ── Release state transitions → truth + transitions ───────────────────
|
|
132
|
+
if (input.releaseResult) {
|
|
133
|
+
truth.releaseState = input.releaseResult.releaseState;
|
|
134
|
+
if (input.previousReleaseState) {
|
|
135
|
+
const from = input.previousReleaseState;
|
|
136
|
+
const to = input.releaseResult.releaseState;
|
|
137
|
+
if (isPromotion(RELEASE_ORDER, from, to)) {
|
|
138
|
+
transitions.push({
|
|
139
|
+
from,
|
|
140
|
+
to,
|
|
141
|
+
label: `release: ${from} → ${to}`,
|
|
142
|
+
delta: RELEASE_DELTAS[to] ?? 5,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// ── Pre-PR pass → confidence transition ───────────────────────────────
|
|
148
|
+
if (input.prePRReport && input.prePRReport.verdict === 'PASS') {
|
|
149
|
+
transitions.push({
|
|
150
|
+
from: 'unchecked',
|
|
151
|
+
to: 'pre_pr_pass',
|
|
152
|
+
label: 'pre-pr: passed all checks',
|
|
153
|
+
delta: 10,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
// ── Work avoided ──────────────────────────────────────────────────────
|
|
157
|
+
const reusedSurfaces = input.reusedSurfaces ?? 0;
|
|
158
|
+
const contextScansAvoided = input.totalRepoFiles && input.scannedFiles
|
|
159
|
+
? input.totalRepoFiles - input.scannedFiles
|
|
160
|
+
: 0;
|
|
161
|
+
const skippedTests = input.skippedTests ?? 0;
|
|
162
|
+
// Estimate: ~2s per surface revalidation, ~2s per file scan, ~1s per test
|
|
163
|
+
const estimatedTimeSavedSec = (reusedSurfaces * 2) + (contextScansAvoided > 0 ? Math.round(contextScansAvoided * 2) : 0) + (skippedTests * 1);
|
|
164
|
+
const workAvoided = {
|
|
165
|
+
surfaces: reusedSurfaces,
|
|
166
|
+
tests: skippedTests,
|
|
167
|
+
contextScansAvoided,
|
|
168
|
+
estimatedTimeSavedSec: estimatedTimeSavedSec > 0 ? estimatedTimeSavedSec : undefined,
|
|
169
|
+
};
|
|
170
|
+
return { prevented, workAvoided, truth, transitions };
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=collector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collector.js","sourceRoot":"","sources":["../../src/insight/collector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Insight Engine — computes value signals from collected data.
|
|
3
|
+
*
|
|
4
|
+
* Applies value detection rules:
|
|
5
|
+
* - Prevented: only severity >= medium
|
|
6
|
+
* - Avoided: >3 surfaces OR >10 files OR >30s estimated
|
|
7
|
+
* - Confidence: delta >= 10
|
|
8
|
+
*
|
|
9
|
+
* Produces an InsightResult with silence/health-pulse flags.
|
|
10
|
+
*/
|
|
11
|
+
import type { InsightResult } from '@codeledger/types';
|
|
12
|
+
import type { CollectedInsight } from './collector.js';
|
|
13
|
+
export interface InsightEngineOptions {
|
|
14
|
+
sessionId?: string;
|
|
15
|
+
consecutiveSilentCount?: number;
|
|
16
|
+
}
|
|
17
|
+
export declare function computeInsight(collected: CollectedInsight, opts?: InsightEngineOptions): InsightResult;
|
|
18
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/insight/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAWvD,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,wBAAgB,cAAc,CAC5B,SAAS,EAAE,gBAAgB,EAC3B,IAAI,GAAE,oBAAyB,GAC9B,aAAa,CAgDf"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Insight Engine — computes value signals from collected data.
|
|
3
|
+
*
|
|
4
|
+
* Applies value detection rules:
|
|
5
|
+
* - Prevented: only severity >= medium
|
|
6
|
+
* - Avoided: >3 surfaces OR >10 files OR >30s estimated
|
|
7
|
+
* - Confidence: delta >= 10
|
|
8
|
+
*
|
|
9
|
+
* Produces an InsightResult with silence/health-pulse flags.
|
|
10
|
+
*/
|
|
11
|
+
/** Thresholds for value detection (from spec §7) */
|
|
12
|
+
const THRESHOLDS = {
|
|
13
|
+
minSeverity: 'medium',
|
|
14
|
+
minSurfaces: 3,
|
|
15
|
+
minFiles: 10,
|
|
16
|
+
minTimeSavedSec: 30,
|
|
17
|
+
minConfidenceDelta: 10,
|
|
18
|
+
};
|
|
19
|
+
export function computeInsight(collected, opts = {}) {
|
|
20
|
+
// ── Confidence delta from state transitions ────────────────────────────
|
|
21
|
+
const confidenceDelta = collected.transitions.reduce((sum, t) => sum + t.delta, 0);
|
|
22
|
+
// ── Apply value detection rules ────────────────────────────────────────
|
|
23
|
+
// Prevented: already filtered to >= medium in collector
|
|
24
|
+
const preventedDetails = collected.prevented;
|
|
25
|
+
const preventedIssues = preventedDetails.length;
|
|
26
|
+
// Work avoided: check thresholds
|
|
27
|
+
const wa = collected.workAvoided;
|
|
28
|
+
const workIsSignificant = wa.surfaces > THRESHOLDS.minSurfaces ||
|
|
29
|
+
wa.contextScansAvoided > THRESHOLDS.minFiles ||
|
|
30
|
+
(wa.estimatedTimeSavedSec != null && wa.estimatedTimeSavedSec > THRESHOLDS.minTimeSavedSec);
|
|
31
|
+
// Zero out work avoided display if below thresholds
|
|
32
|
+
const workAvoided = workIsSignificant ? wa : {
|
|
33
|
+
surfaces: 0,
|
|
34
|
+
tests: 0,
|
|
35
|
+
contextScansAvoided: 0,
|
|
36
|
+
};
|
|
37
|
+
// Confidence: only show if >= threshold
|
|
38
|
+
const showConfidence = confidenceDelta >= THRESHOLDS.minConfidenceDelta;
|
|
39
|
+
// ── Silence rule (§3) ─────────────────────────────────────────────────
|
|
40
|
+
const silent = preventedIssues === 0 && !workIsSignificant && !showConfidence;
|
|
41
|
+
// ── Health pulse (§4) — triggers after 3+ consecutive silent outputs ──
|
|
42
|
+
const healthPulse = silent && (opts.consecutiveSilentCount ?? 0) >= 3;
|
|
43
|
+
// ── Next action (§8) — single, state-driven ───────────────────────────
|
|
44
|
+
const recommendedAction = deriveNextAction(collected);
|
|
45
|
+
return {
|
|
46
|
+
preventedIssues,
|
|
47
|
+
preventedDetails,
|
|
48
|
+
workAvoided,
|
|
49
|
+
truthEstablished: collected.truth,
|
|
50
|
+
confidenceDelta: showConfidence ? confidenceDelta : 0,
|
|
51
|
+
stateTransitions: collected.transitions,
|
|
52
|
+
recommendedAction,
|
|
53
|
+
silent,
|
|
54
|
+
healthPulse,
|
|
55
|
+
timestamp: new Date().toISOString(),
|
|
56
|
+
sessionId: opts.sessionId,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function deriveNextAction(collected) {
|
|
60
|
+
// Priority: critical preventions → state gaps → nothing
|
|
61
|
+
const criticals = collected.prevented.filter(p => p.severity === 'critical');
|
|
62
|
+
if (criticals.length > 0) {
|
|
63
|
+
return `fix ${criticals.length} critical issue${criticals.length > 1 ? 's' : ''} before proceeding`;
|
|
64
|
+
}
|
|
65
|
+
const highs = collected.prevented.filter(p => p.severity === 'high');
|
|
66
|
+
if (highs.length > 0) {
|
|
67
|
+
return `resolve ${highs.length} high-severity finding${highs.length > 1 ? 's' : ''}`;
|
|
68
|
+
}
|
|
69
|
+
// State-driven suggestions
|
|
70
|
+
if (collected.truth.completionState === 'implemented') {
|
|
71
|
+
return 'run complete-check to verify';
|
|
72
|
+
}
|
|
73
|
+
if (collected.truth.completionState === 'verified' && !collected.truth.releaseState) {
|
|
74
|
+
return 'run pre-pr before opening PR';
|
|
75
|
+
}
|
|
76
|
+
if (collected.truth.releaseState === 'ready_conditional') {
|
|
77
|
+
return 'resolve conditions for full release readiness';
|
|
78
|
+
}
|
|
79
|
+
if (collected.truth.releaseState === 'ready') {
|
|
80
|
+
return 'run release-check --strict for hardened release';
|
|
81
|
+
}
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/insight/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Insight Formatter — human (≤10 lines) and JSON output.
|
|
3
|
+
*/
|
|
4
|
+
import type { InsightResult } from '@codeledger/types';
|
|
5
|
+
/** Format InsightResult as human-readable output (≤10 lines per spec §5) */
|
|
6
|
+
export declare function formatInsightHuman(result: InsightResult): string[];
|
|
7
|
+
/** Format InsightResult as JSON string */
|
|
8
|
+
export declare function formatInsightJson(result: InsightResult): string;
|
|
9
|
+
//# sourceMappingURL=formatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/insight/formatter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,4EAA4E;AAC5E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,EAAE,CAkFlE;AAED,0CAA0C;AAC1C,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAE/D"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Insight Formatter — human (≤10 lines) and JSON output.
|
|
3
|
+
*/
|
|
4
|
+
/** Format InsightResult as human-readable output (≤10 lines per spec §5) */
|
|
5
|
+
export function formatInsightHuman(result) {
|
|
6
|
+
// ── Health pulse (§4) ─────────────────────────────────────────────────
|
|
7
|
+
if (result.healthPulse) {
|
|
8
|
+
return [
|
|
9
|
+
'',
|
|
10
|
+
'\u{1F9E0} CodeLedger Health',
|
|
11
|
+
'---------------------',
|
|
12
|
+
'\u2714 100% integrity maintained',
|
|
13
|
+
'\u2714 No intervention required',
|
|
14
|
+
'\u2714 System actively monitoring',
|
|
15
|
+
'',
|
|
16
|
+
];
|
|
17
|
+
}
|
|
18
|
+
// ── Silence rule (§3) ─────────────────────────────────────────────────
|
|
19
|
+
if (result.silent) {
|
|
20
|
+
return [
|
|
21
|
+
'',
|
|
22
|
+
'\u2714 No issues detected',
|
|
23
|
+
'\u2714 No unnecessary work',
|
|
24
|
+
'\u2714 System stable',
|
|
25
|
+
'',
|
|
26
|
+
];
|
|
27
|
+
}
|
|
28
|
+
// ── Full insight output (§5) ──────────────────────────────────────────
|
|
29
|
+
const lines = ['', '\u{1F9E0} CodeLedger Insight', '---------------------'];
|
|
30
|
+
// Prevented
|
|
31
|
+
if (result.preventedIssues > 0) {
|
|
32
|
+
const top = result.preventedDetails.slice(0, 3);
|
|
33
|
+
const summary = top.map(p => {
|
|
34
|
+
const base = p.description.length > 60
|
|
35
|
+
? p.description.slice(0, 57) + '...'
|
|
36
|
+
: p.description;
|
|
37
|
+
return p.recursiveImpact ? `${base} (${p.recursiveImpact})` : base;
|
|
38
|
+
}).join('; ');
|
|
39
|
+
const extra = result.preventedIssues > 3 ? ` (+${result.preventedIssues - 3} more)` : '';
|
|
40
|
+
lines.push(`\u2714 PREVENTED: ${summary}${extra}`);
|
|
41
|
+
}
|
|
42
|
+
// Avoided
|
|
43
|
+
const wa = result.workAvoided;
|
|
44
|
+
const avoidedParts = [];
|
|
45
|
+
if (wa.surfaces > 0)
|
|
46
|
+
avoidedParts.push(`${wa.surfaces} surfaces reused`);
|
|
47
|
+
if (wa.contextScansAvoided > 0)
|
|
48
|
+
avoidedParts.push(`${wa.contextScansAvoided} files skipped`);
|
|
49
|
+
if (wa.tests > 0)
|
|
50
|
+
avoidedParts.push(`${wa.tests} redundant tests skipped`);
|
|
51
|
+
if (wa.estimatedTimeSavedSec && wa.estimatedTimeSavedSec > 0) {
|
|
52
|
+
avoidedParts.push(`~${wa.estimatedTimeSavedSec}s saved`);
|
|
53
|
+
}
|
|
54
|
+
if (avoidedParts.length > 0) {
|
|
55
|
+
lines.push(`\u2714 AVOIDED: ${avoidedParts.join(', ')}`);
|
|
56
|
+
}
|
|
57
|
+
// Truth
|
|
58
|
+
const truthParts = [];
|
|
59
|
+
if (result.truthEstablished.completionState) {
|
|
60
|
+
truthParts.push(`completion ${result.truthEstablished.completionState}`);
|
|
61
|
+
}
|
|
62
|
+
if (result.truthEstablished.releaseState) {
|
|
63
|
+
truthParts.push(`release ${result.truthEstablished.releaseState}`);
|
|
64
|
+
}
|
|
65
|
+
if (truthParts.length > 0) {
|
|
66
|
+
lines.push(`\u2714 TRUTH: ${truthParts.join(', ')}`);
|
|
67
|
+
}
|
|
68
|
+
// Confidence
|
|
69
|
+
if (result.confidenceDelta > 0) {
|
|
70
|
+
const lastTransition = result.stateTransitions[result.stateTransitions.length - 1];
|
|
71
|
+
const label = lastTransition ? lastTransition.label : 'state promoted';
|
|
72
|
+
lines.push('');
|
|
73
|
+
lines.push(`Confidence: +${result.confidenceDelta}% (${label})`);
|
|
74
|
+
}
|
|
75
|
+
// Next action
|
|
76
|
+
if (result.recommendedAction) {
|
|
77
|
+
lines.push('');
|
|
78
|
+
lines.push(`\u{1F449} Next: ${result.recommendedAction}`);
|
|
79
|
+
}
|
|
80
|
+
lines.push('');
|
|
81
|
+
return lines;
|
|
82
|
+
}
|
|
83
|
+
/** Format InsightResult as JSON string */
|
|
84
|
+
export function formatInsightJson(result) {
|
|
85
|
+
return JSON.stringify(result, null, 2);
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../src/insight/formatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Insight System — value dashboard for CodeLedger.
|
|
3
|
+
*
|
|
4
|
+
* Shows prevented risk, avoided work, truth progression,
|
|
5
|
+
* and confidence deltas after key commands.
|
|
6
|
+
*/
|
|
7
|
+
export { collect } from './collector.js';
|
|
8
|
+
export type { CollectorInput, CollectedInsight } from './collector.js';
|
|
9
|
+
export { computeInsight } from './engine.js';
|
|
10
|
+
export type { InsightEngineOptions } from './engine.js';
|
|
11
|
+
export { formatInsightHuman, formatInsightJson } from './formatter.js';
|
|
12
|
+
export { storeInsight, loadSessionInsights, getConsecutiveSilentCount, } from './session.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/insight/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEvE,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Insight System — value dashboard for CodeLedger.
|
|
3
|
+
*
|
|
4
|
+
* Shows prevented risk, avoided work, truth progression,
|
|
5
|
+
* and confidence deltas after key commands.
|
|
6
|
+
*/
|
|
7
|
+
export { collect } from './collector.js';
|
|
8
|
+
export { computeInsight } from './engine.js';
|
|
9
|
+
export { formatInsightHuman, formatInsightJson } from './formatter.js';
|
|
10
|
+
export { storeInsight, loadSessionInsights, getConsecutiveSilentCount, } from './session.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/insight/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAGzC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEvE,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Insight Session Storage — persists insight results per session
|
|
3
|
+
* for `codeledger report --session` retrieval.
|
|
4
|
+
*
|
|
5
|
+
* Stores to `.codeledger/insight-sessions/` as append-only JSONL.
|
|
6
|
+
*/
|
|
7
|
+
import type { InsightResult, InsightSessionEntry } from '@codeledger/types';
|
|
8
|
+
export declare function storeInsight(cwd: string, command: string, result: InsightResult, sessionId?: string): void;
|
|
9
|
+
export declare function loadSessionInsights(cwd: string, sessionId: string): InsightSessionEntry[];
|
|
10
|
+
export declare function getConsecutiveSilentCount(cwd: string, sessionId: string): number;
|
|
11
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/insight/session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAY5E,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,aAAa,EACrB,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI,CAgBN;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAgBzF;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAYhF"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Insight Session Storage — persists insight results per session
|
|
3
|
+
* for `codeledger report --session` retrieval.
|
|
4
|
+
*
|
|
5
|
+
* Stores to `.codeledger/insight-sessions/` as append-only JSONL.
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, mkdirSync, readFileSync, appendFileSync } from 'node:fs';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
const INSIGHT_DIR = 'insight-sessions';
|
|
10
|
+
function insightDir(cwd) {
|
|
11
|
+
return join(cwd, '.codeledger', INSIGHT_DIR);
|
|
12
|
+
}
|
|
13
|
+
function sessionFile(cwd, sessionId) {
|
|
14
|
+
return join(insightDir(cwd), `${sessionId}.jsonl`);
|
|
15
|
+
}
|
|
16
|
+
export function storeInsight(cwd, command, result, sessionId) {
|
|
17
|
+
const sid = sessionId ?? result.sessionId ?? 'default';
|
|
18
|
+
const dir = insightDir(cwd);
|
|
19
|
+
if (!existsSync(dir)) {
|
|
20
|
+
mkdirSync(dir, { recursive: true });
|
|
21
|
+
}
|
|
22
|
+
const entry = {
|
|
23
|
+
sessionId: sid,
|
|
24
|
+
command,
|
|
25
|
+
result,
|
|
26
|
+
timestamp: result.timestamp,
|
|
27
|
+
};
|
|
28
|
+
appendFileSync(sessionFile(cwd, sid), JSON.stringify(entry) + '\n', 'utf-8');
|
|
29
|
+
}
|
|
30
|
+
export function loadSessionInsights(cwd, sessionId) {
|
|
31
|
+
const file = sessionFile(cwd, sessionId);
|
|
32
|
+
if (!existsSync(file))
|
|
33
|
+
return [];
|
|
34
|
+
const lines = readFileSync(file, 'utf-8').split('\n').filter(Boolean);
|
|
35
|
+
const entries = [];
|
|
36
|
+
for (const line of lines) {
|
|
37
|
+
try {
|
|
38
|
+
entries.push(JSON.parse(line));
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// Skip malformed lines — do not fabricate data
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return entries;
|
|
45
|
+
}
|
|
46
|
+
export function getConsecutiveSilentCount(cwd, sessionId) {
|
|
47
|
+
const entries = loadSessionInsights(cwd, sessionId);
|
|
48
|
+
let count = 0;
|
|
49
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
50
|
+
const entry = entries[i];
|
|
51
|
+
if (entry && entry.result.silent) {
|
|
52
|
+
count++;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return count;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/insight/session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,WAAW,GAAG,kBAAkB,CAAC;AAEvC,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,WAAW,CAAC,GAAW,EAAE,SAAiB;IACjD,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,QAAQ,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,GAAW,EACX,OAAe,EACf,MAAqB,EACrB,SAAkB;IAElB,MAAM,GAAG,GAAG,SAAS,IAAI,MAAM,CAAC,SAAS,IAAI,SAAS,CAAC;IACvD,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAE5B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,KAAK,GAAwB;QACjC,SAAS,EAAE,GAAG;QACd,OAAO;QACP,MAAM;QACN,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC;IAEF,cAAc,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAW,EAAE,SAAiB;IAChE,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACzC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjC,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACtE,MAAM,OAAO,GAA0B,EAAE,CAAC;IAE1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAwB,CAAC,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,+CAA+C;QACjD,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,GAAW,EAAE,SAAiB;IACtE,MAAM,OAAO,GAAG,mBAAmB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACpD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACjC,KAAK,EAAE,CAAC;QACV,CAAC;aAAM,CAAC;YACN,MAAM;QACR,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codeledger/engine",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.5",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Deterministic Context Orchestration Layer (DCOL) — SCE and IOLE subsystems for CodeLedger v2",
|
|
6
6
|
"license": "MIT",
|
|
@@ -37,10 +37,14 @@
|
|
|
37
37
|
"./intervention": {
|
|
38
38
|
"types": "./dist/intervention/index.d.ts",
|
|
39
39
|
"import": "./dist/intervention/index.js"
|
|
40
|
+
},
|
|
41
|
+
"./insight": {
|
|
42
|
+
"types": "./dist/insight/index.d.ts",
|
|
43
|
+
"import": "./dist/insight/index.js"
|
|
40
44
|
}
|
|
41
45
|
},
|
|
42
46
|
"dependencies": {
|
|
43
|
-
"@codeledger/types": "0.7.
|
|
47
|
+
"@codeledger/types": "0.7.5"
|
|
44
48
|
},
|
|
45
49
|
"devDependencies": {
|
|
46
50
|
"typescript": "^5.4.0"
|