attachSecretRedactor function

void attachSecretRedactor(
  1. Agent agent,
  2. SecretRedactor redactor
)

Composes the redaction hooks for redactor onto agent, preserving any hooks already registered (existing hooks run first, redaction runs last so content they produce is masked too).

Implementation

void attachSecretRedactor(Agent agent, SecretRedactor redactor) {
  final hooks = redactionHooks(redactor);

  final existingAfter = agent.afterToolCall;
  agent.afterToolCall = (context, cancelToken) async {
    final prior = existingAfter == null
        ? null
        : await existingAfter(context, cancelToken);
    final effectiveContent = prior?.content ?? context.result.content;
    var changed = false;
    final redactedContent = [
      for (final block in effectiveContent)
        _redactBlock(redactor, block, onChange: () => changed = true),
    ];
    if (prior == null && !changed) return null;
    return AfterToolCallResult(
      content: redactedContent,
      isError: prior?.isError,
      terminate: prior?.terminate,
    );
  };

  final existingTransform = agent.transformContext;
  agent.transformContext = (messages, cancelToken) async {
    final transformed = existingTransform == null
        ? messages
        : await existingTransform(messages, cancelToken);
    return hooks.transformContext(transformed, cancelToken);
  };
}