installRequirements method

Future<void> installRequirements({
  1. String? participantId,
})

Install RequiredToolkit / RequiredSchema into the room if missing, mirroring Python install_requirements.

Implementation

Future<void> installRequirements({String? participantId}) async {
  final room = this.room;

  // 1. Load schemas
  final Map<String, StorageEntry> schemasByName = {};
  final schemas = await room.storage.list('.schemas');
  for (final schema in schemas) {
    schemasByName[schema.name] = schema;
  }

  // 2. Load visible toolkits
  final Map<String, ToolkitDescription> toolkitsByName = {};
  final visibleToolkits = await room.agents.listToolkits(
    participantId: participantId,
  );
  for (final tk in visibleToolkits) {
    toolkitsByName[tk.name] = tk;
  }

  var installed = false;
  const builtinAgentsUrl = 'http://localhost:8080';

  for (final requirement in requires) {
    if (!requirement.callable) continue;

    if (requirement is RequiredToolkit) {
      if (requirement.name == 'ui') {
        // Python: skip ui
        continue;
      }

      if (!toolkitsByName.containsKey(requirement.name)) {
        installed = true;
        _agentLogger.info(
          'calling required toolkit into room ${requirement.name}',
        );

        final String url;
        if (requirement.name.startsWith('https://') ||
            requirement.name.startsWith('http://')) {
          url = requirement.name;
        } else {
          url = '$builtinAgentsUrl/toolkits/${requirement.name}';
        }

        await room.agents.call(
          url: url,
          name: requirement.name,
          arguments: const <String, dynamic>{},
        );
      }
    } else if (requirement is RequiredSchema) {
      if (!schemasByName.containsKey(requirement.name)) {
        installed = true;
        _agentLogger.info('Installing required schema ${requirement.name}');

        final String url;
        if (requirement.name.startsWith('https://') ||
            requirement.name.startsWith('http://')) {
          url = requirement.name;
        } else {
          url = '$builtinAgentsUrl/schemas/${requirement.name}';
        }

        await room.agents.call(
          url: url,
          name: requirement.name,
          arguments: const <String, dynamic>{},
        );
      }
    } else {
      throw RoomServerException('unsupported requirement: $requirement');
    }
  }

  if (installed) {
    await Future<void>.delayed(const Duration(seconds: 5));
  }
}