Class: Ask::CodingHarness::EventTranslator

Inherits:
Object
  • Object
show all
Defined in:
lib/ask/coding_harness/event_translator.rb

Overview

Normalizes coding-agent adapter events (ask-coding-providers) into the harness SSE event schema.

Two adapter vocabularies exist today:

ask_agent (rich):    turn.started, model.streaming, model.thinking,
                   tool.use, tool.delta, tool.result,
                   approval.required, approval.updated,
                   plan.proposed, plan.approved, plan.rejected,
                   todos.updated, turn.completed, turn.failed,
                   turn.aborted, error

acp (basic):         turn.started, model.streaming, tool.use,
                   tool.result, turn.completed, turn.failed

Both translate into one browser-friendly schema (camelCase, flat payloads, no seq):

turn.started, message.delta, message.thinking,
tool.start {id, name, args}, tool.delta {id, name, partial},
tool.end {id, name, output, isError, durationMs},
approval.required {id, toolName, args, message, autoApprovable},
approval.updated {id, status}, plan.proposed/approved/rejected {plan},
todos.updated {todos}, turn.completed {response},
turn.failed {error}, turn.aborted, error {error}

Instance Method Summary collapse

Instance Method Details

#translate(event) ⇒ Hash?

Translate one adapter event into a harness event Hash, or nil when the event has no browser representation.

Parameters:

  • event (Hash)

    adapter event with :type and :payload

Returns:

  • (Hash, nil)

    { type:, data: }



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/ask/coding_harness/event_translator.rb', line 36

def translate(event)
  payload = event[:payload] || {}
  case event[:type]
  when "turn.started" then event("turn.started", {})
  when "model.streaming" then event("message.delta", { delta: payload["delta"] })
  when "model.thinking" then event("message.thinking", { delta: payload["delta"] })
  when "tool.use" then tool_start(payload)
  when "tool.delta" then event("tool.delta", tool_delta(payload))
  when "tool.result" then tool_end(payload)
  when "approval.required" then approval_required(payload)
  when "approval.updated" then event("approval.updated", { id: payload["actionId"], status: payload["status"] })
  when "plan.proposed" then event("plan.proposed", { plan: payload["plan"] })
  when "plan.approved" then event("plan.approved", { plan: payload["plan"] })
  when "plan.rejected" then event("plan.rejected", { plan: payload["plan"] })
  when "todos.updated" then event("todos.updated", { todos: payload["todos"] })
  when "turn.completed" then event("turn.completed", { response: payload["response"] })
  when "turn.failed" then event("turn.failed", { error: error_message(payload) })
  when "turn.aborted" then event("turn.aborted", {})
  when "error" then event("error", { error: error_message(payload) })
  end
end