feat(tools): auto-discover per-app <app>.tools.json (drop-in tool registration)

webui_tools.sh now merges any containers/<app>/<app>.tools.json into apps-tools.json
(jq, sets .apps[<app>]) on top of the central heredoc. So a dropped-in app — e.g.
from LibrePortal-Infra — registers its own Tools-tab actions WITHOUT editing this
file. Combined with the container scan already sourcing containers/<app>/*.sh live,
an app can now be fully self-contained (install fn + tool fns in <app>.sh + tool
declarations in <app>.tools.json) → true copy-on-top deploy, no array regen, no
central edits. Core apps in the heredoc are unaffected; invalid tools files are
skipped with a notice. Verified the merge (drop-in registers, core preserved).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Signed-off-by: librelad <librelad@digitalangels.vip>
This commit is contained in:
librelad 2026-05-25 22:13:54 +01:00
parent 1efb5cf772
commit 7bed2de2d2

View File

@ -414,6 +414,23 @@ webuiGenerateAppsToolsConfig() {
}
JSON
# Merge per-app tool declarations so a DROPPED-IN app (e.g. from LibrePortal-Infra)
# registers its own Tools tab actions without editing this file. Each app may ship
# containers/<app>/<app>.tools.json = { "tools": [ … ] } (same schema as above);
# it sets .apps[<app>]. Core apps declared in the heredoc need no such file.
if command -v jq >/dev/null 2>&1; then
local _tj _app
for _tj in "${install_containers_dir}"*/*.tools.json; do
[[ -f "$_tj" ]] || continue
_app="$(basename "$(dirname "$_tj")")"
if jq -e . "$_tj" >/dev/null 2>&1; then
jq --arg app "$_app" --slurpfile t "$_tj" '.apps[$app] = $t[0]' "$tmp" > "$tmp.m" && mv "$tmp.m" "$tmp"
else
isNotice "Skipping invalid tools file: $_tj"
fi
done
fi
if command -v jq >/dev/null 2>&1; then
if ! jq . "$tmp" >/dev/null 2>&1; then
isNotice "Generated apps-tools.json failed JSON validation; keeping existing file."