- Add DispatchContext field to Task model for rule metadata storage - Add BlocklistEmails config (BLOCKLIST_EMAILS env var) - Wire rules.Pipeline into IMAPWatcher, replacing inline whitelist check - Pass rule metadata through DispatchContext to OpenClaw dispatch - Remove isWhitelisted method (now handled by WhitelistRule) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
31 lines
716 B
Go
31 lines
716 B
Go
package rules
|
|
|
|
// Pipeline evaluates a sequence of rules, stopping on first rejection.
|
|
type Pipeline struct {
|
|
rules []Rule
|
|
}
|
|
|
|
// NewPipeline creates a rules pipeline from the given rules.
|
|
func NewPipeline(rules []Rule) *Pipeline {
|
|
return &Pipeline{rules: rules}
|
|
}
|
|
|
|
// Evaluate runs all rules in order. Returns the first rejection or a merged accept.
|
|
func (p *Pipeline) Evaluate(ctx EmailContext) RuleResult {
|
|
merged := Accept()
|
|
for _, r := range p.rules {
|
|
result := r.Evaluate(ctx)
|
|
if !result.Accepted {
|
|
return result
|
|
}
|
|
for k, v := range result.Metadata {
|
|
if merged.Metadata == nil {
|
|
merged.Metadata = map[string]string{k: v}
|
|
} else {
|
|
merged.Metadata[k] = v
|
|
}
|
|
}
|
|
}
|
|
return merged
|
|
}
|