/**
* @file budget_manager.js
* @description Manage context budget and section selection
* @atomic ATOM (controlled operations, uses token_estimator)
* @component LODA-MCP-COMP-06
*/
const { estimateTokens } = require('./token_estimator');
/**
* Select sections within token budget
* @implements LODA-MCP-DT-06 (Scored sections + budget → Selected sections)
* @param {Array} sections - Scored sections (sorted by relevance)
* @param {number|null} budget - Token budget (null = unlimited)
* @returns {Object} Selection result
*/
function selectWithinBudget(sections, budget) {
if (!budget) {
return {
selected: sections,
totalTokens: sections.reduce((sum, s) => sum + estimateTokens(s.content), 0),
truncated: false,
status: 'UNLIMITED'
};
}
const selected = [];
let totalTokens = 0;
for (const section of sections) {
const sectionTokens = estimateTokens(section.content);
if (totalTokens + sectionTokens <= budget) {
selected.push(section);
totalTokens += sectionTokens;
} else if (selected.length === 0) {
// At least return first section (truncated if needed)
selected.push(section);
totalTokens = sectionTokens;
break;
} else {
break;
}
}
const ratio = totalTokens / budget;
let status = 'SAFE';
if (ratio > 0.8) status = 'WARNING';
if (ratio > 1.0) status = 'EXCEEDED';
return {
selected,
totalTokens,
truncated: selected.length < sections.length,
status,
budgetUsed: `${Math.round(ratio * 100)}%`
};
}
module.exports = { selectWithinBudget };