Commit Graph
8998 Commits
Author SHA1 Message Date
Ettore Di GiacintoandClaude Sonnet 5.5 91be89bed0 test(addons): list the new session specs in the gateway case inventory
The gateway suite checks the specs of the session package against an
inventory. Eight specs were added without being listed, so the suite
failed on an inventory mismatch.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-03 13:49:04 +00:00
Ettore Di GiacintoandClaude Sonnet 5.5 fcff7da9dd fix(addons): keep the resource listing on a forwarding replica
The resource mapping of an app is not part of the apps API, so the apps
list lost it when a frontend replica read the list from the owner. The
model listing tool of Tables then vanished on a replica. Send the
mapping beside the list on the carrier and put it back on arrival.

The fixture library also stamped every package with manifest API 1, so
the real Tables manifest, which declares a listing, was refused with
package_fetch_failed. Give a package API 2 when it declares one.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-03 13:49:04 +00:00
Ettore Di Giacinto b7f1151995 fix(studio): follow the agent's model and explain context failures
A connector chat kept the model its agent had when the chat was made, so
changing the agent's model did not reach senders with an existing chat.
Move the kept chat to the agent's current model when a message arrives.

A turn that failed because the tool definitions or the conversation did
not fit the context window showed only the generic error sentence. Name
the cause and the sizes, and give the same sentence in the web chat and
in the bots. A refused tool definition now has its own code.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 12:07:30 +00:00
Ettore Di Giacinto 13e96219ba fix(studio): read an alias's model settings from its target
The chat harness took the context window, agent options and input
modalities from the config of the name a chat asked for. An alias has
no model of its own and the loader gives it the generic default
window, so a chat on an alias budgeted against 4096 tokens and failed
on tool schemas even when the target ran with a far larger window.
Resolve the alias to its target first, as the capabilities endpoint
already does.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 12:07:30 +00:00
Ettore Di Giacinto e0173d8096 docs(api): drop thread_context from the connector create description
Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:57:44 +00:00
Ettore Di Giacinto 76c79e5ae6 docs: the bot always reads the thread of a mention
Remove the instructions to switch thread reading off and the
thread_context field from the API reference. The privacy statement
stays: the bot reads only the thread where it was mentioned.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:54:41 +00:00
Ettore Di Giacinto 26767b6b88 refactor(ui): remove the thread context switch from the connector page
The connector page no longer shows the switch or sends thread_context.
The host reads the thread of a mention whenever the kind can give it.
The Slack page spec checks that the switch is absent and not sent.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:54:41 +00:00
Ettore Di Giacinto c8cb68b434 refactor(studio): always read a thread when the bot is mentioned in it
The thread_context binding setting is removed. When the kind declares
the history ability and the bot is mentioned in a thread, the host
reads the thread once for a new chat, as before. The other guards stay:
the ability check, the bound, the untrusted block, and a failure never
blocks the answer.

