// Thin Harn wrappers over host session-state primitives. These are CRUD only;
// no decision logic lives here. The agent loop holds the session dict locally
// and passes session_id into the host for any mutation.
/**
* agent_session_init.
*
* @effects: [host]
* @allocation: heap
* @errors: []
* @api_stability: experimental
* @example: agent_session_init(message, system_prompt, opts)
*/
pub fn agent_session_init(message, system_prompt, opts) {
return __host_agent_session_init(message, system_prompt, opts)
}
/**
* agent_session_finalize.
*
* @effects: [host]
* @allocation: heap
* @errors: []
* @api_stability: experimental
* @example: agent_session_finalize(session_id, status)
*/
pub fn agent_session_finalize(session_id, status) {
return __host_agent_session_finalize(session_id, status)
}
/**
* agent_session_messages.
*
* @effects: [host]
* @allocation: heap
* @errors: []
* @api_stability: experimental
* @example: agent_session_messages(session_id)
*/
pub fn agent_session_messages(session_id) {
return __host_agent_session_messages(session_id)
}
/**
* agent_session_record_assistant.
*
* @effects: [host]
* @allocation: heap
* @errors: []
* @api_stability: experimental
* @example: agent_session_record_assistant(session_id, llm_result)
*/
pub fn agent_session_record_assistant(session_id, llm_result) {
return __host_agent_session_record_assistant(session_id, llm_result)
}
/**
* agent_session_record_tool_results.
*
* @effects: [host]
* @allocation: heap
* @errors: []
* @api_stability: experimental
* @example: agent_session_record_tool_results(session_id, dispatch)
*/
pub fn agent_session_record_tool_results(session_id, dispatch) {
return __host_agent_session_record_tool_results(session_id, dispatch)
}
fn __agent_usage_int(value) {
if type_of(value) == "int" {
return value
}
if type_of(value) == "float" {
return to_int(value)
}
return 0
}
/**
* agent_reminder_providers_fire.
*
* @effects: [host]
* @allocation: heap
* @errors: []
* @api_stability: experimental
* @example: agent_reminder_providers_fire(session_id, "post_compact", payload, opts)
*/
pub fn agent_reminder_providers_fire(session_id, event, payload = nil, opts = nil) {
return __host_agent_reminder_providers_fire(session_id, event, payload ?? {}, opts ?? {})
}
/**
* agent_session_record_usage.
*
* @effects: [host]
* @allocation: heap
* @errors: []
* @api_stability: experimental
* @example: agent_session_record_usage(session_id, llm_result, opts, iteration)
*/
pub fn agent_session_record_usage(session_id, llm_result, opts = nil, iteration = 0) {
let totals = __host_agent_session_record_usage(session_id, llm_result)
let llm = llm_result?.llm ?? {}
let input_tokens = __agent_usage_int(llm?.input_tokens ?? llm_result?.input_tokens)
let output_tokens = __agent_usage_int(llm?.output_tokens ?? llm_result?.output_tokens)
agent_reminder_providers_fire(
session_id,
"on_budget_threshold",
{
session: {id: session_id},
iteration: iteration,
input_tokens: input_tokens,
output_tokens: output_tokens,
tokens_used: totals?.tokens_used ?? 0,
cost_usd: totals?.cost_usd ?? 0.0,
provider: llm_result?.provider ?? opts?.provider ?? "",
model: llm_result?.model ?? opts?.model ?? "",
},
opts ?? {},
)
return totals
}
/**
* agent_session_drain_feedback.
*
* @effects: [host]
* @allocation: heap
* @errors: []
* @api_stability: experimental
* @example: agent_session_drain_feedback(session_id)
*/
pub fn agent_session_drain_feedback(session_id) {
return __host_agent_session_drain_feedback(session_id)
}
/**
* agent_session_drain_bridge_injections.
*
* @effects: [host]
* @allocation: heap
* @errors: []
* @api_stability: experimental
* @example: agent_session_drain_bridge_injections(session_id, "finish_step")
*/
pub fn agent_session_drain_bridge_injections(session_id, checkpoint) {
return __host_agent_session_drain_bridge_injections(session_id, checkpoint)
}
/**
* agent_session_totals.
*
* @effects: [host]
* @allocation: heap
* @errors: []
* @api_stability: experimental
* @example: agent_session_totals(session_id)
*/
pub fn agent_session_totals(session_id) {
return __host_agent_session_totals(session_id)
}
/**
* agent_session_inject_feedback.
*
* @effects: [host]
* @allocation: heap
* @errors: []
* @api_stability: experimental
* @example: agent_session_inject_feedback(session_id, kind, content)
*/
pub fn agent_session_inject_feedback(session_id, kind, content) {
return __host_agent_session_inject_feedback(session_id, kind, content)
}
/**
* agent_session_post_event. Post an event into a running session's
* inbox from outside the loop (triggers, connectors, host
* integrations). The next turn boundary — including the post-
* compaction drain — surfaces the entry as feedback.
*
* @effects: [host]
* @allocation: heap
* @errors: []
* @api_stability: experimental
* @example: agent_session_post_event(session_id, kind, content, source)
*/
pub fn agent_session_post_event(session_id, kind, content, source = nil) {
return __host_agent_session_post_event(session_id, kind, content, source)
}
/**
* agent_session_apply_reminder_post_turn.
*
* @effects: [host]
* @allocation: heap
* @errors: []
* @api_stability: experimental
* @example: agent_session_apply_reminder_post_turn(session_id, turn)
*/
pub fn agent_session_apply_reminder_post_turn(session_id, turn = 0) {
return __host_agent_session_apply_reminder_post_turn(session_id, turn)
}
/**
* agent_session_set_active_skills.
*
* @effects: [host]
* @allocation: heap
* @errors: []
* @api_stability: experimental
* @example: agent_session_set_active_skills(session_id, skills)
*/
pub fn agent_session_set_active_skills(session_id, skills) {
return __host_agent_session_set_active_skills(session_id, skills)
}
/**
* agent_session_active_skills.
*
* @effects: [host]
* @allocation: heap
* @errors: []
* @api_stability: experimental
* @example: agent_session_active_skills(session_id)
*/
pub fn agent_session_active_skills(session_id) {
return __host_agent_session_active_skills(session_id)
}
/**
* agent_session_record_skill_event.
*
* @effects: [host]
* @allocation: heap
* @errors: []
* @api_stability: experimental
* @example: agent_session_record_skill_event(session_id, kind, metadata)
*/
pub fn agent_session_record_skill_event(session_id, kind, metadata) {
return __host_agent_session_record_skill_event(session_id, kind, metadata)
}
/**
* agent_session_claim_tool_format_internal.
*
* @effects: [host]
* @allocation: heap
* @errors: []
* @api_stability: experimental
* @example: agent_session_claim_tool_format_internal(session_id, tool_format)
*/
pub fn agent_session_claim_tool_format_internal(session_id, tool_format) {
return __host_agent_session_claim_tool_format(session_id, tool_format)
}
/**
* agent_emit_event.
*
* @effects: [host]
* @allocation: heap
* @errors: []
* @api_stability: experimental
* @example: agent_emit_event(session_id, event_type, payload)
*/
pub fn agent_emit_event(session_id, event_type, payload) {
return __host_agent_emit_event(session_id, event_type, payload)
}
/**
* agent_record_native_tool_fallback.
*
* @effects: [host]
* @allocation: heap
* @errors: []
* @api_stability: experimental
* @example: agent_record_native_tool_fallback(session_id, payload)
*/
pub fn agent_record_native_tool_fallback(session_id, payload) {
return __host_agent_record_native_tool_fallback(session_id, payload)
}
/**
* agent_record_compaction.
*
* @effects: [host]
* @allocation: heap
* @errors: []
* @api_stability: experimental
* @example: agent_record_compaction(session_id, payload)
*/
pub fn agent_record_compaction(session_id, payload) {
return __host_agent_record_compaction(session_id, payload)
}