mirror of
https://github.com/kiddin9/op-packages.git
synced 2026-10-30 07:05:13 +08:00
🎉 Sync 2026-09-21 03:58:45
This commit is contained in:
1 parent
da26c8c705
commit
b8539f4af6
8 files changed
+443
-74
No files matched your search
@@ -17,10 +17,38 @@ function index()
|
||||
return
|
||||
end
|
||||
|
||||
local install = entry({"admin", "services", "agentflow", "agent_install"}, call("agentflow_agent_install"))
|
||||
install.leaf = true
|
||||
|
||||
local page = entry({"admin", "services", "agentflow"}, cbi("agentflow"), _("AgentFlow"), 100)
|
||||
page.dependent = true
|
||||
end
|
||||
|
||||
local function write_json(obj)
|
||||
http.prepare_content("application/json")
|
||||
http.write_json(obj)
|
||||
end
|
||||
|
||||
local function require_post_csrf()
|
||||
local dispatcher = require "luci.dispatcher"
|
||||
local context = dispatcher.context or {}
|
||||
local expected = context.authtoken or context.token
|
||||
|
||||
if (http.getenv("REQUEST_METHOD") or "") ~= "POST" then
|
||||
http.status(405, "Method Not Allowed")
|
||||
write_json({ ok = false, error = "method not allowed" })
|
||||
return false
|
||||
end
|
||||
|
||||
if not context.authsession or not expected or http.formvalue("token") ~= expected then
|
||||
http.status(403, "Forbidden")
|
||||
write_json({ ok = false, error = "invalid csrf token" })
|
||||
return false
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
local function uhttpd_has_apps_proxy_prefix()
|
||||
local uci = require "luci.model.uci".cursor()
|
||||
local mappings = uci:get_list("uhttpd", "main", "proxy_prefix") or {}
|
||||
@@ -119,8 +147,97 @@ function agentflow_status()
|
||||
proxy_prefix_enabled = uhttpd_apps_proxy_available(),
|
||||
linkeasefull_running = linkeasefull_running()
|
||||
}
|
||||
http.prepare_content("application/json")
|
||||
http.write_json(status)
|
||||
write_json(status)
|
||||
end
|
||||
|
||||
function agentflow_agent_install()
|
||||
local fs = require "nixio.fs"
|
||||
local jsonc = require "luci.jsonc"
|
||||
local sys = require "luci.sys"
|
||||
local util = require "luci.util"
|
||||
local task_id = "agentflow-agent-install"
|
||||
local task_script = "/tmp/agentflow-agent-install.sh"
|
||||
local installer_url = "https://fw.koolcenter.com/binary/geili/agentflow/releases/installapp/installapp-mise.sh"
|
||||
local agents = {
|
||||
codexcli = true,
|
||||
["claude-code"] = true,
|
||||
opencode = true,
|
||||
kimi = true,
|
||||
reasonix = true
|
||||
}
|
||||
|
||||
if not require_post_csrf() then
|
||||
return
|
||||
end
|
||||
|
||||
local agent = http.formvalue("agent") or ""
|
||||
if not agents[agent] then
|
||||
write_json({ ok = false, error = "unsupported agent" })
|
||||
return
|
||||
end
|
||||
if not fs.access("/etc/init.d/tasks") then
|
||||
write_json({ ok = false, error = "taskd is not available" })
|
||||
return
|
||||
end
|
||||
if not fs.access("/lib/functions/mise.sh") then
|
||||
write_json({ ok = false, error = "mise environment helper is not available" })
|
||||
return
|
||||
end
|
||||
|
||||
local task_status = sys.exec("/etc/init.d/tasks task_status " .. task_id .. " 2>/dev/null")
|
||||
local status = jsonc.parse(task_status) or {}
|
||||
local running = type(status) == "table" and status.running
|
||||
if running == true or running == 1 or running == "1" or running == "true" then
|
||||
write_json({ ok = true, busy = true, task_id = task_id })
|
||||
return
|
||||
end
|
||||
|
||||
local install_script = table.concat({
|
||||
"set -e",
|
||||
"agent=" .. util.shellquote(agent),
|
||||
"installer_url=" .. util.shellquote(installer_url),
|
||||
'installer="/tmp/agentflow-installapp-mise.$$"',
|
||||
'cleanup() { rm -f "$installer" "$0"; }',
|
||||
"trap cleanup 0 HUP INT TERM",
|
||||
'. /lib/functions/mise.sh',
|
||||
'if ! istore_runtime_env; then echo "[agentflow] Failed to initialize the shared runtime environment" >&2; exit 1; fi',
|
||||
"set -u",
|
||||
"export MISE_YES=1",
|
||||
'echo "[agentflow] Downloading installer: $installer_url"',
|
||||
'if command -v wget >/dev/null 2>&1; then',
|
||||
'\twget -O "$installer" "$installer_url"',
|
||||
'elif command -v curl >/dev/null 2>&1; then',
|
||||
'\tcurl -fL -o "$installer" "$installer_url"',
|
||||
'elif command -v uclient-fetch >/dev/null 2>&1; then',
|
||||
'\tuclient-fetch -O "$installer" "$installer_url"',
|
||||
"else",
|
||||
'\techo "[agentflow] No HTTPS download tool is available" >&2',
|
||||
"\texit 1",
|
||||
"fi",
|
||||
'if [ ! -s "$installer" ]; then echo "[agentflow] Failed to download the agent installer" >&2; exit 1; fi',
|
||||
'chmod 0700 "$installer"',
|
||||
'echo "[agentflow] Running installapp-mise.sh for $agent in $HOME"',
|
||||
'/bin/sh "$installer" "$agent"'
|
||||
}, "\n")
|
||||
if not fs.writefile(task_script, install_script .. "\n") then
|
||||
write_json({ ok = false, error = "failed to create install task", task_id = task_id })
|
||||
return
|
||||
end
|
||||
if sys.call("chmod 0600 " .. util.shellquote(task_script)) ~= 0 then
|
||||
fs.unlink(task_script)
|
||||
write_json({ ok = false, error = "failed to secure install task", task_id = task_id })
|
||||
return
|
||||
end
|
||||
|
||||
local command = "/bin/sh " .. util.shellquote(task_script)
|
||||
local rc = sys.call("/etc/init.d/tasks task_add " .. task_id .. " " .. util.shellquote(command) .. " >/dev/null 2>&1")
|
||||
if rc ~= 0 then
|
||||
fs.unlink(task_script)
|
||||
write_json({ ok = false, error = "failed to start install task", task_id = task_id })
|
||||
return
|
||||
end
|
||||
|
||||
write_json({ ok = true, task_id = task_id })
|
||||
end
|
||||
|
||||
function agentflow_open()
|
||||
|
||||
Reference in new issue
Block a user