import { agent_typed_output_checkpoint } from "std/agent/primitives"
import { completion_judge_user_prompt } from "std/agent/prompts"
import {
agent_emit_event,
agent_session_inject_feedback,
agent_session_messages,
} from "std/agent/state"
fn __unique_names(names) {
var unique = []
for name in names {
if name != "" && !contains(unique, name) {
unique = unique.push(name)
}
}
return unique
}
fn __session_tool_names(messages) {
var names = []
for message in messages {
if message?.role == "tool" {
names = names.push(message?.name ?? "")
}
}
return __unique_names(names)
}
fn __judge_payload(session, opts, stop_reason, text, iteration) {
let messages = agent_session_messages(session.session_id)
let tool_names = __session_tool_names(messages)
return {
session_id: session.session_id,
task: session?.task ?? "",
stop_reason: stop_reason,
text: text,
visible_text: text,
last_text: text,
transcript: json_stringify(messages),
all_tools_used: join(tool_names, ", "),
successful_tools_used: join(tool_names, ", "),
iteration: iteration,
}
}
fn __judge_invoke_closure(verify_completion, payload) {
let result = verify_completion(payload)
if result == nil || result == "" {
return {vetoed: false}
}
if type_of(result) == "bool" {
return {vetoed: !result}
}
if type_of(result) == "string" {
return {vetoed: true, feedback: result}
}
if type_of(result) == "dict" {
let confirm = result?.confirm ?? false
let message = result?.message ?? result?.feedback
return {vetoed: !confirm, feedback: message}
}
return {vetoed: false}
}
fn __judge_invoke_structured(judge_cfg, opts, payload) {
let system = judge_cfg?.system ?? ""
let user = completion_judge_user_prompt(payload)
let schema = {
type: "object",
properties: {
verdict: {type: "string", description: "Use `done` or `continue`."},
reasoning: {type: "string"},
next_step: {type: "any"},
},
required: ["verdict"],
}
let base = opts?.llm_options ?? {}
let llm_opts = base
+ {
model: judge_cfg?.model ?? opts?.model,
provider: judge_cfg?.provider ?? opts?.provider,
output_schema: schema,
session_id: payload.session_id,
system: system,
}
let started = monotonic_ms()
let checkpoint = agent_typed_output_checkpoint("agent.completion_judge", user, schema, llm_opts)
let duration_ms = monotonic_ms() - started
if !checkpoint.ok {
return {
vetoed: true,
feedback: checkpoint.error,
verdict: "continue",
reasoning: checkpoint.error,
next_step: checkpoint.error,
judge_duration_ms: duration_ms,
typed_checkpoint: checkpoint,
}
}
let result = checkpoint.data
let verdict = lowercase(trim(to_string(result?.verdict ?? "continue")))
let reasoning = result?.reasoning ?? ""
let next_step = result?.next_step ?? ""
let done_verdicts = ["done", "pass", "passed", "safe", "true", "yes", "yield", "yield_to_user", "complete", "completed"]
let outcome = if contains(done_verdicts, verdict) {
{vetoed: false}
} else {
let feedback = result?.next_step ?? result?.reasoning
?? (judge_cfg?.feedback_fallback ?? "")
{vetoed: true, feedback: feedback}
}
return outcome
+ {
verdict: verdict,
reasoning: reasoning,
next_step: next_step,
judge_duration_ms: duration_ms,
typed_checkpoint: checkpoint,
}
}
fn __emit_judge_decision(session_id, iteration, verdict) {
agent_emit_event(
session_id,
"judge_decision",
{
iteration: iteration,
verdict: verdict?.verdict
?? if verdict.vetoed {
"continue"
} else {
"done"
},
reasoning: verdict?.reasoning ?? "",
next_step: verdict?.next_step ?? "",
judge_duration_ms: verdict?.judge_duration_ms ?? 0,
},
)
}
/** agent_verify_or_continue. */
pub fn agent_verify_or_continue(session, opts, stop_reason, text, iteration = 0) {
let payload = __judge_payload(session, opts, stop_reason, text, iteration)
var verdict = {vetoed: false}
if opts?.verify_completion != nil {
verdict = __judge_invoke_closure(opts.verify_completion, payload)
}
if !verdict.vetoed && opts?.verify_completion_judge != nil {
verdict = __judge_invoke_structured(opts.verify_completion_judge, opts, payload)
__emit_judge_decision(session.session_id, iteration, verdict)
}
let done_judge_applies = opts?.done_judge != nil && (stop_reason == "sentinel" || stop_reason == "natural")
if !verdict.vetoed && done_judge_applies {
verdict = __judge_invoke_structured(opts.done_judge, opts, payload)
__emit_judge_decision(session.session_id, iteration, verdict)
}
if verdict.vetoed && verdict?.feedback != nil && verdict.feedback != "" {
agent_session_inject_feedback(session.session_id, "verify_completion", verdict.feedback)
}
return verdict
}