A binding stored by an earlier build still loads. The JSON store
ignores the unknown field. The GORM row no longer maps the
thread_context_off column; AutoMigrate does not drop it and it accepts
NULL, so reads and writes keep working. No data is migrated or removed.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:54:33 +00:00
Ettore Di Giacinto 11d1f972ed feat(chats): report the host ceiling with the file limits
The Settings page states the ceiling in effect from this field.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:47:51 +00:00
Ettore Di Giacinto 6cda05c526 test(addons): name the files API spec apart from the network one
Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:47:51 +00:00
Ettore Di Giacinto b56470cf29 test(addons): list the new specs in the case inventory
Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:47:51 +00:00
Ettore Di Giacinto 0f5faf5249 docs(connectors): document the file limits and the files ability
Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:47:51 +00:00
Ettore Di Giacinto e7b5e5ad36 feat(settings): set the host ceiling of connector files
The owner policy key connector_files_ceiling_bytes gets a field on the
Settings page, next to the add-on upgrade setting. It states the ceiling
in effect and that larger files need the add-on to support streaming.
The host settings client accepts the new key as a number.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:47:51 +00:00
Ettore Di Giacinto 2249c51c4c feat(connector-ui): add a Files section to the connector page
The section has a field for the largest file the bot reads and one for
the largest it sends. A value can only lower the limit of the add-on.
Each field shows the limit in effect and the layer that sets it, and the
page says that larger files need the add-on to support streaming while
the inline cap is the limit. The fixed 1 MB in the intro is gone.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:47:50 +00:00
Ettore Di Giacinto 86a93259ce feat(chats): show and set the file limits of a connector binding
The connector list shows, for each binding and each kind, the limit in
effect in both directions, the layer that sets it, the ability the kind
declares and the most an owner may set. A binding accepts
file_receive_max_bytes and file_send_max_bytes; a value above the limit
of the kind is a 400.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:47:50 +00:00
Ettore Di Giacinto 3f5b23e3e7 feat(addons): add a host ceiling for connector files to the owner policy
The key connector_files_ceiling_bytes sets the largest file a connector
moves. Zero means the default of 100 MB. The key is always written, and
a policy document stored before it reads as the default. The connector
manager reads the ceiling from the owner policy at each resolution.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:47:50 +00:00
Ettore Di Giacinto 6d3aec30b3 feat(studio): build connector file limits and sentences from one resolver
The limit of a file is the smallest of the host ceiling, the ability the
connector kind declares, the owner's setting for the binding and the cap
of the inline path. One function decides it and names the layer that
won. The sentences to the sender and to the model are built from that
number and layer, in KiB or MiB, instead of a fixed 1 MB. A guard spec
fails when these files carry a size or a byte count of their own.

The owner can lower the limit of a binding; a value above the limit of
the kind is refused.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:47:50 +00:00
Ettore Di Giacinto a6c74acd76 feat(connectors): store a file limit per binding
A binding keeps an optional limit for the files it reads and the files it
sends. Zero means the owner sets none. Both stores keep the values and the
validation bounds them.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:47:50 +00:00
Ettore Di Giacinto 198d03125b feat(addons): let a connector kind declare its file abilities
A connector kind can declare files.receive and files.send, each with a
maximum size and optional media types. The field is additive and needs
manifest api 2. A kind that declares nothing keeps the inline path.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:47:50 +00:00
Ettore Di Giacinto 45f7ff0b1c test(ui): cover the separate list of chats that no person started
Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:41:13 +00:00
Ettore Di Giacinto dae3d34a21 feat(ui): show chats that no person started apart from the person's chats
Chats that a trigger, a connector, a job or a page started no longer fill
the sidebar, Jump back in or the default All chats list. All chats gets a
second tab, From add-ons and automations, that groups them by origin kind
and by origin, using the name of the binding or the trigger (a kind this
release does not know falls under a generic group). The All chats entry
in the sidebar shows how many of them wait for the person. Ctrl+K still
finds every chat and marks these with a badge, and a transcript of such a
chat says what started it, with a link to its page. The browser remembers
the tab.

