run method

  1. @override
Future<void> run(
  1. LocalCommandContext context,
  2. List<String> args
)
override

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);
  }
}