@codeledger/selector 0.2.1 → 0.5.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/bundle-invalidation.d.ts +33 -0
- package/dist/bundle-invalidation.d.ts.map +1 -0
- package/dist/bundle-invalidation.js +98 -0
- package/dist/bundle-invalidation.js.map +1 -0
- package/dist/bundle.d.ts.map +1 -1
- package/dist/bundle.js +16 -4
- package/dist/bundle.js.map +1 -1
- package/dist/candidates.d.ts +18 -0
- package/dist/candidates.d.ts.map +1 -1
- package/dist/candidates.js +76 -2
- package/dist/candidates.js.map +1 -1
- package/dist/confidence.d.ts +2 -2
- package/dist/confidence.d.ts.map +1 -1
- package/dist/confidence.js +118 -2
- package/dist/confidence.js.map +1 -1
- package/dist/conflict-zones.d.ts +18 -0
- package/dist/conflict-zones.d.ts.map +1 -0
- package/dist/conflict-zones.js +66 -0
- package/dist/conflict-zones.js.map +1 -0
- package/dist/debt-detection.d.ts +15 -0
- package/dist/debt-detection.d.ts.map +1 -0
- package/dist/debt-detection.js +80 -0
- package/dist/debt-detection.js.map +1 -0
- package/dist/index.d.ts +10 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/intent/drift.d.ts +31 -0
- package/dist/intent/drift.d.ts.map +1 -0
- package/dist/intent/drift.js +120 -0
- package/dist/intent/drift.js.map +1 -0
- package/dist/intent/hash.d.ts +19 -0
- package/dist/intent/hash.d.ts.map +1 -0
- package/dist/intent/hash.js +38 -0
- package/dist/intent/hash.js.map +1 -0
- package/dist/intent/index.d.ts +5 -0
- package/dist/intent/index.d.ts.map +1 -0
- package/dist/intent/index.js +4 -0
- package/dist/intent/index.js.map +1 -0
- package/dist/intent/normalize.d.ts +23 -0
- package/dist/intent/normalize.d.ts.map +1 -0
- package/dist/intent/normalize.js +35 -0
- package/dist/intent/normalize.js.map +1 -0
- package/dist/intent/types.d.ts +37 -0
- package/dist/intent/types.d.ts.map +1 -0
- package/dist/intent/types.js +2 -0
- package/dist/intent/types.js.map +1 -0
- package/dist/loop-detection.d.ts +28 -0
- package/dist/loop-detection.d.ts.map +1 -0
- package/dist/loop-detection.js +124 -0
- package/dist/loop-detection.js.map +1 -0
- package/dist/scope-contract.d.ts +26 -0
- package/dist/scope-contract.d.ts.map +1 -0
- package/dist/scope-contract.js +79 -0
- package/dist/scope-contract.js.map +1 -0
- package/dist/scorer.d.ts.map +1 -1
- package/dist/scorer.js +21 -2
- package/dist/scorer.js.map +1 -1
- package/dist/security-surface.d.ts +13 -0
- package/dist/security-surface.d.ts.map +1 -0
- package/dist/security-surface.js +45 -0
- package/dist/security-surface.js.map +1 -0
- package/dist/task-type.d.ts.map +1 -1
- package/dist/task-type.js +4 -2
- package/dist/task-type.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { AddressedFile, BundleInvalidationReport } from '@codeledger/types';
|
|
2
|
+
/** Structured, normalized representation of the session's objective */
|
|
3
|
+
export interface TaskContractV1 {
|
|
4
|
+
version: 1;
|
|
5
|
+
objective: string;
|
|
6
|
+
deliverable: string | null;
|
|
7
|
+
scope_in: string[];
|
|
8
|
+
scope_out: string[];
|
|
9
|
+
constraints: string[];
|
|
10
|
+
acceptance_criteria: string[];
|
|
11
|
+
risk_flags: string[];
|
|
12
|
+
repo_paths_in_scope: string[];
|
|
13
|
+
timestamp: string;
|
|
14
|
+
}
|
|
15
|
+
export type DriftLevel = 'NONE' | 'MINOR' | 'MAJOR' | 'CRITICAL';
|
|
16
|
+
export interface DriftReason {
|
|
17
|
+
field: keyof Omit<TaskContractV1, 'version' | 'timestamp'>;
|
|
18
|
+
distance: number;
|
|
19
|
+
}
|
|
20
|
+
export interface DriftResult {
|
|
21
|
+
drift_score: number;
|
|
22
|
+
drift_level: DriftLevel;
|
|
23
|
+
reasons: DriftReason[];
|
|
24
|
+
}
|
|
25
|
+
/** Event record written to intent_drift.jsonl */
|
|
26
|
+
export interface IntentDriftEvent {
|
|
27
|
+
ts: string;
|
|
28
|
+
type: 'INTENT_DRIFT';
|
|
29
|
+
baseline_hash: string;
|
|
30
|
+
current_hash: string;
|
|
31
|
+
drift_score: number;
|
|
32
|
+
drift_level: DriftLevel;
|
|
33
|
+
reasons: DriftReason[];
|
|
34
|
+
recommended_action: 'NONE' | 'LOG_ONLY' | 'REFRESH_BUNDLE' | 'REQUIRE_ACK';
|
|
35
|
+
}
|
|
36
|
+
export type { AddressedFile, BundleInvalidationReport, };
|
|
37
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/intent/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAIjF,uEAAuE;AACvE,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;AAEjE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,IAAI,CAAC,cAAc,EAAE,SAAS,GAAG,WAAW,CAAC,CAAC;IAC3D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,UAAU,CAAC;IACxB,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,iDAAiD;AACjD,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,cAAc,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,UAAU,CAAC;IACxB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,kBAAkB,EAAE,MAAM,GAAG,UAAU,GAAG,gBAAgB,GAAG,aAAa,CAAC;CAC5E;AAGD,YAAY,EACV,aAAa,EACb,wBAAwB,GACzB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/intent/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { LoopDetectionConfig, LoopDetectionReport } from '@codeledger/types';
|
|
2
|
+
/** Default thresholds for loop detection */
|
|
3
|
+
export declare const DEFAULT_LOOP_THRESHOLDS: LoopDetectionConfig;
|
|
4
|
+
/** Entry in the session activity log — tracks tool usage for pattern detection */
|
|
5
|
+
export interface ActivityEntry {
|
|
6
|
+
type: 'test_run' | 'file_edit' | 'command';
|
|
7
|
+
target: string;
|
|
8
|
+
success: boolean;
|
|
9
|
+
/** Hash of failure output for duplicate detection */
|
|
10
|
+
output_hash?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Analyze a session's activity log for stuck patterns.
|
|
14
|
+
*
|
|
15
|
+
* All detection is numeric and deterministic — pattern matching on
|
|
16
|
+
* activity sequences with configurable thresholds.
|
|
17
|
+
*/
|
|
18
|
+
export declare function detectStuckPatterns(activities: ActivityEntry[], config?: LoopDetectionConfig): LoopDetectionReport;
|
|
19
|
+
/**
|
|
20
|
+
* Parse git log and diff output into activity entries for loop detection.
|
|
21
|
+
* This enables post-hoc analysis from git state without requiring
|
|
22
|
+
* real-time event ledger integration.
|
|
23
|
+
*/
|
|
24
|
+
export declare function buildActivityLogFromGit(_commitLog: string[], fileEdits: Map<string, number>, testResults: Array<{
|
|
25
|
+
name: string;
|
|
26
|
+
pass: boolean;
|
|
27
|
+
}>): ActivityEntry[];
|
|
28
|
+
//# sourceMappingURL=loop-detection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-detection.d.ts","sourceRoot":"","sources":["../src/loop-detection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAgB,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAEhG,4CAA4C;AAC5C,eAAO,MAAM,uBAAuB,EAAE,mBAIrC,CAAC;AAEF,kFAAkF;AAClF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,UAAU,GAAG,WAAW,GAAG,SAAS,CAAC;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,aAAa,EAAE,EAC3B,MAAM,GAAE,mBAA6C,GACpD,mBAAmB,CAqDrB;AA8DD;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAAE,EACpB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,WAAW,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,GAClD,aAAa,EAAE,CAoBjB"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/** Default thresholds for loop detection */
|
|
2
|
+
export const DEFAULT_LOOP_THRESHOLDS = {
|
|
3
|
+
max_test_retries: 3,
|
|
4
|
+
max_file_edits: 5,
|
|
5
|
+
max_command_retries: 3,
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Analyze a session's activity log for stuck patterns.
|
|
9
|
+
*
|
|
10
|
+
* All detection is numeric and deterministic — pattern matching on
|
|
11
|
+
* activity sequences with configurable thresholds.
|
|
12
|
+
*/
|
|
13
|
+
export function detectStuckPatterns(activities, config = DEFAULT_LOOP_THRESHOLDS) {
|
|
14
|
+
const episodes = [];
|
|
15
|
+
// 1. Repeated test failures without progress
|
|
16
|
+
const testFailStreaks = detectRepeatedFailures(activities.filter((a) => a.type === 'test_run'), config.max_test_retries);
|
|
17
|
+
for (const streak of testFailStreaks) {
|
|
18
|
+
episodes.push({
|
|
19
|
+
type: 'repeated_test_failure',
|
|
20
|
+
target: streak.target,
|
|
21
|
+
count: streak.count,
|
|
22
|
+
message: `Test "${streak.target}" failed ${streak.count} consecutive times with no file changes between runs`,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
// 2. Same file edited excessively
|
|
26
|
+
const fileEditCounts = new Map();
|
|
27
|
+
for (const a of activities) {
|
|
28
|
+
if (a.type === 'file_edit') {
|
|
29
|
+
fileEditCounts.set(a.target, (fileEditCounts.get(a.target) ?? 0) + 1);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
for (const [file, count] of fileEditCounts) {
|
|
33
|
+
if (count > config.max_file_edits) {
|
|
34
|
+
episodes.push({
|
|
35
|
+
type: 'repeated_file_edit',
|
|
36
|
+
target: file,
|
|
37
|
+
count,
|
|
38
|
+
message: `File "${file}" was edited ${count} times (threshold: ${config.max_file_edits})`,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// 3. Same command fails repeatedly with identical output
|
|
43
|
+
const commandFailStreaks = detectRepeatedCommandFailures(activities.filter((a) => a.type === 'command'), config.max_command_retries);
|
|
44
|
+
for (const streak of commandFailStreaks) {
|
|
45
|
+
episodes.push({
|
|
46
|
+
type: 'repeated_command_failure',
|
|
47
|
+
target: streak.target,
|
|
48
|
+
count: streak.count,
|
|
49
|
+
message: `Command "${streak.target}" failed ${streak.count} times with identical output`,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
stuck_episodes: episodes,
|
|
54
|
+
total_episodes: episodes.length,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Find sequences of test failures with no intervening file changes.
|
|
59
|
+
* A file_edit activity between test runs resets the counter.
|
|
60
|
+
*/
|
|
61
|
+
function detectRepeatedFailures(testActivities, threshold) {
|
|
62
|
+
const streaks = [];
|
|
63
|
+
const currentStreak = new Map();
|
|
64
|
+
for (const a of testActivities) {
|
|
65
|
+
if (!a.success) {
|
|
66
|
+
const count = (currentStreak.get(a.target) ?? 0) + 1;
|
|
67
|
+
currentStreak.set(a.target, count);
|
|
68
|
+
if (count >= threshold) {
|
|
69
|
+
// Only report once per target at the threshold
|
|
70
|
+
if (count === threshold) {
|
|
71
|
+
streaks.push({ target: a.target, count });
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
// Test passed — reset streak for this target
|
|
77
|
+
currentStreak.delete(a.target);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return streaks;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Find commands that fail repeatedly with the same output hash.
|
|
84
|
+
*/
|
|
85
|
+
function detectRepeatedCommandFailures(commandActivities, threshold) {
|
|
86
|
+
const streaks = [];
|
|
87
|
+
// Group by target + output_hash
|
|
88
|
+
const failCounts = new Map();
|
|
89
|
+
for (const a of commandActivities) {
|
|
90
|
+
if (!a.success && a.output_hash) {
|
|
91
|
+
const key = `${a.target}::${a.output_hash}`;
|
|
92
|
+
const count = (failCounts.get(key) ?? 0) + 1;
|
|
93
|
+
failCounts.set(key, count);
|
|
94
|
+
if (count === threshold) {
|
|
95
|
+
streaks.push({ target: a.target, count });
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return streaks;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Parse git log and diff output into activity entries for loop detection.
|
|
103
|
+
* This enables post-hoc analysis from git state without requiring
|
|
104
|
+
* real-time event ledger integration.
|
|
105
|
+
*/
|
|
106
|
+
export function buildActivityLogFromGit(_commitLog, fileEdits, testResults) {
|
|
107
|
+
const activities = [];
|
|
108
|
+
// Add file edits
|
|
109
|
+
for (const [file, count] of fileEdits) {
|
|
110
|
+
for (let i = 0; i < count; i++) {
|
|
111
|
+
activities.push({ type: 'file_edit', target: file, success: true });
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Add test results
|
|
115
|
+
for (const result of testResults) {
|
|
116
|
+
activities.push({
|
|
117
|
+
type: 'test_run',
|
|
118
|
+
target: result.name,
|
|
119
|
+
success: result.pass,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
return activities;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=loop-detection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-detection.js","sourceRoot":"","sources":["../src/loop-detection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ContextBundle, DepGraph, ScopeContract } from '@codeledger/types';
|
|
2
|
+
/**
|
|
3
|
+
* Derive a deterministic scope contract from a bundle.
|
|
4
|
+
*
|
|
5
|
+
* The scope contract defines which files are "in scope" for an agent session:
|
|
6
|
+
* - bundle_files: files directly selected by the scoring algorithm
|
|
7
|
+
* - neighbor_files: direct dependency neighbors (imports + dependents) of bundle files
|
|
8
|
+
*
|
|
9
|
+
* Any file edit outside this contract is considered "scope drift."
|
|
10
|
+
*/
|
|
11
|
+
export declare function deriveScopeContract(bundle: ContextBundle, depGraph: DepGraph, enforcement?: 'warn' | 'strict' | 'off'): ScopeContract;
|
|
12
|
+
/**
|
|
13
|
+
* Check whether a file path is within the scope contract.
|
|
14
|
+
* Returns true if the file is in-scope (either bundle file or neighbor).
|
|
15
|
+
*/
|
|
16
|
+
export declare function isInScope(filePath: string, contract: ScopeContract): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Check a list of changed files against the scope contract.
|
|
19
|
+
* Returns files that are outside the contract.
|
|
20
|
+
*/
|
|
21
|
+
export declare function detectScopeDrift(changedFiles: string[], contract: ScopeContract): string[];
|
|
22
|
+
/**
|
|
23
|
+
* Format the scope contract for inclusion in active-bundle.md.
|
|
24
|
+
*/
|
|
25
|
+
export declare function renderScopeContractMarkdown(contract: ScopeContract): string;
|
|
26
|
+
//# sourceMappingURL=scope-contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope-contract.d.ts","sourceRoot":"","sources":["../src/scope-contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEhF;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,QAAQ,EAClB,WAAW,GAAE,MAAM,GAAG,QAAQ,GAAG,KAAc,GAC9C,aAAa,CAoBf;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO,CAK5E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,EAAE,EACtB,QAAQ,EAAE,aAAa,GACtB,MAAM,EAAE,CAGV;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAgC3E"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Derive a deterministic scope contract from a bundle.
|
|
3
|
+
*
|
|
4
|
+
* The scope contract defines which files are "in scope" for an agent session:
|
|
5
|
+
* - bundle_files: files directly selected by the scoring algorithm
|
|
6
|
+
* - neighbor_files: direct dependency neighbors (imports + dependents) of bundle files
|
|
7
|
+
*
|
|
8
|
+
* Any file edit outside this contract is considered "scope drift."
|
|
9
|
+
*/
|
|
10
|
+
export function deriveScopeContract(bundle, depGraph, enforcement = 'warn') {
|
|
11
|
+
const bundlePaths = new Set(bundle.files.map((f) => f.path));
|
|
12
|
+
// Collect dependency neighbors (one hop) of bundle files
|
|
13
|
+
const neighborPaths = new Set();
|
|
14
|
+
for (const filePath of bundlePaths) {
|
|
15
|
+
const imports = depGraph.imports[filePath] ?? [];
|
|
16
|
+
const dependents = depGraph.dependents[filePath] ?? [];
|
|
17
|
+
for (const dep of [...imports, ...dependents]) {
|
|
18
|
+
if (!bundlePaths.has(dep)) {
|
|
19
|
+
neighborPaths.add(dep);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
bundle_files: [...bundlePaths],
|
|
25
|
+
neighbor_files: [...neighborPaths],
|
|
26
|
+
enforcement,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Check whether a file path is within the scope contract.
|
|
31
|
+
* Returns true if the file is in-scope (either bundle file or neighbor).
|
|
32
|
+
*/
|
|
33
|
+
export function isInScope(filePath, contract) {
|
|
34
|
+
return (contract.bundle_files.includes(filePath)
|
|
35
|
+
|| contract.neighbor_files.includes(filePath));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Check a list of changed files against the scope contract.
|
|
39
|
+
* Returns files that are outside the contract.
|
|
40
|
+
*/
|
|
41
|
+
export function detectScopeDrift(changedFiles, contract) {
|
|
42
|
+
const scopeSet = new Set([...contract.bundle_files, ...contract.neighbor_files]);
|
|
43
|
+
return changedFiles.filter((f) => !scopeSet.has(f));
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Format the scope contract for inclusion in active-bundle.md.
|
|
47
|
+
*/
|
|
48
|
+
export function renderScopeContractMarkdown(contract) {
|
|
49
|
+
if (contract.enforcement === 'off')
|
|
50
|
+
return '';
|
|
51
|
+
const lines = [];
|
|
52
|
+
lines.push('## Scope Contract');
|
|
53
|
+
lines.push('');
|
|
54
|
+
lines.push(`*Enforcement: ${contract.enforcement}*`);
|
|
55
|
+
lines.push('');
|
|
56
|
+
lines.push(`Files in scope: ${contract.bundle_files.length} bundle + ${contract.neighbor_files.length} neighbors`);
|
|
57
|
+
lines.push('');
|
|
58
|
+
if (contract.enforcement === 'strict') {
|
|
59
|
+
lines.push('> **Strict mode:** Edits to files outside this scope will be flagged.');
|
|
60
|
+
lines.push('');
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
lines.push('> **Warn mode:** Edits to files outside this scope generate a warning.');
|
|
64
|
+
lines.push('');
|
|
65
|
+
}
|
|
66
|
+
// List neighbor files (bundle files are already listed in the main section)
|
|
67
|
+
if (contract.neighbor_files.length > 0) {
|
|
68
|
+
lines.push('**Dependency neighbors (extended scope):**');
|
|
69
|
+
for (const f of contract.neighbor_files.slice(0, 20)) {
|
|
70
|
+
lines.push(`- \`${f}\``);
|
|
71
|
+
}
|
|
72
|
+
if (contract.neighbor_files.length > 20) {
|
|
73
|
+
lines.push(`- ... and ${contract.neighbor_files.length - 20} more`);
|
|
74
|
+
}
|
|
75
|
+
lines.push('');
|
|
76
|
+
}
|
|
77
|
+
return lines.join('\n');
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=scope-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope-contract.js","sourceRoot":"","sources":["../src/scope-contract.ts"],"names":[],"mappings":"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"}
|
package/dist/scorer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scorer.d.ts","sourceRoot":"","sources":["../src/scorer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,UAAU,EACV,eAAe,EACf,UAAU,EACX,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"scorer.d.ts","sourceRoot":"","sources":["../src/scorer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,UAAU,EACV,eAAe,EACf,UAAU,EACX,MAAM,mBAAmB,CAAC;AAG3B,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACzB;AAkCD,wBAAgB,eAAe,CAC7B,IAAI,EAAE,QAAQ,EACd,YAAY,EAAE,MAAM,EAAE,EACtB,SAAS,EAAE,SAAS,EACpB,WAAW,CAAC,EAAE,WAAW,EACzB,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAClC,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAC/B,YAAY,CA+Hd;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,GAAG,YAAY,CAoBzE;AAED,wBAAgB,SAAS,CACvB,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,eAAe,GACvB,MAAM,CAcR;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,GAAG,UAAU,EAAE,CAiBlE;AAED,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,YAAY,EAAE,MAAM,EAAE,EACtB,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,eAAe,EACxB,WAAW,CAAC,EAAE,WAAW,EACzB,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAClC,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EACzB,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EAChC,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GACzB,UAAU,EAAE,CA2Cd"}
|
package/dist/scorer.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { detectSecuritySurface } from './security-surface.js';
|
|
1
2
|
/** Path/name patterns that indicate error infrastructure files */
|
|
2
3
|
const ERROR_INFRA_PATTERNS = [
|
|
3
4
|
'error', 'exception', 'validation', 'validator', 'schema',
|
|
@@ -86,7 +87,14 @@ export function computeFeatures(file, taskKeywords, repoIndex, ledgerStats, toke
|
|
|
86
87
|
// TEST_RELEV: graduated test relevance based on test file richness.
|
|
87
88
|
// Instead of binary 0/1, tests with more assertions, describe blocks, and
|
|
88
89
|
// error handling patterns score higher — they're more valuable context.
|
|
90
|
+
//
|
|
91
|
+
// Two signals:
|
|
92
|
+
// 1. test_map presence: file has known test mappings (source↔test pairs)
|
|
93
|
+
// 2. Path-based detection: file IS a test file (.test., .spec., __tests__/)
|
|
94
|
+
// This catches test files that weren't discovered by test_map scanning.
|
|
89
95
|
const testMappings = repoIndex.test_map.filter((m) => m.source_file === file.path || m.test_file === file.path);
|
|
96
|
+
const isTestFile = /[./](?:test|spec)\.[^/]+$/.test(pathLower) ||
|
|
97
|
+
pathLower.includes('__tests__/');
|
|
90
98
|
let test_relevance = 0;
|
|
91
99
|
if (testMappings.length > 0) {
|
|
92
100
|
// Base score for having a test mapping
|
|
@@ -94,6 +102,10 @@ export function computeFeatures(file, taskKeywords, repoIndex, ledgerStats, toke
|
|
|
94
102
|
// Bonus based on number of test mappings (more coverage = higher relevance)
|
|
95
103
|
test_relevance += Math.min(0.5, testMappings.length * 0.25);
|
|
96
104
|
}
|
|
105
|
+
else if (isTestFile) {
|
|
106
|
+
// Path-based fallback: file looks like a test file but has no test_map entry
|
|
107
|
+
test_relevance = 0.4;
|
|
108
|
+
}
|
|
97
109
|
// SIZE_PEN: penalty for large files
|
|
98
110
|
const size_penalty = Math.max(0, Math.min(1, file.lines / 1000));
|
|
99
111
|
// SUCCESS_PRIOR / FAIL_PRIOR from ledger
|
|
@@ -103,6 +115,8 @@ export function computeFeatures(file, taskKeywords, repoIndex, ledgerStats, toke
|
|
|
103
115
|
const error_infrastructure = detectErrorInfrastructure(file);
|
|
104
116
|
// BRANCH_CHANGED: work-in-progress awareness — boost files on the current branch
|
|
105
117
|
const branch_changed = branchChangedFiles?.has(file.path) ? 1.0 : 0;
|
|
118
|
+
// SECURITY_SURFACE: detect security-sensitive files (auth, crypto, validation, routes)
|
|
119
|
+
const security_surface = detectSecuritySurface(file);
|
|
106
120
|
return {
|
|
107
121
|
keyword,
|
|
108
122
|
centrality,
|
|
@@ -114,6 +128,7 @@ export function computeFeatures(file, taskKeywords, repoIndex, ledgerStats, toke
|
|
|
114
128
|
fail_prior,
|
|
115
129
|
error_infrastructure,
|
|
116
130
|
branch_changed,
|
|
131
|
+
security_surface,
|
|
117
132
|
_hasContentMatch,
|
|
118
133
|
};
|
|
119
134
|
}
|
|
@@ -162,7 +177,8 @@ export function scoreFile(features, weights) {
|
|
|
162
177
|
features.success_prior * weights.success_prior -
|
|
163
178
|
features.fail_prior * weights.fail_prior +
|
|
164
179
|
features.error_infrastructure * (weights.error_infrastructure ?? 0.08) +
|
|
165
|
-
features.branch_changed * (weights.branch_changed ?? 0)
|
|
180
|
+
features.branch_changed * (weights.branch_changed ?? 0) +
|
|
181
|
+
(features.security_surface ?? 0) * (weights.security_surface ?? 0));
|
|
166
182
|
}
|
|
167
183
|
export function deriveReasons(features) {
|
|
168
184
|
const reasons = [];
|
|
@@ -188,6 +204,8 @@ export function deriveReasons(features) {
|
|
|
188
204
|
reasons.push('error_infrastructure');
|
|
189
205
|
if (features.branch_changed > 0)
|
|
190
206
|
reasons.push('branch_changed');
|
|
207
|
+
if ((features.security_surface ?? 0) > 0)
|
|
208
|
+
reasons.push('security_surface');
|
|
191
209
|
return reasons;
|
|
192
210
|
}
|
|
193
211
|
export function scoreAllCandidates(candidates, taskKeywords, repoIndex, weights, ledgerStats, tokenWeights, fanoutFiles, branchChangedFiles, surfaceFiles) {
|
|
@@ -199,11 +217,12 @@ export function scoreAllCandidates(candidates, taskKeywords, repoIndex, weights,
|
|
|
199
217
|
continue;
|
|
200
218
|
const rawFeatures = computeFeatures(file, taskKeywords, repoIndex, ledgerStats, tokenWeights, branchChangedFiles);
|
|
201
219
|
const gated = gateTemporalFeatures(rawFeatures);
|
|
202
|
-
// Preserve _hasContentMatch and
|
|
220
|
+
// Preserve _hasContentMatch, branch_changed, and security_surface through gating for reason derivation
|
|
203
221
|
const features = {
|
|
204
222
|
...gated,
|
|
205
223
|
_hasContentMatch: rawFeatures._hasContentMatch,
|
|
206
224
|
branch_changed: rawFeatures.branch_changed,
|
|
225
|
+
security_surface: rawFeatures.security_surface,
|
|
207
226
|
};
|
|
208
227
|
let score = scoreFile(features, weights);
|
|
209
228
|
const reasons = deriveReasons(features);
|
package/dist/scorer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scorer.js","sourceRoot":"","sources":["../src/scorer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scorer.js","sourceRoot":"","sources":["../src/scorer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { FileInfo } from '@codeledger/types';
|
|
2
|
+
/**
|
|
3
|
+
* Detect whether a file is security-sensitive based on naming patterns.
|
|
4
|
+
* Checks both directory segments and basename stems in the file path.
|
|
5
|
+
* Returns 1.0 for security-relevant files, 0 otherwise.
|
|
6
|
+
*/
|
|
7
|
+
export declare function detectSecuritySurface(file: FileInfo): number;
|
|
8
|
+
/**
|
|
9
|
+
* Check whether the task description mentions security-related concerns.
|
|
10
|
+
* When true, the security_surface weight should be boosted.
|
|
11
|
+
*/
|
|
12
|
+
export declare function isSecurityTask(taskKeywords: string[]): boolean;
|
|
13
|
+
//# sourceMappingURL=security-surface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-surface.d.ts","sourceRoot":"","sources":["../src/security-surface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAqBlD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAoB5D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAE9D"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/** Filename/path patterns indicating security-sensitive files */
|
|
2
|
+
const SECURITY_PATH_PATTERNS = [
|
|
3
|
+
'auth', 'login', 'logout', 'session', 'oauth', 'jwt', 'token',
|
|
4
|
+
'crypt', 'hash', 'secret', 'password', 'credential',
|
|
5
|
+
'validat', 'sanitiz', 'escap',
|
|
6
|
+
'query', 'sql', 'database', 'migration',
|
|
7
|
+
'route', 'controller', 'endpoint', 'middleware',
|
|
8
|
+
'permission', 'rbac', 'acl', 'role',
|
|
9
|
+
'csrf', 'cors', 'helmet', 'rate-limit',
|
|
10
|
+
];
|
|
11
|
+
/** Task keywords that should boost security_surface weight */
|
|
12
|
+
const SECURITY_TASK_KEYWORDS = new Set([
|
|
13
|
+
'security', 'secure', 'audit', 'vulnerability', 'vulnerabilities',
|
|
14
|
+
'injection', 'xss', 'csrf', 'auth', 'authentication', 'authorization',
|
|
15
|
+
'encrypt', 'decrypt', 'hash', 'password', 'credential', 'token',
|
|
16
|
+
'sanitize', 'escape', 'validate', 'permission', 'privilege',
|
|
17
|
+
]);
|
|
18
|
+
/**
|
|
19
|
+
* Detect whether a file is security-sensitive based on naming patterns.
|
|
20
|
+
* Checks both directory segments and basename stems in the file path.
|
|
21
|
+
* Returns 1.0 for security-relevant files, 0 otherwise.
|
|
22
|
+
*/
|
|
23
|
+
export function detectSecuritySurface(file) {
|
|
24
|
+
const pathLower = file.path.toLowerCase();
|
|
25
|
+
const segments = pathLower.split('/');
|
|
26
|
+
// Extract all stems: directory names + basename stems (split on - and _)
|
|
27
|
+
const allStems = [];
|
|
28
|
+
for (const segment of segments) {
|
|
29
|
+
const clean = segment.replace(/\.\w+$/, '');
|
|
30
|
+
for (const stem of clean.split(/[-_]/)) {
|
|
31
|
+
if (stem.length > 0)
|
|
32
|
+
allStems.push(stem);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const isSecurityRelevant = allStems.some((stem) => SECURITY_PATH_PATTERNS.some((pat) => stem === pat || stem === pat + 's' || stem.startsWith(pat)));
|
|
36
|
+
return isSecurityRelevant ? 1.0 : 0;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Check whether the task description mentions security-related concerns.
|
|
40
|
+
* When true, the security_surface weight should be boosted.
|
|
41
|
+
*/
|
|
42
|
+
export function isSecurityTask(taskKeywords) {
|
|
43
|
+
return taskKeywords.some((kw) => SECURITY_TASK_KEYWORDS.has(kw));
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=security-surface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-surface.js","sourceRoot":"","sources":["../src/security-surface.ts"],"names":[],"mappings":"AAEA,iEAAiE;AACjE,MAAM,sBAAsB,GAAG;IAC7B,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO;IAC7D,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY;IACnD,SAAS,EAAE,SAAS,EAAE,OAAO;IAC7B,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW;IACvC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY;IAC/C,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IACnC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY;CACvC,CAAC;AAEF,8DAA8D;AAC9D,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IACrC,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,iBAAiB;IACjE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,eAAe;IACrE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO;IAC/D,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW;CAC5D,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAc;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEtC,yEAAyE;IACzE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC5C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YACvC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;gBAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,MAAM,kBAAkB,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAChD,sBAAsB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAClC,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAC3D,CACF,CAAC;IAEF,OAAO,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,YAAsB;IACnD,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,sBAAsB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AACnE,CAAC"}
|
package/dist/task-type.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-type.d.ts","sourceRoot":"","sources":["../src/task-type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD;;;;;;;;;;;;;;GAcG;AAEH,MAAM,MAAM,QAAQ,GAChB,SAAS,GACT,aAAa,GACb,UAAU,GACV,aAAa,GACb,QAAQ,GACR,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"task-type.d.ts","sourceRoot":"","sources":["../src/task-type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD;;;;;;;;;;;;;;GAcG;AAEH,MAAM,MAAM,QAAQ,GAChB,SAAS,GACT,aAAa,GACb,UAAU,GACV,aAAa,GACb,QAAQ,GACR,SAAS,CAAC;AA+Bd;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAmCxD;AAqCD;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,eAAe,EAC5B,QAAQ,EAAE,QAAQ,GACjB,eAAe,CAYjB"}
|
package/dist/task-type.js
CHANGED
|
@@ -15,6 +15,7 @@ const REFACTOR_PATTERNS = [
|
|
|
15
15
|
const TEST_UPDATE_PATTERNS = [
|
|
16
16
|
'test', 'tests', 'testing', 'spec', 'specs', 'coverage', 'assertion',
|
|
17
17
|
'mock', 'stub', 'fixture', 'jest', 'vitest', 'mocha', 'e2e',
|
|
18
|
+
'run', 'execute', 'validate', 'verify',
|
|
18
19
|
];
|
|
19
20
|
const CONFIG_PATTERNS = [
|
|
20
21
|
'config', 'configuration', 'settings', 'setup', 'env', 'environment',
|
|
@@ -84,9 +85,10 @@ const WEIGHT_ADJUSTMENTS = {
|
|
|
84
85
|
size_penalty: 0.7,
|
|
85
86
|
},
|
|
86
87
|
test_update: {
|
|
87
|
-
test_relevance:
|
|
88
|
+
test_relevance: 2.5,
|
|
88
89
|
keyword: 1.2,
|
|
89
|
-
|
|
90
|
+
centrality: 0.5,
|
|
91
|
+
churn: 0.5,
|
|
90
92
|
},
|
|
91
93
|
config: {
|
|
92
94
|
keyword: 1.3,
|
package/dist/task-type.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-type.js","sourceRoot":"","sources":["../src/task-type.ts"],"names":[],"mappings":"AA0BA,MAAM,gBAAgB,GAAG;IACvB,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM;IAClE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY;IACtE,OAAO,EAAE,QAAQ;CAClB,CAAC;AAEF,MAAM,oBAAoB,GAAG;IAC3B,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU;IACrE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS;CAC/D,CAAC;AAEF,MAAM,iBAAiB,GAAG;IACxB,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS;IACvE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU;IAC7D,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;CACxD,CAAC;AAEF,MAAM,oBAAoB,GAAG;IAC3B,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW;IACpE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK;
|
|
1
|
+
{"version":3,"file":"task-type.js","sourceRoot":"","sources":["../src/task-type.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codeledger/selector",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Deterministic context selection algorithm for CodeLedger",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
}
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@codeledger/types": "0.
|
|
27
|
+
"@codeledger/types": "0.5.0"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"typescript": "^5.4.0"
|