run method
Runs the command with parsed args.
Implementation
@override
Future<void> run(LocalCommandContext context, List<String> args) async {
if (args.isEmpty) {
context.writeLine('Usage:\n$usage');
return;
}
final first = args.first;
if (first == '-h' || first == '--help' || first == 'help') {
context.writeLine('Usage:\n$usage');
return;
}
if (first == 'status') {
context.writeLine(
'ai: ${_config.provider.wireName} / ${_config.model} '
'(mode: ${_mode.wireName})',
);
if (_config.plannerModel != null) {
context.writeLine(' planner: ${_config.plannerModel}');
}
if (_config.executorModel != null) {
context.writeLine(' executor: ${_config.executorModel}');
}
if (_config.explainerModel != null) {
context.writeLine(' explainer: ${_config.explainerModel}');
}
context.writeLine(' language: ${_language ?? '(model default)'}');
return;
}
if (first == 'mode') {
final parsed = AgentMode.tryParse(args.length > 1 ? args[1] : null);
if (parsed == null) {
context.writeLine('ai: usage: :ai mode <standard|plan|auto>');
return;
}
_mode = parsed;
onModeChanged?.call(parsed);
context.writeLine('ai: mode set to ${parsed.wireName}');
return;
}
if (first == 'lang' || first == 'language') {
if (args.length < 2) {
context.writeLine('ai: language is ${_language ?? '(model default)'}');
return;
}
final value = args.sublist(1).join(' ').trim();
final cleared = _isLanguageOff(value);
_language = cleared ? null : value;
onLanguageChanged?.call(_language);
context.writeLine(
cleared
? 'ai: language reset to the model default'
: 'ai: language set to $_language',
);
return;
}
// Consume leading one-shot flags (mode and --lang) in any order.
var mode = _mode;
var oneShotLanguage = _language;
var rest = args;
while (rest.isNotEmpty) {
final flagMode = _modeFromFlag(rest.first);
if (flagMode != null) {
mode = flagMode;
rest = rest.sublist(1);
continue;
}
if ((rest.first == '--lang' || rest.first == '--language') &&
rest.length >= 2) {
oneShotLanguage = _isLanguageOff(rest[1]) ? null : rest[1];
rest = rest.sublist(2);
continue;
}
break;
}
final goal = rest.join(' ').trim();
if (goal.isEmpty) {
context.writeLine('ai: no prompt given');
return;
}
// Abort signal: Ctrl-C (via onInterruptRequest) requests an abort the loop
// confirms; an `abort`/`q` answer at a prompt aborts directly.
final cancel = AgentAbort();
context.onInterruptRequest?.call(cancel.request);
try {
final service = _buildService(context, mode, cancel, oneShotLanguage);
await service.run(goal, mode: mode, abort: cancel);
} finally {
context.onInterruptRequest?.call(null);
}
}