Skip to content

v1.12.0 — Admin WebUI + curl-based Bambu FTPS upload

Choose a tag to compare

@IkarusMK IkarusMK released this 12 Jul 18:29
· 8 commits to main since this release

Added — Admin WebUI at /ui

Manage the brain from a browser — no terminal needed. Served by the same container alongside /mcp (no extra service, no extra port), in the AICortex banner look, language switchable DE/EN, fully self-contained (strict CSP, no CDNs, no build step).

Page What you can do
Overview Version, enforce status, live counts
Vault Secret names only — add tokens/API keys/passwords (shared or per-user), delete. Values are write-only by design
Skills Browse by category, view, create/edit/delete (same house rules as skill_write)
Services & devices Read-only inventory of every registry incl. target + referenced secret name — only constructed fields leave the endpoint, nothing can leak
Users Roles (admin/user/viewer) + per-user areas in policy.json
Logs Authz audit log — who called which tool, allowed/denied and why; filterable, newest first

Login: OIDC authorization code + PKCE against your own IdP (e.g. Pocket ID). Register ONE extra redirect URI: <BASE_URL>/ui/callback, then open <BASE_URL>/ui. Admin role required for management; signed HttpOnly session cookies; CSRF-guarded mutations; every action audited (names only, never values). Without OIDC (local testing) the UI is open on the localhost-only bind. Opt-out: UI_ENABLED=0.

The endpoints call the same module functions as the MCP tools (secrets_store.vault_*, skills helpers, tenancy._write_policy) — UI and assistant cannot drift.

Fixed — Bambu FTPS upload now goes through curl

The v1.10.2 session-reuse shim was not enough: Python's ftplib still failed to resume the TLS session on the DATA channel against the P1S SD store, so STOR hung into "read operation timed out". FTPS uploads (implicit and explicit) now shell out to curl (config via stdin — the password never touches argv), which implements FTPS session reuse natively. The vetted egress IP is pinned into curl (resolve=) so the SSRF/anti-rebinding guarantee survives the external process; TLS knobs (ca_bundle > tls_insecure > verify) match netguard.ssl_context. Plain FTP keeps the ftplib path. curl added to the image.

Tests: tests/test_webui.py (17) · tests/test_ftp_curl.py (7) — full suite 43 passed.

Deploy: git pull && docker compose pull && docker compose up -d — then add the /ui/callback redirect URI in your IdP.