The lists ask the server for origin=person or origin=automated, so a
burst of bot chats cannot push a person's chats off a page.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:41:13 +00:00
Ettore Di Giacinto d676d629a0 feat(studio): filter the chat list by origin
GET /api/chats takes an optional origin parameter: person (chats a
person started), automated (every other chat) or one origin kind such as
trigger or connector. The limit counts the chats kept, so a flood of
chats that a connector or a trigger started cannot push the chats of a
person off a page, and the other way round. Without the parameter the
list is unchanged.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:41:13 +00:00
Ettore Di Giacinto d0ac371e01 fix(studio): do not report a draft chat as not selected
A chat that is not created yet has no add-on bound to it, so its
execution status cannot be read. The host now says so with the reason
draft, and the Home composer shows no commands warning for it.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:31:37 +00:00
Ettore Di Giacinto da60e435be fix(session): give host tools the product scope of their turn
A harness may call a tool with a context that carries nothing of the
turn. Lend the values of the turn to the tool, so a status read in the
tool shares the turn's observation instead of starting without one.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:31:37 +00:00
Ettore Di Giacinto a728722c29 fix(studio): read the execution status inside a scope on every turn path
load_skill runs with the context the harness gives it, which has no
execution scope, so the status of the commands read as not selected and
the document skills were dropped. Make the descriptor and skill
resolution open a scope when the context has none, and report a scope-less
status read as a programming error: logged once in production, a failure
of the spec in tests.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:31:36 +00:00
Ettore Di Giacinto 67a503c224 test(studio): load_skill must load a document skill under an isolated Sandbox
The spec builds the turn tools under the product scope and then calls
load_skill with a context of its own, as the harness does. It fails
with the not_selected text on master.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:31:36 +00:00
Ettore Di Giacinto 095d621b03 docs(chats): describe thread context, the follow setting and connector options
Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:30:11 +00:00
Ettore Di Giacinto 18b07842a8 feat(ui): edit the thread context switch and the options of a connector kind
The shared connector page reads the kind list. It shows the thread
context switch for a kind that can give a thread's messages, and a
select for each option that the kind declares. The spec names of the
contract suite are listed for the harness.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:30:11 +00:00
Ettore Di Giacinto 88aae9aa41 feat(slack): follow only the threads the bot started, and keep them
The option followThreads says which threads the bot follows without a new
mention: own (default) follows the threads that a top-level mention
started, any also follows a thread that other people started once the bot
is mentioned in it, never needs a mention each time. A mention inside a
thread that people started is answered and, in own mode, not followed.
The followed threads are kept in the add-on's data directory, written
atomically, and expire after a day without a message, so a restart or a
reconnect does not make the bot forget them.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:30:11 +00:00
Ettore Di Giacinto 0e50c3f9ca feat(addons): let a connector kind declare per-binding options
A kind can declare options with a few values and a default (manifest
api 2). The host checks the owner's choice against the declaration,
stores it on the binding, shows it in the REST API and sends the value in
effect with every poll. The add-on decides what the option means.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:30:11 +00:00
Ettore Di Giacinto 96a2a7c104 test(studio): run the thread history through the Slack and Telegram fixtures
Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:30:11 +00:00
Ettore Di Giacinto bef3fc2a0a feat(slack): read the earlier messages of a thread
The Slack add-on declares history.thread (manifest api 2) and serves the
op history with conversations.replies. It pages through the thread, keeps
the newest messages, marks the bot's own, names the authors from a small
cache and gives file names only. A thread of more than 1000 messages is
refused instead of shown from its middle. The fake Slack serves
conversations.replies.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:30:11 +00:00
Ettore Di Giacinto f426ef1532 feat(addons): serve the op history in the shared connector route
A platform that implements HistoryReader answers the op history. The
route checks the thread, bounds the limit and the answer, and does not
wait out a rate limit.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:30:11 +00:00
Ettore Di Giacinto f6f0dce5e5 feat(studio): give a new thread chat the earlier messages of the thread
When a message in a thread makes a new chat, the host asks the add-on of
a kind that declares history for the earlier messages, once, and hands
them to the first turn as a delimited block of untrusted content. The
block is bounded in messages and bytes, keeps the newest, is flattened
and escaped, and is not kept in the transcript. A failure or a missing
ability leaves the turn as it was.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:30:11 +00:00
Ettore Di Giacinto f20b7250ad feat(studio): add the thread_context switch to connector bindings
A binding reads the earlier messages of a thread by default. The new
thread_context option turns that off, and the kind list says which kinds
can give a thread's messages. It is stored like send_files: the zero
value keeps the default.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:30:11 +00:00
Ettore Di Giacinto ca5c8e79e3 feat(addons): add the history op to the connector contract
A connector kind can declare history.thread in its manifest (api 2) and
then serves the op history: the earlier messages of one thread, oldest
first, bounded by a limit. A kind that declares nothing is never asked.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:30:11 +00:00
Ettore Di Giacinto fca8eacf2f fix(addons): use a neutral example for the network title
The provider guard rejects a shipped add-on name in a string literal,
and the swagger example of the network title in the apps view named one.
Use a neutral example value.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 11:29:36 +00:00
Ettore Di Giacinto c886ba7ec2 test(studio): pass a network name to the prompt guard
Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 10:58:46 +00:00
Ettore Di Giacinto f284c4b84b test(addons): leave the declared network out of the gateway copy
The apps list reads capabilities.network from the receipt's manifest, and
no gateway call depends on it, as for the connector.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 10:58:46 +00:00
Ettore Di Giacinto 3273f1772b test(addons): inventory the network capability specs
Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 10:58:46 +00:00
Ettore Di Giacinto bcd81fbc2e docs(addons): document the network capability
Describe capabilities.network for add-on authors: its fields, how the
host control attaches to it, that the chats_egress_* settings keep their
names and values, and how a manifest without the field keeps working.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 10:58:46 +00:00
Ettore Di Giacinto b930e55528 feat(ui): name the network from the add-on's declaration
The Network row of the chat Tools menu, the consent and blocked cards and
the network-policy block on an add-on's Settings tab take the network
title and the preset titles from the API (network, as the add-on
declares it) and no longer say "Sandbox". The setting labels are
neutral. A second add-on with another ID and title gets the same row,
card and block.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 10:58:46 +00:00
Ettore Di Giacinto f9fdd167a3 test(studio): keep add-on names out of the network text
Fail when a file that builds the text of the command network, the
built-in bash or the host-exec setting writes the name of an add-on.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 10:58:46 +00:00
Ettore Di Giacinto cf3de8886f feat(sandbox): declare the network capability in the manifest
The manifest keeps asking for the network-policy control and the
egress.check operation, and now also declares capabilities.network with
the title the host uses in text. A test keeps the control working for a
manifest of the same shape that declares no network.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 10:58:46 +00:00
Ettore Di Giacinto fc6abfca8c refactor(studio): name the network from the add-on's declaration
The chat's network view, the administrator view and the line the model
reads about the network of its commands now take their name from the
capabilities.network an add-on declares, or from the title of its
commands tool when it declares none. The sentences no longer say
"Sandbox" or "the sandbox". The API gains a network object with the
title and the preset titles next to the existing addon field.

