@codeledger/engine 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ccs/index.d.ts +11 -0
- package/dist/ccs/index.d.ts.map +1 -0
- package/dist/ccs/index.js +10 -0
- package/dist/ccs/index.js.map +1 -0
- package/dist/ccs/score.d.ts +61 -0
- package/dist/ccs/score.d.ts.map +1 -0
- package/dist/ccs/score.js +250 -0
- package/dist/ccs/score.js.map +1 -0
- package/dist/ecl/index.d.ts +9 -0
- package/dist/ecl/index.d.ts.map +1 -0
- package/dist/ecl/index.js +9 -0
- package/dist/ecl/index.js.map +1 -0
- package/dist/ecl/ledger.d.ts +84 -0
- package/dist/ecl/ledger.d.ts.map +1 -0
- package/dist/ecl/ledger.js +235 -0
- package/dist/ecl/ledger.js.map +1 -0
- package/dist/index.d.ts +54 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/iole/expansion-ladder.d.ts +51 -0
- package/dist/iole/expansion-ladder.d.ts.map +1 -0
- package/dist/iole/expansion-ladder.js +153 -0
- package/dist/iole/expansion-ladder.js.map +1 -0
- package/dist/iole/failure-vector.d.ts +21 -0
- package/dist/iole/failure-vector.d.ts.map +1 -0
- package/dist/iole/failure-vector.js +156 -0
- package/dist/iole/failure-vector.js.map +1 -0
- package/dist/iole/index.d.ts +19 -0
- package/dist/iole/index.d.ts.map +1 -0
- package/dist/iole/index.js +17 -0
- package/dist/iole/index.js.map +1 -0
- package/dist/iole/intent-decomposition.d.ts +33 -0
- package/dist/iole/intent-decomposition.d.ts.map +1 -0
- package/dist/iole/intent-decomposition.js +252 -0
- package/dist/iole/intent-decomposition.js.map +1 -0
- package/dist/iole/intent-signature.d.ts +37 -0
- package/dist/iole/intent-signature.d.ts.map +1 -0
- package/dist/iole/intent-signature.js +112 -0
- package/dist/iole/intent-signature.js.map +1 -0
- package/dist/iole/outcome-score.d.ts +25 -0
- package/dist/iole/outcome-score.d.ts.map +1 -0
- package/dist/iole/outcome-score.js +128 -0
- package/dist/iole/outcome-score.js.map +1 -0
- package/dist/isc/index.d.ts +8 -0
- package/dist/isc/index.d.ts.map +1 -0
- package/dist/isc/index.js +8 -0
- package/dist/isc/index.js.map +1 -0
- package/dist/isc/score.d.ts +27 -0
- package/dist/isc/score.d.ts.map +1 -0
- package/dist/isc/score.js +347 -0
- package/dist/isc/score.js.map +1 -0
- package/dist/license/index.d.ts +14 -0
- package/dist/license/index.d.ts.map +1 -0
- package/dist/license/index.js +11 -0
- package/dist/license/index.js.map +1 -0
- package/dist/license/parse.d.ts +42 -0
- package/dist/license/parse.d.ts.map +1 -0
- package/dist/license/parse.js +106 -0
- package/dist/license/parse.js.map +1 -0
- package/dist/license/publicKey.d.ts +37 -0
- package/dist/license/publicKey.d.ts.map +1 -0
- package/dist/license/publicKey.js +48 -0
- package/dist/license/publicKey.js.map +1 -0
- package/dist/license/verify.d.ts +33 -0
- package/dist/license/verify.d.ts.map +1 -0
- package/dist/license/verify.js +82 -0
- package/dist/license/verify.js.map +1 -0
- package/dist/orchestrator/index.d.ts +10 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +10 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/orchestrator.d.ts +44 -0
- package/dist/orchestrator/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator/orchestrator.js +182 -0
- package/dist/orchestrator/orchestrator.js.map +1 -0
- package/dist/policy-sim/index.d.ts +8 -0
- package/dist/policy-sim/index.d.ts.map +1 -0
- package/dist/policy-sim/index.js +8 -0
- package/dist/policy-sim/index.js.map +1 -0
- package/dist/policy-sim/simulate.d.ts +18 -0
- package/dist/policy-sim/simulate.d.ts.map +1 -0
- package/dist/policy-sim/simulate.js +61 -0
- package/dist/policy-sim/simulate.js.map +1 -0
- package/dist/provenance/graph.d.ts +42 -0
- package/dist/provenance/graph.d.ts.map +1 -0
- package/dist/provenance/graph.js +139 -0
- package/dist/provenance/graph.js.map +1 -0
- package/dist/provenance/index.d.ts +8 -0
- package/dist/provenance/index.d.ts.map +1 -0
- package/dist/provenance/index.js +8 -0
- package/dist/provenance/index.js.map +1 -0
- package/dist/sce/index.d.ts +15 -0
- package/dist/sce/index.d.ts.map +1 -0
- package/dist/sce/index.js +14 -0
- package/dist/sce/index.js.map +1 -0
- package/dist/sce/slice-builder.d.ts +35 -0
- package/dist/sce/slice-builder.d.ts.map +1 -0
- package/dist/sce/slice-builder.js +198 -0
- package/dist/sce/slice-builder.js.map +1 -0
- package/dist/sce/symbol-graph.d.ts +21 -0
- package/dist/sce/symbol-graph.d.ts.map +1 -0
- package/dist/sce/symbol-graph.js +187 -0
- package/dist/sce/symbol-graph.js.map +1 -0
- package/dist/team-ledger/index.d.ts +8 -0
- package/dist/team-ledger/index.d.ts.map +1 -0
- package/dist/team-ledger/index.js +8 -0
- package/dist/team-ledger/index.js.map +1 -0
- package/dist/team-ledger/ledger.d.ts +48 -0
- package/dist/team-ledger/ledger.d.ts.map +1 -0
- package/dist/team-ledger/ledger.js +208 -0
- package/dist/team-ledger/ledger.js.map +1 -0
- package/dist/team-metrics/index.d.ts +8 -0
- package/dist/team-metrics/index.d.ts.map +1 -0
- package/dist/team-metrics/index.js +8 -0
- package/dist/team-metrics/index.js.map +1 -0
- package/dist/team-metrics/metrics.d.ts +42 -0
- package/dist/team-metrics/metrics.d.ts.map +1 -0
- package/dist/team-metrics/metrics.js +156 -0
- package/dist/team-metrics/metrics.js.map +1 -0
- package/dist/team-policy/index.d.ts +8 -0
- package/dist/team-policy/index.d.ts.map +1 -0
- package/dist/team-policy/index.js +8 -0
- package/dist/team-policy/index.js.map +1 -0
- package/dist/team-policy/policy.d.ts +35 -0
- package/dist/team-policy/policy.d.ts.map +1 -0
- package/dist/team-policy/policy.js +100 -0
- package/dist/team-policy/policy.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IOLE — Intent Signature
|
|
3
|
+
*
|
|
4
|
+
* Derives a stable, deterministic hash from a task prompt and optional
|
|
5
|
+
* CLI parameters. Used to detect intent drift across iterations and
|
|
6
|
+
* to correlate outcomes with their originating intent.
|
|
7
|
+
*
|
|
8
|
+
* Deterministic: same task string → same signature.
|
|
9
|
+
*/
|
|
10
|
+
import { createHash } from 'crypto';
|
|
11
|
+
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
12
|
+
/**
|
|
13
|
+
* Derive a deterministic IntentSignature from a task description.
|
|
14
|
+
*
|
|
15
|
+
* The signature includes:
|
|
16
|
+
* - A stable hash (SHA-256 truncated to 16 hex chars)
|
|
17
|
+
* - Normalized task keywords (lowercased, de-duped, sorted)
|
|
18
|
+
* - Inferred task category (bug_fix, feature_add, refactor, test_update, config, unknown)
|
|
19
|
+
* - Timestamp of derivation
|
|
20
|
+
*/
|
|
21
|
+
export function deriveIntentSignature(task, params = {}) {
|
|
22
|
+
const normalized = normalizeTask(task);
|
|
23
|
+
const keywords = extractIntentKeywords(normalized);
|
|
24
|
+
const category = inferCategory(normalized, keywords);
|
|
25
|
+
// Hash: task + sorted params
|
|
26
|
+
const paramStr = Object.entries(params)
|
|
27
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
28
|
+
.map(([k, v]) => `${k}=${v}`)
|
|
29
|
+
.join('&');
|
|
30
|
+
const hashInput = `${normalized}\n${paramStr}`;
|
|
31
|
+
const hash = createHash('sha256').update(hashInput).digest('hex').slice(0, 16);
|
|
32
|
+
return {
|
|
33
|
+
hash,
|
|
34
|
+
task_normalized: normalized,
|
|
35
|
+
keywords,
|
|
36
|
+
category,
|
|
37
|
+
derived_at: new Date().toISOString(),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Compare two intent signatures to detect drift.
|
|
42
|
+
*
|
|
43
|
+
* Returns a DriftLevel:
|
|
44
|
+
* - 'none' → same hash (identical intent)
|
|
45
|
+
* - 'minor' → same category, similar keywords (Jaccard ≥ 0.6)
|
|
46
|
+
* - 'major' → same category, diverged keywords (Jaccard 0.3–0.6)
|
|
47
|
+
* - 'critical' → different category or Jaccard < 0.3
|
|
48
|
+
*/
|
|
49
|
+
export function compareIntentSignatures(a, b) {
|
|
50
|
+
if (a.hash === b.hash) {
|
|
51
|
+
return { level: 'none', jaccard: 1.0, category_changed: false };
|
|
52
|
+
}
|
|
53
|
+
const jaccard = jaccardSimilarity(new Set(a.keywords), new Set(b.keywords));
|
|
54
|
+
const categoryChanged = a.category !== b.category;
|
|
55
|
+
let level;
|
|
56
|
+
if (categoryChanged || jaccard < 0.3) {
|
|
57
|
+
level = 'critical';
|
|
58
|
+
}
|
|
59
|
+
else if (jaccard < 0.6) {
|
|
60
|
+
level = 'major';
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
level = 'minor';
|
|
64
|
+
}
|
|
65
|
+
return { level, jaccard, category_changed: categoryChanged };
|
|
66
|
+
}
|
|
67
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
68
|
+
function normalizeTask(task) {
|
|
69
|
+
return task
|
|
70
|
+
.toLowerCase()
|
|
71
|
+
.replace(/[^a-z0-9\s_/-]/g, ' ')
|
|
72
|
+
.replace(/\s+/g, ' ')
|
|
73
|
+
.trim();
|
|
74
|
+
}
|
|
75
|
+
function extractIntentKeywords(normalized) {
|
|
76
|
+
const stopWords = new Set([
|
|
77
|
+
'a', 'an', 'the', 'in', 'on', 'at', 'to', 'for', 'of', 'and', 'or',
|
|
78
|
+
'but', 'with', 'from', 'by', 'is', 'are', 'be', 'was', 'were', 'do',
|
|
79
|
+
'does', 'did', 'will', 'would', 'could', 'should', 'have', 'has', 'had',
|
|
80
|
+
'this', 'that', 'it', 'its', 'not', 'no', 'so', 'as', 'if', 'then',
|
|
81
|
+
'into', 'than', 'also', 'all', 'any', 'each', 'when', 'where', 'how',
|
|
82
|
+
]);
|
|
83
|
+
const words = normalized.split(/[\s_/-]+/);
|
|
84
|
+
const unique = new Set(words.filter((w) => w.length > 2 && !stopWords.has(w)));
|
|
85
|
+
return [...unique].sort();
|
|
86
|
+
}
|
|
87
|
+
function inferCategory(normalized, keywords) {
|
|
88
|
+
const all = normalized + ' ' + keywords.join(' ');
|
|
89
|
+
if (/\b(fix|bug|error|crash|broken|fail|issue|regression)\b/.test(all))
|
|
90
|
+
return 'bug_fix';
|
|
91
|
+
if (/\b(add|create|implement|new|build|introduce|feature)\b/.test(all))
|
|
92
|
+
return 'feature_add';
|
|
93
|
+
if (/\b(refactor|extract|cleanup|rename|reorganize|simplify|move)\b/.test(all))
|
|
94
|
+
return 'refactor';
|
|
95
|
+
if (/\b(test|spec|coverage|assertion|mock|stub|vitest|jest)\b/.test(all))
|
|
96
|
+
return 'test_update';
|
|
97
|
+
if (/\b(config|env|setting|deploy|ci|yaml|yml|json|toml)\b/.test(all))
|
|
98
|
+
return 'config';
|
|
99
|
+
return 'unknown';
|
|
100
|
+
}
|
|
101
|
+
function jaccardSimilarity(a, b) {
|
|
102
|
+
if (a.size === 0 && b.size === 0)
|
|
103
|
+
return 1.0;
|
|
104
|
+
let intersection = 0;
|
|
105
|
+
for (const item of a) {
|
|
106
|
+
if (b.has(item))
|
|
107
|
+
intersection++;
|
|
108
|
+
}
|
|
109
|
+
const union = a.size + b.size - intersection;
|
|
110
|
+
return union === 0 ? 0 : intersection / union;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=intent-signature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intent-signature.js","sourceRoot":"","sources":["../../src/iole/intent-signature.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IOLE — Outcome Score
|
|
3
|
+
*
|
|
4
|
+
* Tracks and computes outcome scores for agent iterations.
|
|
5
|
+
* Used to measure whether context expansion is producing improvement
|
|
6
|
+
* and to feed the success/fail prior back into the selector's scoring.
|
|
7
|
+
*
|
|
8
|
+
* Deterministic: arithmetic aggregation of recorded outcomes.
|
|
9
|
+
*/
|
|
10
|
+
import type { OutcomeScore, OutcomeRecord } from '@codeledger/types';
|
|
11
|
+
/**
|
|
12
|
+
* Compute the aggregate OutcomeScore from a sequence of recorded outcomes.
|
|
13
|
+
*
|
|
14
|
+
* The score tracks:
|
|
15
|
+
* - Overall pass rate
|
|
16
|
+
* - Iteration efficiency (pass on first vs Nth try)
|
|
17
|
+
* - Stability signal (consistent results vs oscillating)
|
|
18
|
+
* - Improvement trend (is each failure producing less severe errors?)
|
|
19
|
+
*/
|
|
20
|
+
export declare function computeOutcomeScore(records: OutcomeRecord[]): OutcomeScore;
|
|
21
|
+
/**
|
|
22
|
+
* Create a new OutcomeRecord for a completed iteration.
|
|
23
|
+
*/
|
|
24
|
+
export declare function recordIteration(taskId: string, iteration: number, passed: boolean, contextLevel: number, failureSeverity?: number): OutcomeRecord;
|
|
25
|
+
//# sourceMappingURL=outcome-score.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outcome-score.d.ts","sourceRoot":"","sources":["../../src/iole/outcome-score.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAIrE;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,YAAY,CAiD1E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,OAAO,EACf,YAAY,EAAE,MAAM,EACpB,eAAe,CAAC,EAAE,MAAM,GACvB,aAAa,CASf"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IOLE — Outcome Score
|
|
3
|
+
*
|
|
4
|
+
* Tracks and computes outcome scores for agent iterations.
|
|
5
|
+
* Used to measure whether context expansion is producing improvement
|
|
6
|
+
* and to feed the success/fail prior back into the selector's scoring.
|
|
7
|
+
*
|
|
8
|
+
* Deterministic: arithmetic aggregation of recorded outcomes.
|
|
9
|
+
*/
|
|
10
|
+
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
11
|
+
/**
|
|
12
|
+
* Compute the aggregate OutcomeScore from a sequence of recorded outcomes.
|
|
13
|
+
*
|
|
14
|
+
* The score tracks:
|
|
15
|
+
* - Overall pass rate
|
|
16
|
+
* - Iteration efficiency (pass on first vs Nth try)
|
|
17
|
+
* - Stability signal (consistent results vs oscillating)
|
|
18
|
+
* - Improvement trend (is each failure producing less severe errors?)
|
|
19
|
+
*/
|
|
20
|
+
export function computeOutcomeScore(records) {
|
|
21
|
+
if (records.length === 0) {
|
|
22
|
+
return {
|
|
23
|
+
pass_rate: 0,
|
|
24
|
+
total_iterations: 0,
|
|
25
|
+
first_pass_rate: 0,
|
|
26
|
+
stability_signal: 'unknown',
|
|
27
|
+
improvement_trend: 'flat',
|
|
28
|
+
retry_distribution: {},
|
|
29
|
+
last_updated: new Date().toISOString(),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const total = records.length;
|
|
33
|
+
const passed = records.filter((r) => r.passed).length;
|
|
34
|
+
const passRate = passed / total;
|
|
35
|
+
// First-pass rate: among tasks, what fraction passed on iteration 1?
|
|
36
|
+
const byTask = groupByTask(records);
|
|
37
|
+
let firstPassCount = 0;
|
|
38
|
+
let taskCount = 0;
|
|
39
|
+
const retryDist = {};
|
|
40
|
+
for (const taskRecords of byTask.values()) {
|
|
41
|
+
taskCount++;
|
|
42
|
+
const sorted = taskRecords.sort((a, b) => a.iteration - b.iteration);
|
|
43
|
+
const firstPass = sorted.findIndex((r) => r.passed);
|
|
44
|
+
const retries = firstPass === -1 ? sorted.length : firstPass;
|
|
45
|
+
retryDist[retries] = (retryDist[retries] ?? 0) + 1;
|
|
46
|
+
if (firstPass === 0)
|
|
47
|
+
firstPassCount++;
|
|
48
|
+
}
|
|
49
|
+
const firstPassRate = taskCount > 0 ? firstPassCount / taskCount : 0;
|
|
50
|
+
// Stability signal: are results consistent across iterations?
|
|
51
|
+
const stability = computeStabilitySignal(records);
|
|
52
|
+
// Improvement trend: are failures becoming less severe over time?
|
|
53
|
+
const trend = computeImprovementTrend(records);
|
|
54
|
+
return {
|
|
55
|
+
pass_rate: passRate,
|
|
56
|
+
total_iterations: total,
|
|
57
|
+
first_pass_rate: firstPassRate,
|
|
58
|
+
stability_signal: stability,
|
|
59
|
+
improvement_trend: trend,
|
|
60
|
+
retry_distribution: retryDist,
|
|
61
|
+
last_updated: new Date().toISOString(),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Create a new OutcomeRecord for a completed iteration.
|
|
66
|
+
*/
|
|
67
|
+
export function recordIteration(taskId, iteration, passed, contextLevel, failureSeverity) {
|
|
68
|
+
return {
|
|
69
|
+
task_id: taskId,
|
|
70
|
+
iteration,
|
|
71
|
+
passed,
|
|
72
|
+
context_level: contextLevel,
|
|
73
|
+
failure_severity: failureSeverity ?? 0,
|
|
74
|
+
recorded_at: new Date().toISOString(),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
78
|
+
function groupByTask(records) {
|
|
79
|
+
const byTask = new Map();
|
|
80
|
+
for (const r of records) {
|
|
81
|
+
const existing = byTask.get(r.task_id) ?? [];
|
|
82
|
+
existing.push(r);
|
|
83
|
+
byTask.set(r.task_id, existing);
|
|
84
|
+
}
|
|
85
|
+
return byTask;
|
|
86
|
+
}
|
|
87
|
+
function computeStabilitySignal(records) {
|
|
88
|
+
if (records.length < 3)
|
|
89
|
+
return 'unknown';
|
|
90
|
+
const results = records.map((r) => r.passed);
|
|
91
|
+
let transitions = 0;
|
|
92
|
+
for (let i = 1; i < results.length; i++) {
|
|
93
|
+
if (results[i] !== results[i - 1])
|
|
94
|
+
transitions++;
|
|
95
|
+
}
|
|
96
|
+
const transitionRate = transitions / (results.length - 1);
|
|
97
|
+
if (transitionRate > 0.5)
|
|
98
|
+
return 'oscillating';
|
|
99
|
+
// Check trend
|
|
100
|
+
const firstHalf = results.slice(0, Math.floor(results.length / 2));
|
|
101
|
+
const secondHalf = results.slice(Math.floor(results.length / 2));
|
|
102
|
+
const firstPassRate = firstHalf.filter(Boolean).length / firstHalf.length;
|
|
103
|
+
const secondPassRate = secondHalf.filter(Boolean).length / secondHalf.length;
|
|
104
|
+
if (secondPassRate > firstPassRate + 0.2)
|
|
105
|
+
return 'improving';
|
|
106
|
+
if (secondPassRate < firstPassRate - 0.2)
|
|
107
|
+
return 'degrading';
|
|
108
|
+
return 'stable';
|
|
109
|
+
}
|
|
110
|
+
function computeImprovementTrend(records) {
|
|
111
|
+
if (records.length < 2)
|
|
112
|
+
return 'flat';
|
|
113
|
+
const severities = records
|
|
114
|
+
.filter((r) => !r.passed && r.failure_severity !== undefined)
|
|
115
|
+
.map((r) => r.failure_severity ?? 0);
|
|
116
|
+
if (severities.length < 2)
|
|
117
|
+
return 'flat';
|
|
118
|
+
const first = severities.slice(0, Math.ceil(severities.length / 2));
|
|
119
|
+
const last = severities.slice(Math.floor(severities.length / 2));
|
|
120
|
+
const avgFirst = first.reduce((s, v) => s + v, 0) / first.length;
|
|
121
|
+
const avgLast = last.reduce((s, v) => s + v, 0) / last.length;
|
|
122
|
+
if (avgLast < avgFirst - 0.1)
|
|
123
|
+
return 'improving';
|
|
124
|
+
if (avgLast > avgFirst + 0.1)
|
|
125
|
+
return 'degrading';
|
|
126
|
+
return 'flat';
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=outcome-score.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outcome-score.js","sourceRoot":"","sources":["../../src/iole/outcome-score.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,iFAAiF;AAEjF;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAwB;IAC1D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,SAAS,EAAE,CAAC;YACZ,gBAAgB,EAAE,CAAC;YACnB,eAAe,EAAE,CAAC;YAClB,gBAAgB,EAAE,SAAS;YAC3B,iBAAiB,EAAE,MAAM;YACzB,kBAAkB,EAAE,EAAE;YACtB,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACvC,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IACtD,MAAM,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;IAEhC,qEAAqE;IACrE,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,SAAS,GAA2B,EAAE,CAAC;IAE7C,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QAC1C,SAAS,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;QACrE,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7D,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACnD,IAAI,SAAS,KAAK,CAAC;YAAE,cAAc,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,aAAa,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAErE,8DAA8D;IAC9D,MAAM,SAAS,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAElD,kEAAkE;IAClE,MAAM,KAAK,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAE/C,OAAO;QACL,SAAS,EAAE,QAAQ;QACnB,gBAAgB,EAAE,KAAK;QACvB,eAAe,EAAE,aAAa;QAC9B,gBAAgB,EAAE,SAAS;QAC3B,iBAAiB,EAAE,KAAK;QACxB,kBAAkB,EAAE,SAAS;QAC7B,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACvC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,MAAc,EACd,SAAiB,EACjB,MAAe,EACf,YAAoB,EACpB,eAAwB;IAExB,OAAO;QACL,OAAO,EAAE,MAAM;QACf,SAAS;QACT,MAAM;QACN,aAAa,EAAE,YAAY;QAC3B,gBAAgB,EAAE,eAAe,IAAI,CAAC;QACtC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACtC,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF,SAAS,WAAW,CAAC,OAAwB;IAC3C,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAC;IAClD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC7C,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAID,SAAS,sBAAsB,CAAC,OAAwB;IACtD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAEzC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC;YAAE,WAAW,EAAE,CAAC;IACnD,CAAC;IAED,MAAM,cAAc,GAAG,WAAW,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE1D,IAAI,cAAc,GAAG,GAAG;QAAE,OAAO,aAAa,CAAC;IAE/C,cAAc;IACd,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACjE,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;IAC1E,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAE7E,IAAI,cAAc,GAAG,aAAa,GAAG,GAAG;QAAE,OAAO,WAAW,CAAC;IAC7D,IAAI,cAAc,GAAG,aAAa,GAAG,GAAG;QAAE,OAAO,WAAW,CAAC;IAC7D,OAAO,QAAQ,CAAC;AAClB,CAAC;AAID,SAAS,uBAAuB,CAAC,OAAwB;IACvD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IAEtC,MAAM,UAAU,GAAG,OAAO;SACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,gBAAgB,KAAK,SAAS,CAAC;SAC5D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,CAAC;IAEvC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IAEzC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACpE,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IAEjE,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IACjE,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IAE9D,IAAI,OAAO,GAAG,QAAQ,GAAG,GAAG;QAAE,OAAO,WAAW,CAAC;IACjD,IAAI,OAAO,GAAG,QAAQ,GAAG,GAAG;QAAE,OAAO,WAAW,CAAC;IACjD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ISC (Intent Sufficiency Check) — public exports
|
|
3
|
+
*
|
|
4
|
+
* PRE-CONTEXT certification layer. Evaluates task prompt quality before
|
|
5
|
+
* context construction begins.
|
|
6
|
+
*/
|
|
7
|
+
export { checkIntentSufficiency, ISC_SUFFICIENT_THRESHOLD, ISC_WEAK_THRESHOLD } from './score.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/isc/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ISC (Intent Sufficiency Check) — public exports
|
|
3
|
+
*
|
|
4
|
+
* PRE-CONTEXT certification layer. Evaluates task prompt quality before
|
|
5
|
+
* context construction begins.
|
|
6
|
+
*/
|
|
7
|
+
export { checkIntentSufficiency, ISC_SUFFICIENT_THRESHOLD, ISC_WEAK_THRESHOLD } from './score.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/isc/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ISC — Intent Sufficiency Check
|
|
3
|
+
*
|
|
4
|
+
* PRE-CONTEXT certification layer. Evaluates whether a task prompt carries
|
|
5
|
+
* enough structured intent to justify context construction.
|
|
6
|
+
*
|
|
7
|
+
* Design principles:
|
|
8
|
+
* - Deterministic: same input → same output (no ML, no external calls)
|
|
9
|
+
* - Local-first: pure string analysis
|
|
10
|
+
* - Additive scoring: five independent factors summed with fixed weights
|
|
11
|
+
*
|
|
12
|
+
* Decision thresholds:
|
|
13
|
+
* SUFFICIENT ≥ 0.75 → proceed normally
|
|
14
|
+
* WEAK 0.50–0.74 → proceed with -0.05 CCS penalty
|
|
15
|
+
* INSUFFICIENT < 0.50 → block context construction; surface recommendations
|
|
16
|
+
*/
|
|
17
|
+
import type { IntentSufficiencyCheck } from '@codeledger/types';
|
|
18
|
+
export declare const ISC_SUFFICIENT_THRESHOLD = 0.75;
|
|
19
|
+
export declare const ISC_WEAK_THRESHOLD = 0.5;
|
|
20
|
+
/**
|
|
21
|
+
* Run the Intent Sufficiency Check on a task prompt.
|
|
22
|
+
*
|
|
23
|
+
* Returns a full IntentSufficiencyCheck with score, decision, per-factor
|
|
24
|
+
* breakdown, issues list, and actionable recommendations.
|
|
25
|
+
*/
|
|
26
|
+
export declare function checkIntentSufficiency(task: string): IntentSufficiencyCheck;
|
|
27
|
+
//# sourceMappingURL=score.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score.d.ts","sourceRoot":"","sources":["../../src/isc/score.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAA4B,MAAM,mBAAmB,CAAC;AAY1F,eAAO,MAAM,wBAAwB,OAAS,CAAC;AAC/C,eAAO,MAAM,kBAAkB,MAAe,CAAC;AAuG/C;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,sBAAsB,CA4D3E"}
|