Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
99 commits
Select commit Hold shift + click to select a range
1604a67
feat(addons): add the add-on runtime, navigation and first-party add-ons
mudler Oct 20, 2026
ed6e677
fix(gosec): tighten file modes and annotate false positives
mudler Oct 20, 2026
2de5ce7
fix(addons): keep API keys off recovery mutations and same-site cookies
mudler Oct 20, 2026
faa74b7
fix(addons): refuse a reinstall that would migrate retained data unba…
mudler Oct 20, 2026
bab102e
fix(addons): release the manager lock while a release is fetched
mudler Oct 20, 2026
6e34303
fix(addons): kill an add-on only after three missed health probes
mudler Oct 20, 2026
e5710a5
feat(ui): move settings under the operate hub
mudler Oct 20, 2026
66e5407
fix(addons): accept same-host browser requests that carry no fetch me…
mudler Oct 20, 2026
01a3ce4
fix(ui): show the server's reason when an add-on request is refused
mudler Oct 20, 2026
49995e4
feat(addons): run the add-on owner in the normal binary
mudler Oct 20, 2026
222d8e6
fix(addons): keep the loopback owner address stable across restarts
mudler Oct 20, 2026
c6bb769
feat(addons): let add-on pages keep the host modules they were writte…
mudler Oct 20, 2026
02a7075
feat(addons): ship Studio and Talk as add-ons instead of built-in pages
mudler Oct 20, 2026
47d53fd
test(ui): run the Studio and Talk specs against the add-on bundles
mudler Oct 20, 2026
ff617e8
fix(ui): centre the icon of a built-in tile in its icon box
mudler Oct 20, 2026
b694b3f
docs(addons): describe Studio and Talk as add-ons
mudler Oct 20, 2026
4057160
test(ui): click the shell title in the Studio slash-key spec
mudler Oct 20, 2026
2009506
fix(addons): read the loopback port file through os.Root
mudler Oct 20, 2026
e98c42c
test(ui): expect Settings under the Operate hub, not the sidebar
mudler Oct 20, 2026
43f4ff4
test(ui): drop Settings from the 404 places
mudler Oct 20, 2026
4e3040d
test(ui): drive the media history and TTS specs through the Studio ad…
mudler Oct 20, 2026
9ff00c7
test(ui): count the first-run steps, not every list item
mudler Oct 20, 2026
f75dcf2
test(ui): fail the node refresh by state, not by call count
mudler Oct 20, 2026
898357d
feat(addons): default to local-owner when auth is off
mudler Oct 20, 2026
3569da2
feat(addons): register an official add-on library by default
mudler Oct 20, 2026
422af83
docs(addons): document the ownership default and the official library
mudler Oct 20, 2026
17a27b3
feat(addons): list Studio and Talk in the first-party index
mudler Oct 20, 2026
4edf30c
test(addons): expect Studio and Talk in the official index
mudler Oct 20, 2026
2a0546c
feat(addons): add a real icon to each first-party add-on
mudler Oct 20, 2026
2ebe726
feat(addons): ship a committed icon.png instead of the generated square
mudler Oct 20, 2026
78fa0b9
feat(addons): list the tables add-on in the first-party index
mudler Oct 20, 2026
7b7cde2
feat(addons): make the Voice add-on one page with tabs
mudler Oct 20, 2026
ee1c029
feat(ui): send the old voice routes to the Voice tabs
mudler Oct 20, 2026
c1941b5
test(addons): cover the Voice tabs and the old page redirects
mudler Oct 20, 2026
c2e2877
fix(studio): keep the model menu inside a narrow screen
mudler Oct 21, 2026
958f584
test(ui): build the add-on bundles once for the whole run
mudler Oct 21, 2026
5a5b2a2
test(ui): register the worker when the add-node spec says so
mudler Oct 21, 2026
7732c94
test(ui): hold the gallery answer until the skeleton is seen
mudler Oct 21, 2026
8629744
test(ui): give the PDF tag the time the other PDF specs have
mudler Oct 21, 2026
cfdfe8f
test(ui): build the Face and Fine-tuning bundles in the global setup
mudler Oct 21, 2026
2f46931
test(ui): fix the Home answers in the stale pin spec
mudler Oct 21, 2026
4863461
test(ui): read the server address in the add-node spec from the page
mudler Oct 21, 2026
c8bc964
test(addons): give the navigation routes spec its own catalog
mudler Oct 21, 2026
4899713
fix(cli): report a failed write of the MLX hostfile
mudler Oct 21, 2026
579ed93
test(addons): discard the close error of the held listener
mudler Oct 21, 2026
63c7c72
test(addons): move the add-on tool tests to Ginkgo
mudler Oct 21, 2026
82e83bf
test(addons): move the host operation tests to Ginkgo
mudler Oct 21, 2026
50a0b5c
test(addons): move the pin store tests to Ginkgo
mudler Oct 21, 2026
c24de4f
test(addons): move the remaining add-on tests to Ginkgo
mudler Oct 21, 2026
50f0f3d
test(ui): wait for the targeted Reinstall button before the install c…
mudler Oct 21, 2026
484e25b
chore(addons): refresh the voice package digest in the first-party index
mudler Oct 21, 2026
9f5c094
test(ui): wait for the target node's Reinstall button after the popstate
mudler Oct 21, 2026
01c8aea
test(ui): give the Studio hand-off spec a budget for the cold bundle …
mudler Oct 21, 2026
719c45f
fix(addons): carry the identity page styles in the Face add-on
mudler Oct 21, 2026
4df9d3f
fix(addons): scope the narrow-screen identity rules of the Voice add-on
mudler Oct 21, 2026
479b402
fix(addons): drop the repeated title from the Voice and Face pages
mudler Oct 21, 2026
2262aa0
feat(ui): replace the Pinned sidebar section with an Apps entry
mudler Oct 21, 2026
39a75b1
test(addons): assert the single shell title on the Voice and Face pages
mudler Oct 21, 2026
aa4a0b1
fix(addons): drop the repeated title from the Voice Library and Text …
mudler Oct 21, 2026
4f355b7
feat(ui): list pinned apps under Apps in the sidebar
mudler Oct 21, 2026
7037f84
docs(addons): say that pinned apps are listed under Apps in the sidebar
mudler Oct 21, 2026
c9eb6dc
fix(ui): remove the Show all link under Apps in the sidebar
mudler Oct 21, 2026
88ccc04
feat(ui): show a first-run card on Apps when nothing is installed
mudler Oct 21, 2026
4d926ab
fix(ui): hide the pinned apps in the icon rail
mudler Oct 21, 2026
07a1260
test(ui): stop the backend redirect test racing the installed list
mudler Oct 21, 2026
45fb4e5
fix(addons): accept a same-host Referer or Origin for human confirmation
mudler Oct 21, 2026
5d05157
fix(ui): keep hub entries off the Apps route in the sidebar
mudler Oct 21, 2026
22b49be
feat(ui): label the pin control on app tiles and in the detail view
mudler Oct 21, 2026
44810e5
test(addons): check the Voice From a recording tab has one title
mudler Oct 21, 2026
bf9ec9a
fix(ui): stop the add-on shell drawing a title over add-on pages
mudler Oct 21, 2026
3b553c6
fix(addons): let each add-on draw its own page title
mudler Oct 21, 2026
484813f
feat(addons): add a kind to library entries and read unknown kinds to…
mudler Oct 21, 2026
1d8d3e3
feat(backends): install a backend from a library entry
mudler Oct 21, 2026
49b2b15
feat(ui): show the kind of library entries and install backends from …
mudler Oct 21, 2026
57816ed
docs(addons): describe backends in the library
mudler Oct 21, 2026
7493cff
feat(mcp): install a backend from a library entry
mudler Oct 21, 2026
39f77ae
fix(ui): carry the add-on library keys in every locale
mudler Oct 21, 2026
fcfdc8c
Revert "feat(mcp): install a backend from a library entry"
mudler Oct 21, 2026
967a17d
Revert "docs(addons): describe backends in the library"
mudler Oct 21, 2026
da1aca3
Revert "feat(ui): show the kind of library entries and install backen…
mudler Oct 21, 2026
3b4b84f
Revert "feat(backends): install a backend from a library entry"
mudler Oct 21, 2026
a16966f
Revert "feat(addons): add a kind to library entries and read unknown …
mudler Oct 21, 2026
61833dc
fix(ui): drop the backend library keys from the locales
mudler Oct 21, 2026
a7ea937
feat(ui): add an add-ons control to the chat header
mudler Oct 21, 2026
1c41a3b
feat(addons): let a chat request name the add-ons whose tools it uses
mudler Oct 21, 2026
74e41b6
test(addons): cover the per-add-on tool list and the chat header control
mudler Oct 21, 2026
853fef0
test(ui): check each add-on page has one title when not enabled
mudler Oct 21, 2026
dc10c7d
feat(addons): upgrade add-ons on their own when the setting is on
mudler Oct 21, 2026
afc571b
feat(ui): add the Upgrade add-ons automatically toggle to Settings
mudler Oct 21, 2026
e54d1ce
test(addons): cover the automatic upgrade setting and document it
mudler Oct 21, 2026
5d0be70
refactor(addons): name the library entry identifier id
mudler Oct 21, 2026
dbf56c6
test(addons): use the id field in the auto-upgrade test release
mudler Oct 21, 2026
e739752
fix(addons): annotate the auto-upgrade actor label for gosec
mudler Oct 22, 2026
d9367e8
fix(schema): persist the per-chat add-on tool fields
mudler Oct 22, 2026
123548e
test(ui): count the add-ons auto-upgrade setting in the settings groups
mudler Oct 22, 2026
3d89f7c
test(ui): pause the fake clock ahead of now in the clear-all spec
mudler Oct 22, 2026
5b86f6b
test(ui): hold the Studio capabilities reply longer in the skeleton spec
mudler Oct 22, 2026
3ab67fe
Merge master into feat/addons-tables
mudler Oct 22, 2026
f8c24f3
feat(i18n): add the French add-ons locale
mudler Oct 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
7 changes: 7 additions & 0 deletions .agents/backend-signing.md
Original file line number Diff line number Diff line change
Expand Up @@ -150,3 +150,10 @@ compromised and we've shipped malicious signed images:
page if/when added.
- **Tarball/HTTP backend signing.** Cosign can sign arbitrary blobs, but
for now non-OCI backends keep using the `sha256:` field in YAML.

