harn-stdlib 0.8.15

Embedded Harn standard library source catalog
Documentation
// @harn-entrypoint-category agent.stdlib
import { daemon_timer_feedback_prompt, daemon_watch_feedback_prompt } from "std/agent/prompts"
import { agent_session_inject_feedback } from "std/agent/state"

fn __daemon_compaction_summary(opts) {
  if !(opts?.consolidate_on_idle ?? false) {
    return nil
  }
  if !(opts?.auto_compact ?? false) {
    return nil
  }
  let callback = opts?.compact_callback
  if callback == nil {
    return nil
  }
  let compacted = callback([])
  if type_of(compacted) == "dict" {
    return compacted?.summary
  }
  if type_of(compacted) == "string" {
    return compacted
  }
  return nil
}

fn __agent_daemon_feedback(wake, opts) {
  if wake?.reason == "timer" {
    return {kind: wake?.feedback_kind ?? "timer", text: daemon_timer_feedback_prompt(opts)}
  }
  if wake?.reason == "watch" || wake?.changed_paths != nil {
    let changed_paths = wake?.changed_paths ?? []
    let changed_paths_text = if type_of(changed_paths) == "list" {
      join(changed_paths, ", ")
    } else {
      to_string(changed_paths)
    }
    return {
      kind: wake?.feedback_kind ?? wake?.reason ?? "daemon",
      text: daemon_watch_feedback_prompt({changed_paths: changed_paths_text}, opts),
    }
  }
  if wake?.feedback != nil {
    return {kind: wake?.feedback_kind ?? wake?.reason ?? "daemon", text: wake.feedback}
  }
  return nil
}

/** agent_daemon_snapshot. */
pub fn agent_daemon_snapshot(session, opts, daemon_state = "idle", iteration = 0) {
  let summary = __daemon_compaction_summary(opts)
  var snapshot_opts = opts + {daemon_state: daemon_state, total_iterations: iteration}
  if summary != nil {
    snapshot_opts = snapshot_opts + {transcript_summary: summary}
  }
  return __host_agent_daemon_snapshot(session.session_id, snapshot_opts)
}

/** agent_daemon_step. */
pub fn agent_daemon_step(session, opts, iteration) {
  let snapshot = agent_daemon_snapshot(session, opts, "idle", iteration)
  let timeout = opts?.wake_interval_ms ?? 0
  var wake = __host_agent_daemon_wait(session.session_id, timeout)
  while wake?.reason == nil && timeout > 0 {
    wake = __host_agent_daemon_wait(session.session_id, timeout)
  }
  let feedback = __agent_daemon_feedback(wake, opts)
  if feedback != nil {
    agent_session_inject_feedback(session.session_id, feedback.kind, feedback.text)
  }
  return {snapshot: snapshot, wake: wake}
}