* claim: #4846
* Assistant: say so when a turn ends without using SolidCraft's tools
When tools were offered and a completed turn made no tool call and no
change, the chat panel shows a short notice pointing to tool-capable
models: always for an empty reply, and for a text-only reply to an
explicit edit request. Plain answers to questions stay quiet. The
control channel exposes it as turnWarning.
* Fix the Anthropic loop test for the tools event; add ja and zh for the no-tool-call notice
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: bherbruck <brennen.herbruck@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #4846
* Warn when Ollama models lack tool support (#4846)
Check Ollama model capabilities in the background and cache results per
endpoint and model. Show an advisory warning for models without tools,
expose it through ui.agent_chat, and document the behavior.
Cover capability parsing, warning selection, background probing, caching,
and selection changes with synthetic regression tests.
* Keep the Ollama capability probe out of the web build
The panel never calls it there, so it would only be dead code.
* Wrap the model warning instead of cutting it off
In a narrow panel the end of the sentence, the part that says what to do, was truncated.
* Fix AgentConfig default after rebase onto main
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Move the Ollama no-tools warning into a pending locale file with ja and zh
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: bherbruck <brennen.herbruck@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
When an agent's models come from several providers (Hermes and OpenCode
name each one "Provider · model" or say "Provider: ..." in its
description), the chat header shows a provider drop-down before the model
drop-down, and the model drop-down lists only that provider's models
without the provider in front. It opens on the provider of the model in
use; picking a provider alone changes nothing. ui.agent_chat takes
provider and reports providers and provider.
* claim: #5439
* Agent chat: each design tab keeps its own conversation (#5439)
* Adapt chat-per-tab changes to the new Pending context and cursor tests
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: bherbruck <brennen.herbruck@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Agent chat: no per-message limit by default
The limit is optional now: an Unlimited checkbox on the AI page (checked by default), a
number field when unchecked. A saved 24, the old default, reads as unlimited. The API-key agent's
24-request and the gate's 400-request caps are gone; Stop still cancels.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Agent chat: add the new messages to the complete Japanese and Chinese catalogs
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #5546
* Agent chat: hand WSL paths to agents started through wsl.exe (#5546)
An ACP agent started through wsl.exe was handed the session's working
folder and the solidcraft-app bridge's command as Windows paths, which it
can't use: the Claude adapter refuses the session, and the bridge never
starts. When the agent's program is wsl or wsl.exe, convert both to their
WSL form (C:\Users\... -> /mnt/c/Users/...) before session/new, in the
chat and in the Test button. The bridge still runs on Windows and reaches
the app at 127.0.0.1.
* Agent chat: a Mammouth AI preset for OpenAI-compatible endpoints (#5815)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Agent chat: the key test names the Mammouth AI URL too (#5815)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #5009
* Assistant: a request timeout per endpoint for slow models (#5009)
An OpenAI-compatible endpoint now stores how long one model request may
take (request_timeout_s, 300 s by default, clamped to 30 s ..= 1 h). It
is set in the Add agent dialog and in the endpoint's entry under Agents
(a running conversation uses a change from its next request), through
ui.agent_chat add_agent, and reported in the chat's state. A request
that runs out of time says the limit and where to raise it instead of
"timeout: global". The desktop HTTP cap goes from 900 s to an hour.
The tool-call timeout stays 330 s: it covers SolidCraft's own tool work
and the user's Allow, never the model.
* Assistant settings: line up an endpoint's Request timeout with Permissions
The label column of an agent's entry is wide enough for "Request timeout",
so the label isn't cut and both rows share one column.
* claim: #2224
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* Agent chat: keep Send in view for a long message, open "View attached" (#2224)
The message box sat in a fixed 92-point reserve, so a long message grew it
past the panel and took Send, Stop and Attach view with it. The box is now a
panel of its own at the bottom: it grows upwards up to a cap, then scrolls,
and the conversation takes what is left.
The picture sent with a message is kept on it (once the agent starts on the
message), and the "View attached" caption opens it in a window.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* Agent chat: a message's pictures as thumbnails with a hover preview and a viewer (#2224)
Instead of a window on the far side of the screen: the pictures of a message
show as small thumbnails under it, hovering one shows it bigger for as long as
the pointer stays, and a click opens a viewer over the app with the message's
pictures one at a time (previous and next, arrow keys, Esc). A picture carries
a note shown with it, so attachments of other kinds can use the same viewer.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* claim: #2286
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* Agent chat: Attach selection sends what is selected in the model with the message (#2286)
A checkbox beside Attach view. The selection is read when the message is
sent (also for a queued one) and described: faces and edges with the names,
indices and points the tools take plus their size and place, features by name
and kind, bodies by name; at most 64, the rest counted. The agent gets it as
text after the message; the conversation shows the message as typed with the
things as grouped chips (hover for what the agent was told).
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* WIP: the chat's context picker dialog (#2286)
* Agent chat: Pick context, a picker for elements, features and bodies (#2286)
A button beside Attach selection opens the picker: a dialog with Elements,
Features and Bodies inputs, so clicks in the model, the timeline and the
browser pick into the active one (clicking again takes one out), with the
usual highlight. OK puts the picks as chips with an x above the message box;
they go with the next message like an attached selection (text for the agent,
chips in the conversation) and the tray is empty again afterwards. Cancel
keeps what was picked before. The control channel opens it with pick.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* Agent chat: Attach selection counts and describes what was clicked, not the pieces of a rim (#2286)
A click on a circular rim or a split surface selects all its pieces for the
commands. The checkbox counted them one by one and the agent got one entry
per piece (reported on macOS). They are now grouped back into the click they
came from: one chip, one entry with the whole size, and the indices of every
piece in its detail. Edge details are looked up by position as well as
index.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* Agent chat: a message's picture is kept on exactly that message (#2224)
The turn now carries its message's place in the conversation (also through a
queue and a send again after a sign-in), so its picture is kept there, once,
and never on an older message that also wanted one (review of #2225).
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* Agent chat: use the UI kit's checkbox and button and the font tokens (guard tests)
Main's UI-kit guard tests reject raw egui checkboxes, buttons and font sizes in the
chat panel; Attach selection, Pick context, the chip remove button and the chip fonts
now come from ui_kit and Tokens.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-authored-by: bherbruck <brennen.herbruck@gmail.com>
* claim: #4851
* solidcraft-cli bench-assistant: the standard Assistant model test
Runs the eleven v1 tasks of #4851 against a desktop app that is already
running with a control port. Each task starts a new design and a new chat
with All permissions, runs only the prescribed setup, sends the prompt
once and waits for the turn. The result is checked on the design
(document.inspect with measurements): body count, volume within 1%
(0.3% for the fillet), bounding-box size in any orientation, the lowest
corner, the body name, live feature kinds, and changed or unchanged
content; the volume question is checked on the reply. Failures get the
issue's categories from the conversation's items. Prints a table, and
writes the issue's comment template (--markdown) and the raw results
with each conversation (--json).
* claim: #5015
Co-Authored-By: Claude Code <noreply@anthropic.com>
* Assistant: add Anthropic-compatible API agents (#5015)
The Add agent wizard now offers Anthropic-compatible endpoints beside OpenAI-compatible ones. The API backend speaks the Anthropic Messages protocol with the same MCP bridge, tool gate, limits, undo and keychain rules: x-api-key and anthropic-version, a top-level system note, input_schema tools, content-block answers and one user tool_result message per round. Test sends a short message because compatible endpoints (Qwen's) need not list models.
Co-Authored-By: Claude Code <noreply@anthropic.com>
---------
Co-authored-by: Claude Code <noreply@anthropic.com>
* claim: #4765
* Agent chat: explain the Flatpak sandbox when no agent is found (#4765)
In the Flatpak the sandbox has no home-folder or network access, so agents
installed through nvm or ~/.local/bin are never discovered and the chat only
said that no agent was found. With FLATPAK_ID set and nothing discovered, the
picker and Preferences > AI now say why and offer the exact
`flatpak override --user ai.storyteller.solidcraft ...` command with a Copy
button. The message is in every catalog, and docs/agent-chat.md gains a
Flatpak section listing what each permission is for. The manifest is
unchanged.
* Vertical history strip: left of the browser, compact rows, hollow-circle marker, collapsed rail hover
* Vertical history strip: seam handle to expand and collapse names, drag to resize with snap
* Vertical history strip: no empty gap below the transport
* Show the history seam arrow only on hover (#2028)
* claim: #2021
* Redesign the Assistant chat panel with shared UI components
* Show Assistant in the shared floating panel shell
* Extend floating Assistant to viewport height and shift navigation
* Dock Assistant before history and match docking preview bounds
* Align Assistant top margin with floating shell cards
* Extract a shared panel drag grip
* Rebuild responsive history sizing and three-way docking
* Share browser and History collapse hover styling
* Show the History title as soon as its text fits
* Animate stacked browser and History expansion and collapse
* Make panel folding responsive and independent of frame delays
* Let folding panel contents shrink continuously to header height
* Use four explicit History transport actions in every layout
* Resize the shared Browser and History column from either card
* claim: shared compact-mode containers (#2029)
* Centralize layout-aware UI containers and enforce their use
* Keep docked Assistant at the outer edge beside tool sheets
* Use shared surface policy for Assistant tool space
* Let tool sheets drag over shell panels while avoiding Assistant
* Update Parameters drag bounds assertion for shell overlap
* Keep dragged tool sheets below ribbon and workspace selector
* Enforce universal UI containers in mandatory repository checks
* Remove legacy report windows and require shared window composition
* Remove retired UI styling and require shared controls
* claim: compact layout preference (#2029)
---------
Co-authored-by: bherbruck <brennen.herbruck@gmail.com>
* ui: spacing, radius and type tokens, per-tab accents, agent and on-accent tokens
* ui: per-tab accent behaviour and a larger application bar with a Start page button
* icons: silhouette master and flat assistant and agent link icons (open for review)
* icons: apply review notes (sparkle assistant, refined plug, silhouette halo)
* icons: wire the silhouette master to inspect.silhouette; record the accepted icons
* ui: application bar to the design: separators, Save, house, assistant icon, readable hovers
* ui: ribbon structure: Model to View tabs, contextual Sketch and Sheet Metal, migrated pins
* ui: ribbon painting to the compact design
* ui: smaller icon button highlight and assistant mark on the bubble corner
* ui: short ribbon labels that wrap at spaces
* ui: ribbon buttons fit their labels and Finish Sketch shows its full name
* ui: constraint gallery, workspace menu, section list headings and richer tooltips
* ui: lighter selected tab label, ribbon surface and dimmer bar separators match the dark design
* ui: document tabs as rounded chips with a dimmer inactive label
* ui: document tabs fit their names and show close only when active or hovered
* icons: close and plus masters for the document tabs (open for review)
* ui: centre the new-tab plus and overflow button on the bar
* ui: a quiet rule under the ribbon tabs on non-contextual tabs
* ui: the application bar mark separates its faces with the bar colour, not white
* ui: open ribbon section label uses the selected tint and a chevron
* ui: dim the tab close and plus icons until hovered
* ui: every ribbon dropdown uses the chevron, the workspace card included
* ui: the active document tab uses the design's surface colour
* ui: the bug button's right padding mirrors its icon side
* ui: square constraint cells and a rule before the grid
* ui: constraint cells back to their earlier size, keeping the rule
* ui: smaller constraint cells and icons, centred in the section
* ui: constraint cells fit the height of the large buttons' icon and label
* ui: sketch Create titles share the other labels' line
* ui: format the application bar and ribbon changes
* ui: active tab surface token and the colour and hover tests that follow the redesign
* tests: the merged parameter and narrow toolbar tests follow the compact ribbon
* i18n: the Malay Gap label has an English source and its Japanese and Chinese translations
* apply_off_thread tests: the evaluation lingers in tests, so still computing never depends on machine speed
---------
Co-authored-by: bherbruck <brennen.herbruck@gmail.com>
* claim: #2592
* fix(agent-chat): the design bridge is named solidcraft-app (#2592)
A user's own MCP entry named `solidcraft` (as docs/mcp.md suggests) took the
bridge's place in agents that keep their own entry on a name clash, so the chat
worked on a headless session instead of the open design.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: bherbruck <brennen.herbruck@gmail.com>
Grok Build is added as one more entry in the agent discovery list, over ACP, like the others. Thanks @cfaulkingham.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* Agent chat prototype: drive an ACP agent the user already has from a side panel
A desktop-only chat panel (off by default) that starts a coding agent over the
Agent Client Protocol and gives it SolidCraft's MCP server, bridged to the open
window through the token-protected control channel with the default folder
limits. It finds installed agents (Claude Code and Codex adapters, Gemini CLI,
Copilot, Qwen, OpenCode, goose) with version and login state, streams text,
tool calls and plans, shows the agent's permission requests, and when an agent
isn't signed in shows its own login methods without handling any credential.
Design notes and findings: docs/design/in-app-agent-chat.md.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* docs: say only what the end-to-end run showed
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Agent chat: gate, one undo per message, docking, process groups, discovery polish
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Agent chat: Settings → AI, several agents with a switcher, OpenAI-compatible endpoints, permission modes, toolbar button
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Agent chat: translations, tool cards, Add agent dialog fixes, test agent saves on its own
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Agent chat: third-party licences for the keychain crates; clippy
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Agent chat: badge text from the theme tokens
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Agent chat: Auto-allow model edits is the default permission mode
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>