The text of the built-in bash and of the host-exec setting names an
add-on that provides bash instead of one add-on.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 10:58:46 +00:00
Ettore Di Giacinto 9dac1214bc feat(addons): list the declared network in the apps API
An app whose network-policy control the host draws now carries its
declared network: the kind, a title for text (the declared one, else the
add-on's own) and the preset titles. The control no longer needs a tool
that shadows bash when the add-on declares capabilities.network.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 10:58:46 +00:00
Ettore Di Giacinto f7a4c68fad feat(addons): add a network capability to the manifest
The network-policy host control was tied to a tool that shadows bash, so
it could only belong to an add-on that replaces that one tool. An add-on
now declares capabilities.network (kind egress-check, an optional title
and optional preset titles) and the host attaches the control to the
declaration. A manifest that declares nothing keeps the old attachment.

The field is additive and needs manifest api 2 and the egress.check host
operation.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 10:58:46 +00:00
Ettore Di Giacinto 0bcf6b648e test(ui): follow the shared model picker in four e2e specs
The agent task form, the scheduling rule sheet and the add-on model
selector now draw the shared picker: a button that opens a listbox, with
a warm or cold tag inside each option name. Four specs still used the
old select, combobox and exact option names.

Task and rule specs open the picker button and choose from the list. The
rule spec types a custom name in the filter and takes it with Enter. The
diarization and 3D animation specs match options by their model name
prefix, as the other specs already do.

Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 10:57:02 +00:00
Ettore Di Giacinto c8b757f4a3 refactor(chats): say "the platform" in the connector test instruction
Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 10:47:28 +00:00
Ettore Di Giacinto 63066ed1c3 docs(addons): say that core words the provider by its declared title
Assisted-by: Claude Code:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 10:43:37 +00:00