
# claw = memory + soul + note + tailer-mq + cron

xrc:mod:lib     claw   run/heartbeat   run/msg  run/agentrequest run/agentrequest_util   run/util run/log run/status run/workspace

___X_CMD_CLAW_DIR="$___X_CMD_ROOT_DATA/claw"
___X_CMD_CLAW_BOT_WS="$___X_CMD_CLAW_DIR/workspace/default"
___X_CMD_CLAW_BOT_MQ="$___X_CMD_CLAW_BOT_WS/.x-cmd/tailer-mq"
___X_CMD_CLAW_BOT_DATA="$___X_CMD_CLAW_BOT_WS/.x-cmd/data"
___X_CMD_CLAW_BOT_HEARTBEAT="$___X_CMD_CLAW_BOT_DATA/heartbeat"
___X_CMD_CLAW_BOT_CONNECT_DIR="$___X_CMD_CLAW_BOT_DATA/connect"
___X_CMD_CLAW_BOT_STDOUT_LOG_DIR="$___X_CMD_CLAW_BOT_DATA/logs"

___X_CMD_CLAW_WEIXIN_SESSION_TIMEOUT=86400
___X_CMD_CLAW_WEIXIN_REMIND_BEFORE=1800
___X_CMD_CLAW_WEIXIN_REMIND_MARKER="$___X_CMD_CLAW_BOT_DATA/weixin_remind_sent"

___x_cmd_claw_runstart(){(
    export ___X_CMD_LOG_C_TF="$___X_CMD_LOG_C_TF"
    [ -n "$___X_CMD_LOG_C_TF" ] || [ -t 2 ] || ___X_CMD_LOG_C_TF=0
    ___x_cmd log timestamp epoch

    if [ -n "$___X_CMD_CLAW_BOT_RECENT_STDOUT_LOG_DIR" ]; then
        local logfp="$___X_CMD_CLAW_BOT_RECENT_STDOUT_LOG_DIR/runner.log"
        ___x_cmd ensurefp "$logfp"
        exec >>"$logfp" 2>&1
    fi

    claw:info "X-Claw agent runtime active — awaiting instructions and ready to act"
    if ! ___x_cmd worker isalive --ns x-claw-default-worker --name heartbeat-runner; then
        claw:info "[HB] Starting heartbeat worker"
        ___x_cmd worker run --ns x-claw-default-worker --name heartbeat-runner -- ___x_cmd_claw_run_hearbeatgenerator "$___X_CMD_CLAW_BOT_MQ" "$im"
    fi

    (
        trap '' INT

        ___X_CMD_TAILER_HANDLE="___x_cmd_claw_run___agentwork" \
        ___x_cmd tailer run "$___X_CMD_CLAW_BOT_MQ"
    ) || {
        local exitcode="$?"
        claw:warn "Tailer loop exited with code $exitcode — initiating teardown"
        ___x_cmd_claw_run___teardown
        return "$exitcode"
    }

    ___x_cmd_claw_run___teardown
)}

___x_cmd_claw_run___teardown(){
    claw:info "Shutting down X-Claw runtime — stopping services and cleaning up state"

    # claw:debug "[HB] Removing connect directory: $___X_CMD_CLAW_BOT_CONNECT_DIR"
    # ___x_cmd rmrf "$___X_CMD_CLAW_BOT_CONNECT_DIR"

    claw:debug "[HB] Removing agent unavailable state file: $___X_CMD_CLAW_BOT_HEARTBEAT/agent_unavailable"
    ___x_cmd rmrf "$___X_CMD_CLAW_BOT_HEARTBEAT/agent_unavailable"

    claw:debug "[HB] Stopping heartbeat worker (namespace: x-claw-default-worker, name: heartbeat-runner)"
    ___x_cmd worker stop --ns x-claw-default-worker --name heartbeat-runner
}

___x_cmd_claw_run___agentwork(){
    local msg="$1"
    case "$msg" in
        HEARTBEAT:*)
            ___x_cmd_claw_run___agentwork___heartbeat "${msg#*:}"   ;;
        weixin:*|qywx:*|feishu:*|telegram:*)
            ___x_cmd_claw_run___agentwork___handlemsg "$msg"        ;;

        # other agents.
    esac
}