Embedded consumers with host-provisioned private Sigstore trust can use
`cosignverify.NewVerifierWithTrustedMaterial`. It bypasses public TUF fetching,
not signature, identity, SCT, or Rekor checks. Never construct this input from a
registry attachment or catalog response. `NewVerifier` retains its public TUF
default. Hermetic cryptographic regressions live in `offline_internal_test.go`;
the optional live registry tests remain separate and are not acceptance evidence.
26 changes: 26 additions & 0 deletions .agents/localai-assistant-mcp.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,32 @@ The in-process MCP server runs inside the same LocalAI binary that serves chat.

The user chose KISS. Every mutating tool has a safety rule (`prompts/10_safety.md` rule 1) that requires the LLM to summarise the action and wait for explicit user confirmation before calling it. There is no `plan_*`/`apply_*` two-step in code. If you add a mutating tool, do **not** add per-tool confirmation logic in Go — instead, list the new tool name in `prompts/10_safety.md` so the LLM knows it falls under the confirmation rule.

## Scoped exception: add-on tools are not assistant tools

The prompt-only confirmation above applies to the admin catalog in
`pkg/mcp/localaitools/` and to nothing else. Tools of installed add-ons (for
example Tables) follow a different, code-enforced rule, documented in
[docs/content/features/tables.md](../docs/content/features/tables.md):

