// @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}
}