harn-stdlib 0.8.26

Embedded Harn standard library source catalog
Documentation
// 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)
}