@nanocollective/nanocoder
Version:
A local-first CLI coding agent that brings the power of agentic coding tools like Claude Code and Gemini CLI to local models or controlled APIs like OpenRouter
102 lines • 4.28 kB
JavaScript
import React from 'react';
import { ErrorMessage, InfoMessage, SuccessMessage, } from '../../../components/message-box.js';
import { DELAY_COMMAND_COMPLETE_MS } from '../../../constants.js';
import { getModelContextLimit, getSessionContextLimit, resetSessionContextLimit, setSessionContextLimit, } from '../../../models/index.js';
/**
* Parses a context limit value string, supporting k/K suffix.
* e.g. "8192" -> 8192, "128k" -> 128000, "128K" -> 128000
*/
export function parseContextLimit(value) {
const trimmed = value.trim().toLowerCase();
let multiplier = 1;
let numStr = trimmed;
if (trimmed.endsWith('k')) {
multiplier = 1000;
numStr = trimmed.slice(0, -1);
}
const parsed = Number.parseFloat(numStr);
if (Number.isNaN(parsed) || parsed <= 0) {
return null;
}
return Math.round(parsed * multiplier);
}
/**
* Handles /context-max command. Returns true if handled.
*/
export async function handleContextMaxCommand(commandParts, options) {
const { onAddToChatQueue, onCommandComplete, getNextComponentKey, model } = options;
if (commandParts[0] !== 'context-max') {
return false;
}
const args = commandParts.slice(1);
if (args[0] === '--reset') {
resetSessionContextLimit();
onAddToChatQueue(React.createElement(SuccessMessage, {
key: `context-max-reset-${getNextComponentKey()}`,
message: 'Session context limit override cleared.',
hideBox: true,
}));
setTimeout(() => onCommandComplete?.(), DELAY_COMMAND_COMPLETE_MS);
return true;
}
if (args.length > 0) {
const limit = parseContextLimit(args[0]);
if (limit === null) {
onAddToChatQueue(React.createElement(ErrorMessage, {
key: `context-max-error-${getNextComponentKey()}`,
message: 'Invalid context limit. Use a positive number, e.g. /context-max 8192 or /context-max 128k',
}));
setTimeout(() => onCommandComplete?.(), DELAY_COMMAND_COMPLETE_MS);
return true;
}
setSessionContextLimit(limit);
onAddToChatQueue(React.createElement(SuccessMessage, {
key: `context-max-set-${getNextComponentKey()}`,
message: `Session context limit set to ${limit.toLocaleString()} tokens.`,
hideBox: true,
}));
setTimeout(() => onCommandComplete?.(), DELAY_COMMAND_COMPLETE_MS);
return true;
}
const sessionLimit = getSessionContextLimit();
if (sessionLimit !== null) {
onAddToChatQueue(React.createElement(InfoMessage, {
key: `context-max-info-${getNextComponentKey()}`,
message: `Context limit: ${sessionLimit.toLocaleString()} tokens (session override)`,
hideBox: true,
}));
setTimeout(() => onCommandComplete?.(), DELAY_COMMAND_COMPLETE_MS);
return true;
}
const envLimit = process.env.NANOCODER_CONTEXT_LIMIT;
if (envLimit) {
const parsed = Number.parseInt(envLimit, 10);
if (!Number.isNaN(parsed) && parsed > 0) {
onAddToChatQueue(React.createElement(InfoMessage, {
key: `context-max-info-${getNextComponentKey()}`,
message: `Context limit: ${parsed.toLocaleString()} tokens (NANOCODER_CONTEXT_LIMIT env)`,
hideBox: true,
}));
setTimeout(() => onCommandComplete?.(), DELAY_COMMAND_COMPLETE_MS);
return true;
}
}
const modelLimit = await getModelContextLimit(model);
if (modelLimit !== null) {
onAddToChatQueue(React.createElement(InfoMessage, {
key: `context-max-info-${getNextComponentKey()}`,
message: `Context limit: ${modelLimit.toLocaleString()} tokens (model lookup)`,
hideBox: true,
}));
}
else {
onAddToChatQueue(React.createElement(InfoMessage, {
key: `context-max-info-${getNextComponentKey()}`,
message: 'Context limit: Unknown. Use /context-max <number> to set one.',
hideBox: true,
}));
}
setTimeout(() => onCommandComplete?.(), DELAY_COMMAND_COMPLETE_MS);
return true;
}
//# sourceMappingURL=context-max-handler.js.map