processSessionStartHooks function

Future<List<HookResultMessage>> processSessionStartHooks(
  1. String source, {
  2. SessionStartHooksOptions? options,
})

Process session start hooks.

Implementation

Future<List<HookResultMessage>> processSessionStartHooks(
  String source, {
  SessionStartHooksOptions? options,
}) async {
  if (_isBareMode()) return [];

  final opts = options ?? SessionStartHooksOptions();
  final hookMessages = <HookResultMessage>[];
  final additionalContexts = <String>[];
  final allWatchPaths = <String>[];

  // Load plugin hooks.
  if (_loadPluginHooks != null) {
    try {
      await _loadPluginHooks!();
    } catch (e) {
      // Log error but don't crash.
    }
  }

  // Execute session start hooks.
  if (_executeSessionStartHooks != null) {
    await for (final hookResult in _executeSessionStartHooks!(source, opts)) {
      if (hookResult.content != null) {
        hookMessages.add(hookResult);
      }
      if (hookResult.additionalContexts != null &&
          hookResult.additionalContexts!.isNotEmpty) {
        additionalContexts.addAll(hookResult.additionalContexts!);
      }
      if (hookResult.initialUserMessage != null) {
        _pendingInitialUserMessage = hookResult.initialUserMessage;
      }
      if (hookResult.watchPaths != null && hookResult.watchPaths!.isNotEmpty) {
        allWatchPaths.addAll(hookResult.watchPaths!);
      }
    }
  }

  // If hooks provided additional context, add it as a message.
  if (additionalContexts.isNotEmpty) {
    hookMessages.add(
      HookResultMessage(
        content: additionalContexts.join('\n'),
        hookName: 'SessionStart',
        toolUseId: 'SessionStart',
        hookEvent: 'SessionStart',
      ),
    );
  }

  return hookMessages;
}