mirror of
https://github.com/kiddin9/op-packages.git
synced 2026-07-27 18:41:15 +08:00
130 lines
3.4 KiB
Bash
Executable File
130 lines
3.4 KiB
Bash
Executable File
#!/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"
|
|
}
|
|
|
|
http_get() {
|
|
local url="$1"
|
|
if command -v uclient-fetch >/dev/null 2>&1; then
|
|
uclient-fetch -O /dev/stdout "$url" 2>/dev/null
|
|
return $?
|
|
fi
|
|
if command -v wget >/dev/null 2>&1; then
|
|
wget -qO- "$url" 2>/dev/null
|
|
return $?
|
|
fi
|
|
if command -v curl >/dev/null 2>&1; then
|
|
curl -fsL "$url" 2>/dev/null
|
|
return $?
|
|
fi
|
|
return 1
|
|
}
|
|
|
|
maybe_refresh_opencode_skills_cache() {
|
|
[ -n "$data_dir" ] || return 0
|
|
[ -n "$port" ] || return 0
|
|
command -v jsonfilter >/dev/null 2>&1 || return 0
|
|
|
|
local cache_root="${data_dir}/cache/opencode/skills"
|
|
local state_root="${data_dir}/state/opencode"
|
|
local version_file="${state_root}/skills.manifest.version"
|
|
local managed_file="${state_root}/skills.managed.list"
|
|
local manifest_url="http://127.0.0.1:${port}/agentconf/skills/manifest.json"
|
|
|
|
[ -d "$cache_root" ] || mkdir -p "$cache_root"
|
|
[ -d "$state_root" ] || mkdir -p "$state_root"
|
|
|
|
local manifest version prev_version skills
|
|
manifest="$(http_get "$manifest_url")" || return 0
|
|
version="$(printf '%s' "$manifest" | jsonfilter -e '@.version' 2>/dev/null)"
|
|
[ -n "$version" ] || return 0
|
|
|
|
prev_version=""
|
|
[ -f "$version_file" ] && prev_version="$(cat "$version_file" 2>/dev/null)"
|
|
[ "$version" = "$prev_version" ] && return 0
|
|
|
|
logger -t kai "opencode skills manifest changed; refreshing managed skill cache"
|
|
|
|
if [ -f "$managed_file" ]; then
|
|
while IFS= read -r s; do
|
|
[ -n "$s" ] || continue
|
|
rm -rf "${cache_root}/${s}"
|
|
done <"$managed_file"
|
|
fi
|
|
|
|
skills="$(printf '%s' "$manifest" | jsonfilter -e '@.skills[*]' 2>/dev/null)"
|
|
if [ -n "$skills" ]; then
|
|
printf '%s\n' "$skills" >"$managed_file"
|
|
printf '%s\n' "$skills" | while IFS= read -r s; do
|
|
[ -n "$s" ] || continue
|
|
rm -rf "${cache_root}/${s}"
|
|
done
|
|
else
|
|
: >"$managed_file"
|
|
fi
|
|
|
|
printf '%s\n' "$version" >"$version_file"
|
|
return 0
|
|
}
|
|
|
|
start_kai_bin(){
|
|
procd_open_instance kai_bin
|
|
procd_set_param command /usr/sbin/kai_bin -a 0.0.0.0 -p "$port"
|
|
procd_set_param stderr 1
|
|
procd_set_param respawn
|
|
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"
|
|
procd_set_param env \
|
|
OPENCODE_CWD="${cwd}" \
|
|
OPENCODE_CONFIG="http://127.0.0.1:${port}/agentconf/opencode.json" \
|
|
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/sbin/kai_session
|
|
procd_append_param command serve --port "8196" --hostname "127.0.0.1"
|
|
procd_set_param stderr 1
|
|
procd_set_param respawn
|
|
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"
|
|
start_kai_bin
|
|
sleep 1
|
|
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"
|
|
maybe_refresh_opencode_skills_cache
|
|
start_kai_session
|
|
logger -t kai "Starting KAI Service Completed"
|
|
}
|
|
|
|
service_triggers() {
|
|
procd_add_reload_trigger "kai"
|
|
}
|