#!/bin/sh /etc/rc.common START=93 USE_PROCD=1 get_config() { config_get_bool enabled $1 enabled 1 config_get data_dir $1 data_dir "" config_get port $1 port "8197" config_get auth_mode $1 auth_mode "openwrt_luci" } start_kai_bin(){ procd_open_instance kai_bin procd_set_param env KAI_AUTH_MODE="$auth_mode" procd_set_param command /usr/sbin/kai_bin -a 0.0.0.0 -p "$port" procd_set_param stderr 1 procd_set_param respawn 3600 5 5 procd_close_instance } mkdir_cwd(){ [ -d "$1" ] || mkdir -p "$1" } start_kai_session(){ procd_open_instance kai_session local root="${data_dir}" local cwd="${data_dir}/cwd" local agent_root="/usr/share/kai/agent" if [ ! -f "${agent_root}/opencode.json" ] || [ ! -d "${agent_root}/skills" ]; then logger -t kai "local OpenCode Agent bundle is missing under ${agent_root}" return 1 fi procd_set_param env \ OPENCODE_CONFIG="${agent_root}/opencode.json" \ KAIPLUS_SKILLS_DIR="${agent_root}/skills" \ ISTORE_AI_HELPER_BASE="http://127.0.0.1:${port}" \ XDG_CACHE_HOME="${root}/cache" \ XDG_DATA_HOME="${root}/data" \ XDG_CONFIG_HOME="${root}/config" \ XDG_STATE_HOME="${root}/state" procd_set_param command /usr/libexec/kai-session-launch "${cwd}" procd_set_param file "${agent_root}/opencode.json" "${agent_root}/manifest.json" procd_set_param stderr 1 procd_set_param respawn 3600 5 5 procd_close_instance } start_service() { config_load kai config_foreach get_config kai if [ "$enabled" != 1 ]; then return 1 fi if [ -z "${data_dir}" ]; then logger -t kai "data_dir is empty; please set option data_dir in /etc/config/kai" return 1 fi logger -t kai "Starting KAI Service" mkdir_cwd "${data_dir}" mkdir_cwd "${data_dir}/cwd" mkdir_cwd "${data_dir}/cache" mkdir_cwd "${data_dir}/data" mkdir_cwd "${data_dir}/config" mkdir_cwd "${data_dir}/state" start_kai_session || return 1 start_kai_bin logger -t kai "Starting KAI Service Completed" } service_triggers() { procd_add_reload_trigger "kai" }