Member Junction
    Preparing search index...

    What the harness observed on the wire, before normalization.

    interface RawTurn {
        controlToolMap?: Readonly<Record<string, ControlToolRole>> | null;
        protocol?: "envelope" | "hybrid" | "implicit" | null;
        text?: string | null;
        toolCalls?: { arguments?: Record<string, unknown>; name: string }[] | null;
        toolNameMap?: Readonly<Record<string, string>> | null;
    }
    Index

    Properties

    controlToolMap?: Readonly<Record<string, ControlToolRole>> | null

    Control-flow tool name → what calling it decides. Absent when no control tools were declared.

    protocol?: "envelope" | "hybrid" | "implicit" | null

    Which protocol the turn was produced under. 'implicit' reads plain text with no call as task completion; the other two keep the envelope rules. Absent = 'envelope'.

    text?: string | null

    The model's text output, if any.

    toolCalls?: { arguments?: Record<string, unknown>; name: string }[] | null

    Native tool calls on the assistant turn, if the driver requested tools.

    toolNameMap?: Readonly<Record<string, string>> | null

    Sanitized tool name → the Action name the framework dispatches for it.

    Provider tool names are constrained (^[a-zA-Z0-9_-]+$ and friends), so MJ's Action names are sanitized on the way out: Execute Code is declared as execute_code. A corpus case names the ACTION, per §1.2 — comparing the raw wire name against it would score every correct native call as the wrong action, measuring the sanitizer rather than the model.

    The driver supplies the framework's own reverse map, the same one LoopAgentType dispatches from. An unmapped name passes through unchanged: a model that invented a tool should be reported under the name it invented, not silently dropped.