@codeledger/selector 0.1.1

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.
@@ -0,0 +1,9 @@
1
+ import type { BundleFile, DepGraph } from '@codeledger/types';
2
+ /**
3
+ * Extract lightweight interface stubs for files that are imported by bundle files
4
+ * but didn't make the cut. These stubs contain only exported type signatures —
5
+ * interfaces, type aliases, function signatures, and class declarations — giving
6
+ * the agent the contract without the token cost of the full file.
7
+ */
8
+ export declare function generateInterfaceStubs(root: string, selectedPaths: Set<string>, depGraph: DepGraph, maxStubs: number, tokenBudgetRemaining: number): BundleFile[];
9
+ //# sourceMappingURL=stubs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stubs.d.ts","sourceRoot":"","sources":["../src/stubs.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAc,MAAM,mBAAmB,CAAC;AAE1E;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,EAC1B,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,MAAM,EAChB,oBAAoB,EAAE,MAAM,GAC3B,UAAU,EAAE,CAuDd"}
package/dist/stubs.js ADDED
@@ -0,0 +1,161 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ /**
4
+ * Extract lightweight interface stubs for files that are imported by bundle files
5
+ * but didn't make the cut. These stubs contain only exported type signatures —
6
+ * interfaces, type aliases, function signatures, and class declarations — giving
7
+ * the agent the contract without the token cost of the full file.
8
+ */
9
+ export function generateInterfaceStubs(root, selectedPaths, depGraph, maxStubs, tokenBudgetRemaining) {
10
+ // Find files imported by selected files that aren't already selected
11
+ const stubCandidates = new Map(); // path → reference count
12
+ for (const selected of selectedPaths) {
13
+ const imports = depGraph.imports[selected] ?? [];
14
+ for (const dep of imports) {
15
+ if (!selectedPaths.has(dep)) {
16
+ stubCandidates.set(dep, (stubCandidates.get(dep) ?? 0) + 1);
17
+ }
18
+ }
19
+ }
20
+ if (stubCandidates.size === 0)
21
+ return [];
22
+ // Sort by reference count descending — most-referenced unselected files first
23
+ const sorted = [...stubCandidates.entries()]
24
+ .sort((a, b) => b[1] - a[1])
25
+ .slice(0, maxStubs);
26
+ const stubs = [];
27
+ let tokensUsed = 0;
28
+ const TOKENS_PER_LINE = 4;
29
+ for (const [filePath] of sorted) {
30
+ const absPath = join(root, filePath);
31
+ let content;
32
+ try {
33
+ content = readFileSync(absPath, 'utf-8');
34
+ }
35
+ catch {
36
+ continue;
37
+ }
38
+ const stubContent = extractTypeSignatures(content, filePath);
39
+ if (!stubContent)
40
+ continue;
41
+ const lines = stubContent.split('\n').length;
42
+ const tokenEstimate = lines * TOKENS_PER_LINE;
43
+ if (tokensUsed + tokenEstimate > tokenBudgetRemaining)
44
+ continue;
45
+ const reasons = ['interface_stub'];
46
+ stubs.push({
47
+ path: filePath,
48
+ score: 0,
49
+ reasons,
50
+ excerpt_spans: null,
51
+ content: stubContent,
52
+ token_estimate: tokenEstimate,
53
+ is_stub: true,
54
+ });
55
+ tokensUsed += tokenEstimate;
56
+ }
57
+ return stubs;
58
+ }
59
+ /**
60
+ * Extract only exported type-surface declarations from a file's content.
61
+ * Returns a condensed stub showing interfaces, types, enums, function signatures,
62
+ * and class declarations — no implementation bodies.
63
+ */
64
+ function extractTypeSignatures(content, _filePath) {
65
+ const lines = content.split('\n');
66
+ const stubLines = [];
67
+ let i = 0;
68
+ while (i < lines.length) {
69
+ const line = lines[i];
70
+ const trimmed = line.trim();
71
+ // Match exported type declarations
72
+ if (isExportedTypeDecl(trimmed)) {
73
+ // For block declarations (interface, enum, class), capture the whole block
74
+ if (trimmed.includes('{') && !trimmed.includes('}')) {
75
+ const blockLines = captureBlock(lines, i);
76
+ stubLines.push(...blockLines);
77
+ i += blockLines.length;
78
+ continue;
79
+ }
80
+ // Single-line type alias or one-line interface
81
+ stubLines.push(line);
82
+ i++;
83
+ continue;
84
+ }
85
+ // Match exported function signatures (extract signature only, not body)
86
+ if (isExportedFunctionDecl(trimmed)) {
87
+ const sigLine = extractFunctionSignature(lines, i);
88
+ stubLines.push(sigLine);
89
+ // Skip past the function body
90
+ i = skipBlock(lines, i);
91
+ continue;
92
+ }
93
+ i++;
94
+ }
95
+ if (stubLines.length === 0)
96
+ return null;
97
+ return `// Interface stub (auto-generated by CodeLedger)\n${stubLines.join('\n')}`;
98
+ }
99
+ function isExportedTypeDecl(trimmed) {
100
+ const afterExport = trimmed.startsWith('export ')
101
+ ? trimmed.slice(7).replace(/^default\s+/, '')
102
+ : null;
103
+ if (!afterExport)
104
+ return false;
105
+ return (afterExport.startsWith('interface ') ||
106
+ afterExport.startsWith('type ') ||
107
+ afterExport.startsWith('enum '));
108
+ }
109
+ function isExportedFunctionDecl(trimmed) {
110
+ if (!trimmed.startsWith('export '))
111
+ return false;
112
+ const rest = trimmed.slice(7).replace(/^default\s+/, '').replace(/^async\s+/, '');
113
+ return rest.startsWith('function ');
114
+ }
115
+ function captureBlock(lines, startIdx) {
116
+ const result = [];
117
+ let depth = 0;
118
+ for (let i = startIdx; i < lines.length && i < startIdx + 50; i++) {
119
+ const line = lines[i];
120
+ result.push(line);
121
+ for (const ch of line) {
122
+ if (ch === '{')
123
+ depth++;
124
+ if (ch === '}')
125
+ depth--;
126
+ }
127
+ if (depth <= 0 && i > startIdx)
128
+ break;
129
+ }
130
+ return result;
131
+ }
132
+ function extractFunctionSignature(lines, startIdx) {
133
+ // Capture up to the opening brace, then replace body with semicolon
134
+ let sig = '';
135
+ for (let i = startIdx; i < lines.length && i < startIdx + 5; i++) {
136
+ const line = lines[i];
137
+ const braceIdx = line.indexOf('{');
138
+ if (braceIdx >= 0) {
139
+ sig += line.slice(0, braceIdx).trimEnd() + ';';
140
+ break;
141
+ }
142
+ sig += line + '\n';
143
+ }
144
+ return sig || lines[startIdx];
145
+ }
146
+ function skipBlock(lines, startIdx) {
147
+ let depth = 0;
148
+ for (let i = startIdx; i < lines.length; i++) {
149
+ const line = lines[i];
150
+ for (const ch of line) {
151
+ if (ch === '{')
152
+ depth++;
153
+ if (ch === '}')
154
+ depth--;
155
+ }
156
+ if (depth <= 0 && i > startIdx)
157
+ return i + 1;
158
+ }
159
+ return lines.length;
160
+ }
161
+ //# sourceMappingURL=stubs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stubs.js","sourceRoot":"","sources":["../src/stubs.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@codeledger/selector",
3
+ "version": "0.1.1",
4
+ "type": "module",
5
+ "description": "Deterministic context selection algorithm for CodeLedger",
6
+ "license": "Apache-2.0",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/codeledgerECF/codeledger-blackbox.git",
10
+ "directory": "packages/selector"
11
+ },
12
+ "publishConfig": {
13
+ "access": "public"
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "main": "./dist/index.js",
19
+ "types": "./dist/index.d.ts",
20
+ "exports": {
21
+ ".": {
22
+ "types": "./dist/index.d.ts",
23
+ "import": "./dist/index.js"
24
+ }
25
+ },
26
+ "dependencies": {
27
+ "@codeledger/types": "0.1.1"
28
+ },
29
+ "devDependencies": {
30
+ "typescript": "^5.4.0"
31
+ },
32
+ "scripts": {
33
+ "build": "tsc",
34
+ "typecheck": "tsc --noEmit",
35
+ "clean": "rm -rf dist"
36
+ }
37
+ }