- They are never registered in this catalog and no `/api/addons` route appears
in `toolToHTTPRoute`. `TestToolHTTPRouteMappingComplete` stays unchanged, and
the consumer matrix test (`core/services/addons/tools`) fails if a tool name
or route of the add-on surface appears here.
- A change proposed by an add-on tool is a stored proposal. Only the proposer's
own browser session confirms it, with the digest of what the host card showed.
A model's "yes" or an argument named `approved` is never authority.
- REST-to-MCP parity is intentionally partial for add-ons: the lifecycle
mutations (install, enable, disable, upgrade, uninstall, library changes) are
deliberately **not** exposed as assistant tools, because the assistant is one
process-wide server with no per-call principal and would inherit prompt-only
authorization. Do not add them without a per-call actor and a host approval
card.
- New code that discovers or executes tools must be classified in
`tools.Consumers` (`core/services/addons/tools/consumers.go`) as route or
reject. The matrix test scans the sources and fails for an unclassified file.

Do not rewrite the unrelated assistant tools to match this rule.

## Distributed mode

The in-memory MCP server runs only on the head node (where the chat handler runs). `inproc.Client` wraps services that are already distributed-aware (`GalleryService` coordinates with workers; `ListNodes` reads the NATS-populated registry). No NATS routing of MCP tools — the admin surface lives on the head, period.
Loading
Loading