Module: Xeno::Hooks
- Defined in:
- lib/xeno/hooks.rb
Overview
Observe-only event handlers from agent/hooks/*.rb:
Xeno.hook "turn.completed" do |event|
Metrics.increment("agent.turns", tags: [event.session.channel])
end
Xeno.hook "*" do |event| ... end # every event
Semantics:
- Handlers fire AFTER the event row is durably committed (after_commit), typed handlers first, then the wildcard. The block receives the Xeno::Event record (event_type, data, index, session).
- Observe-only: return values are ignored; hooks cannot veto anything or inject model context. A raising handler is logged and skipped — a hook can never break the runtime or fail the turn.
- AT-LEAST-ONCE: replayed steps re-emit new events with new indexes. Key once-per-step side effects on (turn_id, step) from the data; key stored content on (session_id, index).
Class Method Summary collapse
Class Method Details
.dispatch(event, definition: Xeno.definition) ⇒ Object
23 24 25 26 27 28 29 30 31 32 33 34 35 |
# File 'lib/xeno/hooks.rb', line 23 def dispatch(event, definition: Xeno.definition) hooks = definition.respond_to?(:hooks) ? definition.hooks : {} return if hooks.empty? handlers = Array(hooks[event.event_type]) + Array(hooks["*"]) handlers.each do |handler| handler.call(event) rescue StandardError => e Rails.logger.warn( "xeno: hook for #{event.event_type} raised #{e.class}: #{e.} — hooks are observe-only, continuing" ) end end |