Skip to content

Commit f5c4da9

Browse files
respect explicit context budgets
1 parent 2f9412d commit f5c4da9

1 file changed

Lines changed: 8 additions & 19 deletions

File tree

global-template/docgen/lib/context.mjs

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,34 +18,23 @@ function ftsQuery(value) {
1818
function rowsForFacts(db, query, limit) {
1919
const match = ftsQuery(query);
2020
if (!match) return db.prepare('SELECT id,kind,name,path,line,statement,snippet,metadata,content_hash FROM facts ORDER BY path,line LIMIT ?').all(limit);
21-
try {
22-
return db.prepare(`SELECT f.id,f.kind,f.name,f.path,f.line,f.statement,f.snippet,f.metadata,f.content_hash,bm25(facts_fts) score FROM facts_fts JOIN facts f ON f.id=facts_fts.id WHERE facts_fts MATCH ? ORDER BY score LIMIT ?`).all(match, limit);
23-
} catch {
24-
return db.prepare('SELECT id,kind,name,path,line,statement,snippet,metadata,content_hash FROM facts WHERE lower(name||\' \'||statement||\' \'||path) LIKE ? LIMIT ?').all(`%${String(query).toLowerCase().split(/\s+/)[0] ?? ''}%`, limit);
25-
}
21+
try { return db.prepare(`SELECT f.id,f.kind,f.name,f.path,f.line,f.statement,f.snippet,f.metadata,f.content_hash,bm25(facts_fts) score FROM facts_fts JOIN facts f ON f.id=facts_fts.id WHERE facts_fts MATCH ? ORDER BY score LIMIT ?`).all(match, limit); }
22+
catch { return db.prepare('SELECT id,kind,name,path,line,statement,snippet,metadata,content_hash FROM facts WHERE lower(name||\' \'||statement||\' \'||path) LIKE ? LIMIT ?').all(`%${String(query).toLowerCase().split(/\s+/)[0] ?? ''}%`, limit); }
2623
}
2724

2825
function rowsForModels(db, query, limit) {
2926
const match = ftsQuery(query);
3027
if (!match) return db.prepare('SELECT id,model,kind,name,statement,classification,confidence,evidence,payload,content_hash FROM model_items LIMIT ?').all(limit);
31-
try {
32-
return db.prepare(`SELECT m.id,m.model,m.kind,m.name,m.statement,m.classification,m.confidence,m.evidence,m.payload,m.content_hash,bm25(model_fts) score FROM model_fts JOIN model_items m ON m.id=model_fts.id WHERE model_fts MATCH ? ORDER BY score LIMIT ?`).all(match, limit);
33-
} catch { return []; }
28+
try { return db.prepare(`SELECT m.id,m.model,m.kind,m.name,m.statement,m.classification,m.confidence,m.evidence,m.payload,m.content_hash,bm25(model_fts) score FROM model_fts JOIN model_items m ON m.id=model_fts.id WHERE model_fts MATCH ? ORDER BY score LIMIT ?`).all(match, limit); }
29+
catch { return []; }
3430
}
3531

36-
function compactFact(row) {
37-
return { id: row.id, kind: row.kind, name: row.name, path: row.path, line: row.line, statement: row.statement, snippet: row.snippet, metadata: JSON.parse(row.metadata || '{}'), hash: row.content_hash };
38-
}
39-
function compactModel(row) {
40-
return { id: row.id, model: row.model, kind: row.kind, name: row.name, statement: row.statement, classification: row.classification, confidence: row.confidence, evidence: JSON.parse(row.evidence || '[]'), payload: JSON.parse(row.payload || '{}'), hash: row.content_hash };
41-
}
32+
function compactFact(row) { return { id: row.id, kind: row.kind, name: row.name, path: row.path, line: row.line, statement: row.statement, snippet: row.snippet, metadata: JSON.parse(row.metadata || '{}'), hash: row.content_hash }; }
33+
function compactModel(row) { return { id: row.id, model: row.model, kind: row.kind, name: row.name, statement: row.statement, classification: row.classification, confidence: row.confidence, evidence: JSON.parse(row.evidence || '[]'), payload: JSON.parse(row.payload || '{}'), hash: row.content_hash }; }
4234

4335
function fitBudget(base, facts, models, maxTokens) {
4436
const selectedFacts = []; const selectedModels = []; let used = estimateTokens(JSON.stringify(base));
45-
const candidates = [
46-
...models.map((item) => ({ type: 'model', item, tokens: estimateTokens(JSON.stringify(item)) })),
47-
...facts.map((item) => ({ type: 'fact', item, tokens: estimateTokens(JSON.stringify(item)) }))
48-
].sort((a, b) => (a.type === 'model' ? -1 : 1) - (b.type === 'model' ? -1 : 1));
37+
const candidates = [...models.map((item) => ({ type: 'model', item, tokens: estimateTokens(JSON.stringify(item)) })), ...facts.map((item) => ({ type: 'fact', item, tokens: estimateTokens(JSON.stringify(item)) }))];
4938
for (const candidate of candidates) {
5039
if (used + candidate.tokens > maxTokens) continue;
5140
used += candidate.tokens;
@@ -56,7 +45,7 @@ function fitBudget(base, facts, models, maxTokens) {
5645

5746
export function compileContext(root, { stage, target = '', query = '', maxTokens, factLimit = 800, modelLimit = 500, metadata = {} }) {
5847
const paths = projectPaths(root); const config = loadConfig(root); const configured = config.context?.maxTokens?.[stage] ?? config.context?.maxTokens?.default ?? 60000;
59-
const budget = Math.max(2000, Number(maxTokens ?? configured)); const db = openDatabase(paths.database);
48+
const budget = Math.max(256, Number(maxTokens ?? configured)); const db = openDatabase(paths.database);
6049
const effectiveQuery = [STAGE_QUERIES[stage] ?? '', query, target].filter(Boolean).join(' ');
6150
const facts = rowsForFacts(db, effectiveQuery, factLimit).map(compactFact); const models = rowsForModels(db, effectiveQuery, modelLimit).map(compactModel);
6251
const base = { schemaVersion: '2.0', stage, target: target || null, query: effectiveQuery, metadata };

0 commit comments

Comments
 (0)