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