Commit 86f75c6
feat: master-password vault, aios uninstall, and a plugin store
VAULT (aios_vault.py) — a master password set at install that gates destructive,
irreversible operations: `aios uninstall`, and disabling the guardrails.
The obvious promise — "the AI can't delete it" — is not achievable by encryption
alone: the agents run as you and have a shell, so any file you can delete they
can delete. What IS enforceable, and what this does:
1. The password is never stored, only scrypt(pw, salt) with n=2^15 (~32MB,
~0.1s/attempt). There is nothing to read back, even with the file.
2. Deleting it must not GRANT anything. Every protected op fails CLOSED — no
vault, a corrupt vault, or two copies that disagree all REFUSE. That turns
"delete the password to escape the gate" into locking yourself out.
3. Tamper-evidence: self-checksummed and mirrored outside the repo, so a
`git clean` or a rewritten project tree can't silently drop it.
4. The agents' shell refuses to touch the vault paths (aios_sec.guard),
checked BEFORE the guardrails-enabled switch — since disabling guardrails
is itself vault-protected, letting that unlock vault deletion is circular.
Adversarially tested: editing the hash, deleting both copies, deleting one copy,
and replacing one copy with a correctly-checksummed forgery are all rejected;
deleting the vault refuses the uninstall rather than allowing it; a single
surviving copy auto-heals once the real password proves ownership.
UNINSTALL — `aios uninstall` requires the password, then stops services, removes
the global CLI shim and autostart, and KEEPS your .aios state unless --purge. It
never deletes the project folder. Refuses with exit 1 on a wrong password and
when no password is set at all.
Fixed while testing: getpass() on Windows reads the console directly and ignores
a pipe, so `echo pw | aios uninstall` hung forever instead of failing. Non-tty
stdin now reads the line, which makes it scriptable and unable to hang.
PLUGIN STORE (aios_plugins.py) — one place to browse and install everything
installable, normalising four genuinely different mechanisms: OpenClaw channels
(26), ruflo packs (40, via `npx ruflo plugin add`), skills (13), and OpenClaw
feature plugins. The catalogue is read from what's actually on disk rather than
hardcoded, so it reflects this install. New Plugin Store view with kind filters
and search, plus GET/POST /api/plugins and /api/vault (which never returns
anything secret).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>1 parent f8be98c commit 86f75c6
6 files changed
Lines changed: 704 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
820 | 820 | | |
821 | 821 | | |
822 | 822 | | |
| 823 | + | |
823 | 824 | | |
824 | 825 | | |
825 | 826 | | |
| |||
1952 | 1953 | | |
1953 | 1954 | | |
1954 | 1955 | | |
| 1956 | + | |
| 1957 | + | |
| 1958 | + | |
| 1959 | + | |
| 1960 | + | |
| 1961 | + | |
| 1962 | + | |
| 1963 | + | |
| 1964 | + | |
| 1965 | + | |
| 1966 | + | |
| 1967 | + | |
| 1968 | + | |
| 1969 | + | |
| 1970 | + | |
| 1971 | + | |
| 1972 | + | |
| 1973 | + | |
| 1974 | + | |
| 1975 | + | |
| 1976 | + | |
| 1977 | + | |
| 1978 | + | |
| 1979 | + | |
| 1980 | + | |
| 1981 | + | |
| 1982 | + | |
| 1983 | + | |
| 1984 | + | |
| 1985 | + | |
| 1986 | + | |
| 1987 | + | |
| 1988 | + | |
| 1989 | + | |
| 1990 | + | |
| 1991 | + | |
| 1992 | + | |
| 1993 | + | |
| 1994 | + | |
| 1995 | + | |
| 1996 | + | |
| 1997 | + | |
| 1998 | + | |
| 1999 | + | |
| 2000 | + | |
| 2001 | + | |
| 2002 | + | |
| 2003 | + | |
| 2004 | + | |
| 2005 | + | |
| 2006 | + | |
| 2007 | + | |
| 2008 | + | |
| 2009 | + | |
| 2010 | + | |
| 2011 | + | |
| 2012 | + | |
| 2013 | + | |
| 2014 | + | |
| 2015 | + | |
| 2016 | + | |
| 2017 | + | |
| 2018 | + | |
| 2019 | + | |
| 2020 | + | |
| 2021 | + | |
| 2022 | + | |
| 2023 | + | |
| 2024 | + | |
| 2025 | + | |
| 2026 | + | |
| 2027 | + | |
| 2028 | + | |
| 2029 | + | |
| 2030 | + | |
| 2031 | + | |
| 2032 | + | |
| 2033 | + | |
| 2034 | + | |
| 2035 | + | |
| 2036 | + | |
| 2037 | + | |
| 2038 | + | |
| 2039 | + | |
| 2040 | + | |
| 2041 | + | |
| 2042 | + | |
| 2043 | + | |
| 2044 | + | |
| 2045 | + | |
| 2046 | + | |
| 2047 | + | |
| 2048 | + | |
| 2049 | + | |
| 2050 | + | |
| 2051 | + | |
| 2052 | + | |
| 2053 | + | |
| 2054 | + | |
| 2055 | + | |
| 2056 | + | |
| 2057 | + | |
| 2058 | + | |
| 2059 | + | |
| 2060 | + | |
| 2061 | + | |
| 2062 | + | |
| 2063 | + | |
| 2064 | + | |
| 2065 | + | |
| 2066 | + | |
| 2067 | + | |
| 2068 | + | |
| 2069 | + | |
| 2070 | + | |
| 2071 | + | |
| 2072 | + | |
| 2073 | + | |
| 2074 | + | |
| 2075 | + | |
| 2076 | + | |
| 2077 | + | |
| 2078 | + | |
| 2079 | + | |
| 2080 | + | |
| 2081 | + | |
| 2082 | + | |
| 2083 | + | |
| 2084 | + | |
| 2085 | + | |
| 2086 | + | |
| 2087 | + | |
| 2088 | + | |
| 2089 | + | |
| 2090 | + | |
| 2091 | + | |
| 2092 | + | |
| 2093 | + | |
| 2094 | + | |
| 2095 | + | |
| 2096 | + | |
| 2097 | + | |
| 2098 | + | |
| 2099 | + | |
| 2100 | + | |
| 2101 | + | |
| 2102 | + | |
| 2103 | + | |
| 2104 | + | |
| 2105 | + | |
| 2106 | + | |
| 2107 | + | |
| 2108 | + | |
| 2109 | + | |
| 2110 | + | |
| 2111 | + | |
| 2112 | + | |
| 2113 | + | |
| 2114 | + | |
| 2115 | + | |
| 2116 | + | |
| 2117 | + | |
| 2118 | + | |
| 2119 | + | |
| 2120 | + | |
| 2121 | + | |
| 2122 | + | |
| 2123 | + | |
| 2124 | + | |
| 2125 | + | |
| 2126 | + | |
| 2127 | + | |
| 2128 | + | |
| 2129 | + | |
| 2130 | + | |
| 2131 | + | |
| 2132 | + | |
1955 | 2133 | | |
1956 | 2134 | | |
1957 | 2135 | | |
| |||
2201 | 2379 | | |
2202 | 2380 | | |
2203 | 2381 | | |
2204 | | - | |
| 2382 | + | |
2205 | 2383 | | |
2206 | | - | |
| 2384 | + | |
2207 | 2385 | | |
2208 | 2386 | | |
2209 | 2387 | | |
| |||
2351 | 2529 | | |
2352 | 2530 | | |
2353 | 2531 | | |
| 2532 | + | |
| 2533 | + | |
| 2534 | + | |
| 2535 | + | |
| 2536 | + | |
| 2537 | + | |
| 2538 | + | |
| 2539 | + | |
| 2540 | + | |
2354 | 2541 | | |
2355 | 2542 | | |
2356 | 2543 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
36 | 36 | | |
37 | 37 | | |
38 | 38 | | |
| 39 | + | |
| 40 | + | |
39 | 41 | | |
40 | 42 | | |
41 | 43 | | |
| |||
1500 | 1502 | | |
1501 | 1503 | | |
1502 | 1504 | | |
| 1505 | + | |
| 1506 | + | |
| 1507 | + | |
| 1508 | + | |
1503 | 1509 | | |
1504 | 1510 | | |
1505 | 1511 | | |
| |||
1762 | 1768 | | |
1763 | 1769 | | |
1764 | 1770 | | |
| 1771 | + | |
| 1772 | + | |
| 1773 | + | |
| 1774 | + | |
| 1775 | + | |
| 1776 | + | |
| 1777 | + | |
| 1778 | + | |
| 1779 | + | |
| 1780 | + | |
| 1781 | + | |
| 1782 | + | |
| 1783 | + | |
| 1784 | + | |
| 1785 | + | |
| 1786 | + | |
| 1787 | + | |
| 1788 | + | |
| 1789 | + | |
| 1790 | + | |
| 1791 | + | |
| 1792 | + | |
| 1793 | + | |
| 1794 | + | |
| 1795 | + | |
| 1796 | + | |
1765 | 1797 | | |
1766 | 1798 | | |
1767 | 1799 | | |
| |||
0 commit comments