Commit graph

2942 commits

Author SHA1 Message Date
Alessandro Frau
573f3c2e05
Merge pull request #1943 from TerminallyLazy/codex/plugin-asset-precedence
Some checks are pending
Build And Publish Docker Images / plan (push) Waiting to run
Build And Publish Docker Images / build (push) Blocked by required conditions
fix: honor user-first plugin asset precedence
2026-10-08 15:13:04 +02:00
lazy
14c38f4ea7 fix: prioritize user plugin assets over bundled plugins 2026-10-08 05:26:22 -04:00
Alessandro
5a1698ce62 Simplify Browser quick settings and expand browser configuration
Some checks are pending
Build And Publish Docker Images / plan (push) Waiting to run
Build And Publish Docker Images / build (push) Blocked by required conditions
Keep quick settings focused on the model preset, Host/Container choice,
native page zoom, and installed Chrome extensions. Show a dimmed host
configuration link only in Host mode, and match the Browser and Zoom
labels to the preset label.

Move extension creation, installation, and review into Browser config.
Open Chromium management pages for browsing data, history, passwords,
autofill, extensions, and downloads through the existing Browser surface.
Honor native download folder and save-dialog preferences, and add
annotation screenshots as an opt-in setting that defaults off.

Update the Browser contracts and regression coverage. Validation: 201
browser/tool tests and 29 host-connector tests passed, with the host suite
isolated from existing module stubs. Live checks on localhost:32083
covered settings navigation, runtime selection, zoom, annotation attachments,
download preferences, matching typography, and narrow layouts.
2026-10-08 01:14:08 +02:00
Alessandro
cb93ed055b Fix disappearing chats when Sidebar Folders is disabled
Another plugin could import the disabled folders store, registering a
replacement list view even though the folders UI was absent. This hid
the standard chat and task lists while their data remained intact.

Register view and sorting callbacks when each list extension mounts and
remove them on unmount, preserving other plugins' callbacks. Reuse the
existing component lifecycle hooks without adding work per chat or snapshot.

Add regression coverage for indirect imports, filter cleanup, remounting,
and preservation of other plugins' sorting. Document the lifecycle contract.

Validation: frontend checks and 13 focused pytest tests passed. Live WebUI
checks covered disable/re-enable, folder/flat switching, nested selection,
and component unmount cleanup at localhost:32081.
2026-10-08 00:37:29 +02:00
Alessandro
33b5397023 Polish stop icon with a filled rounded square
Render the shared stop icon as a solid, subtly rounded square using currentColor and CSS clipping. Preserve icon sizing, inherited colors, and the font-loading visibility guard, and document the shared styling contract.

Validation: both WebUI icon tests passed; visually checked the live UI at desktop and mobile sizes in dark and light themes.
2026-10-08 00:22:45 +02:00
Alessandro
186acbc58c Show success feedback when copying OAuth device codes
Reuse the shared button-feedback helper to briefly show a green checkmark after copying a sign-in code, while preserving existing notifications and automatic reset.

Cover successful copies, clipboard failures, and missing codes in the reconnect regression test; update plugin documentation.

Validation: 218 OAuth tests and 3 plugin scan tests passed, along with the Node reconnect test and a live UI check of clipboard contents, success styling, and icon reset.
2026-10-07 23:57:22 +02:00
Alessandro
935fb5cdcc Add context window display controls and price currency selection
Add plugin settings to toggle the full context breakdown and each provider
usage row. Match price typography to the cache and token summary rows.

Keep USD amounts unchanged without exchange-rate requests. Convert non-USD
prices using validated Frankfurter rates cached for 24 hours, with dated
tooltips and an explicit USD fallback when a rate is unavailable. Preserve
stored provider usage and back off failed lookups for five minutes.

Validation: 20 context-window plugin tests pass. Verified settings persistence,
EUR price rendering, USD fallback, and exchange-rate lookup against the live
Docker runtime at localhost:32081.
2026-10-07 23:31:54 +02:00
Alessandro
429946fba4 Fix Responses prompt caching in long conversations
Retain each completed local Responses turn's masked extras in result
metadata and replay them at their original boundary. This keeps growing
tool and user turns from discarding cacheable prompt prefixes.

Preserve replay eligibility, secret masking and history summaries, and
include retained extras in Responses compression accounting. Chat
Completions and fallback requests retain their existing behavior.

Validation: 238 targeted tests passed in the framework runtime. A live
GPT-6.1 Sol conversation reached 131,099 input tokens with 130,176 cached
(99.3%) on a user follow-up.
2026-10-07 18:18:51 +02:00
Alessandro
5a4b4130b2 Use native LiteLLM routes for core providers
Route Nebius, Venice chat, Z.AI/Coding and OpenRouter embeddings through
LiteLLM's native integrations. Retain the Token Factory and Coding endpoint
overrides, OpenRouter attribution, and Venice/proxy embedding fallbacks.
Keep Cerebras and Z.AI model-list URLs in listing metadata while allowing
LiteLLM to supply inference defaults and Copilot request headers.

Merge YAML-declared extra_body defaults, legacy top-level values and explicit
nested overrides in the shared provider-default loader. This preserves saved
Venice settings without provider-specific branches in the model-config plugin.

Validation: 114 focused SDK, API-key, onboarding, model-search and preset tests
passed in the port-32081 framework runtime with LiteLLM 1.104.0. Native routes
were checked over loopback HTTP without paid provider calls; the restarted
service returned HTTP 200 and loaded the updated provider definitions.
2026-10-07 15:30:09 +02:00
Alessandro
b91384f4fb Upgrade LiteLLM and OpenAI with framework startup migration
Update LiteLLM to 1.104.0, OpenAI to 2.54.0, and python-dotenv to 1.2.2.
Raise shared security floors for aiohttp, anyio, urllib3, filelock, fsspec,
and multidict while retaining the compatible OpenAI 2.x SDK line.

Use the existing startup_migration hook to apply the same requirements to
v2.x Docker instances updating to v2.14. Read versions from requirements.txt,
install only when requirements are unmet, and reuse restart_process() to
load the upgraded SDKs before serving requests. Skip current and non-Docker
environments, bound installation time, and propagate installation failures.

Add installed-SDK HTTP tests for Chat Completions, Responses, streaming,
tools, state, usage, fallback, embeddings, and Anthropic cache markers.
Cover dependency migration, restart behavior, and installation failures.

Validation:
- 70 focused dependency, SDK, and self-update tests passed.
- Docker startup upgraded the v2.0-v2.13 SDK pins and became healthy in
  24 seconds, with exactly one dependency installation and process restart.
- An already-current startup performed no installation or extra restart.
- pip check passed; live Codex Responses and Moonshot Chat Completions
  tasks and follow-ups validated the upgraded SDK versions.
2026-10-07 14:50:32 +02:00
Alessandro
e3269ed6d1 chore(oauth): pin Codex client version to 0.160.1
Update the default Codex client version from 0.159.2 to 0.160.1 for upstream request headers and model catalog discovery. Document explicit pinning for each adopted version while preserving saved settings overrides.

Validation: 90 tests passed across tests/test_oauth_codex.py and tests/test_plugin_scan_prompt.py; git diff --check passed.
2026-10-07 13:08:57 +02:00
Alessandro
52744fe7b1 Fix sidebar folder lag during activity and focus updates
Replace repeated full-context family scans with a fresh parent-child index shared within each grouping and filter pass.

Retain unchanged configuration, ordering, project lists and rendered sections to avoid unnecessary sidebar reconciliation. Preserve reactive row metadata, nested family pins, sorting, filters and collapse behavior without a persistent cache.

Add frontend regressions and document the state-identity contracts. Verified the frontend suite, 33 focused Python tests and 17 live browser checks. In a local 274-chat sample, median activity updates fell from about 67 ms to 15 ms; unchanged focus refreshes produced zero sidebar DOM mutations.
2026-10-06 21:31:33 +02:00
Alessandro
27b7df8917 Restore full-response repeat checks for native tool calls
Some checks are pending
Build And Publish Docker Images / plan (push) Waiting to run
Build And Publish Docker Images / build (push) Blocked by required conditions
Compare public commentary together with canonical function calls when
recording and checking the previous response. This restores the historical
full-message policy for native turns, so changed or missing commentary
can distinguish otherwise identical calls.

Keep canonical call history, masking, provider metadata and state
advancement intact. Exclude provider IDs and separate reasoning from the
comparison; identical public text and calls remain guarded.

Cover commentary changes and absence, call changes and batches, provider
metadata round trips, and legacy thoughts/headline behavior. Update the
owning contracts. Verified with 177 passing tests, four recorded Mac
warning replays and a live two-call drill using the Codex II preset.
2026-10-06 18:49:30 +02:00
Alessandro
ad5bebbea5 Send complete SSH commands without blocking the event loop
Paramiko Channel.send can accept only part of a command. Ignoring its byte
count truncated large inputs, including heredocs whose closing delimiters
never reached the shell.

Use sendall through asyncio.to_thread and route shell initialization through
the same send path. Close the SSH connection when an in-flight send is
cancelled so partial input cannot contaminate later commands. Cancellation
intentionally discards that SSH session and its shell state.

Add regressions for multi-packet Unicode delivery and blocked-window
responsiveness/cancellation, and document the SSH send contract.

Validation: 24 focused tests passed. Real Paramiko transport and container
OpenSSH probes delivered complete large single/nested heredocs and preserved
shell state across terminal, Python and Node.js calls. No local TTY, prompt
readiness, tool-dispatch, or platform-specific heredoc workaround changes.
2026-10-06 18:49:30 +02:00
Alessandro
95ba588abc Fix native Windows TTY cleanup
Choose graceful or forced termination inside the existing process helper so
Windows never evaluates the POSIX-only SIGKILL constant. Pass SIGTERM to
pywinpty.kill(), whose native API requires an explicit signal argument.
Keep POSIX process-group TERM-then-KILL escalation and cleanup unchanged.

Cover normal close, forced escalation, kill, and destructor cleanup with a
Windows-shaped process adapter. All 22 focused TTY/pager tests pass, and a
native Windows 11 probe verifies state preservation, destructor termination,
fresh-shell close, and normal asyncio shutdown.
2026-10-06 18:49:30 +02:00
Alessandro
c58061f0ee Keep terminal I/O from blocking shared event loops
Use nonblocking POSIX PTY reads and buffered, cooperative writes so a full
terminal or stale readiness notification cannot stall other chats. Discard
a shell on cancellation only while command bytes remain unsent, preserving
shell state after a fully drained send.

Use best-effort synchronous destruction instead of reentering asyncio;
explicit close retains the existing awaited cleanup and signal escalation.

Add isolated regression checks for payload integrity, loop responsiveness,
partial and complete-send cancellation, descriptor reuse, cross-thread
cleanup, and destruction. Document the terminal lifecycle contracts.

Validation: 28 focused terminal, parallel-lifetime, and pager tests passed.
Four real Codex II chats also completed concurrent Linux terminal, Python,
and Node workloads with 29.87 seconds of overlap and intact shell state.
2026-10-06 18:49:30 +02:00
Alessandro
4dceb49211 fix(computer-use): start host sessions on the first action
Some checks failed
Build And Publish Docker Images / plan (push) Has been cancelled
Build And Publish Docker Images / build (push) Has been cancelled
Start a missing chat session and resume the requested desktop action within
the same tool call. Limit recovery to one session-required response on the
same host and context, preserving approval checks and explicit session IDs.

Update host prompts to begin with an observation and add Linux X11/XWayland
guidance for verified focus, viewer scaling, popup handling, slow input,
and visual verification. Keep the internal Docker/Xpra desktop separate.

Validation: 26 Core prompt/metadata checks passed locally and in the live
framework environment; 42 focused connector tool tests passed. Native GUI
acceptance was not rerun because host Computer Use was disabled.
2026-10-02 18:03:32 +02:00
Alessandro
60c940fd03 fix(model-config): detect Claude models across providers
Some checks failed
Build And Publish Docker Images / plan (push) Has been cancelled
Build And Publish Docker Images / build (push) Has been cancelled
The Anthropic thoughts-prompt hook previously activated only when the
provider or model name contained "anthropic". Claude models exposed by
third-party or OpenAI-compatible providers without that identifier
therefore missed the prompt adaptation.

Extend the existing detection with a case-insensitive "claude" match
in the effective main model name, regardless of provider. Preserve the
existing "anthropic" match in either the provider or model name.

Keep the public-action-summary substitutions and prompt scope unchanged.
Preserve shared prompt templates, the thoughts JSON field, saved history,
custom wording, and native protocol projection. Do not change transport
error handling or suppress provider content-policy errors.

Add regression coverage for Claude-only model names across OpenRouter,
OpenAI-compatible, Vertex AI, Bedrock, and generic providers, plus mixed
case and negative cases. Update the plugin contract and README.

Validation:
- Reproduced five failing Claude-only cases before the fix.
- Passed 99 targeted prompt, model-config, and onboarding tests using
  /opt/venv-a0/bin/python.
- Passed git diff --check.

Live A0 API/provider behavior was not retested; this fixes the detection
gap but does not establish that every provider refusal is resolved.
2026-09-30 19:03:54 +02:00
Alessandro Frau
421730f118
Merge pull request #1736 from RemyLoveLogicAI/dev-workflow/1731-litellm-reasoning-fallback
Rebased onto ready and resolved the transport conflict, including the missing closing parenthesis. Preserves current reasoning filtering and tool-call handling. Includes focused regression coverage and documentation; 126 tests passed.
2026-09-30 16:48:20 +02:00
Alessandro
2715fed8f8 test(models): cover Chat Completions reasoning fallback
Cover streaming and complete messages, legacy-field precedence, empty or missing reasoning, and encrypted-reasoning filtering. Document the transport contract.

Validation: transport, Responses architecture, encrypted-reasoning, and refusal suites passed (126 tests); git diff --check passed.
2026-09-30 16:47:56 +02:00
Jeremy Jones
9aca3adbb8 fix: add reasoning field fallback in ChatCompletionsTransport.parse (#1731) 2026-09-30 16:47:28 +02:00
Alessandro
af74550409 fix(oauth): pin Codex client version to 0.159.2
Update the bundled Codex version used for upstream request headers and model discovery from 0.155.1 to 0.159.2.

Clarify that blank version overrides probe the installed CLI and do not discover new releases. Saved settings continue to take precedence.

Validation: 221 OAuth and plugin scan tests passed. The live runtime resolved 0.159.2 after updating its saved override, and model discovery returned 11 models.
2026-09-30 16:18:38 +02:00
Alessandro
50832e0229 Persist sidebar project, status, and activity filters
The sidebar saved View and Sort by, but kept Project, Status, and Last activity
only in memory. Reloading reset those three controls to their defaults.

Store the filters in the existing Sidebar Folders configuration and reuse its
save/load API. Preserve the empty No project value, apply safe defaults to
missing or malformed settings, and keep the menu open when changing filters.
Changing view or sort retains the selected filters.

Update defaults, documentation, and frontend regression coverage for saving,
reloading, fallback values, and menu behavior.

Validation: frontend checks and seven focused Python tests passed. Live native
dropdown checks confirmed named-project and No-project selections survive
reloads, including after changing view and sort. Original runtime settings
were restored afterward.
2026-09-30 16:13:10 +02:00
Alessandro
f4700b4256 Track direct subordinate execution with its own context task
Some checks are pending
Build And Publish Docker Images / plan (push) Waiting to run
Build And Publish Docker Images / build (push) Blocked by required conditions
Direct delegation awaited the child's monologue without assigning a task to
its separate context. Child chats therefore appeared idle while working and
could not be stopped independently through the normal context controls.

Run direct delegation through the child's existing AgentContext.run_task and
await its result. Propagate caller cancellation to the child, while treating
a child-only Stop as a recoverable error for the parent. Preserve inline
execution for legacy shared-context agents and existing parallel job ownership.

Add lifecycle coverage for direct and nested completion, failure, parent/child
Stop, intervention, and legacy execution. Update profile test doubles and the
tool's ownership documentation.

Validation: 121 focused checks passed; the nine lifecycle cases also passed
in the container framework runtime. Live UI checks verified Working/Paused
transitions, child reuse, completion, and parent recovery after child-only Stop.
2026-09-30 15:55:03 +02:00
Alessandro
c550092b6d Fix chat activity timestamps at the history write boundary
History writes updated Agent.last_message, while sidebar snapshots and saved
chats read AgentContext.last_message. Continuing a chat could therefore leave
its activity timestamp unchanged.

Update the context timestamp in the shared history writer. Preserve explicitly
supplied timestamps across initialization hooks so greeting history does not
make restored chats appear newly active.

Add regression coverage for user, AI, tool, and warning messages in parent and
child contexts, including serialization and continued activity after reload.
Document ownership of the activity timestamp.

Validation: 15 focused tests passed, plus the new regression in the container's
framework runtime. Two live UI messages advanced Thread+ activity timestamps
while preserving creation time; saved JSON and the reloaded UI matched.
2026-09-30 15:41:18 +02:00
Alessandro
0efb0d4f8f Improve scheduler prompt editing and support optional YAML
Some checks failed
Build And Publish Docker Images / plan (push) Has been cancelled
Build And Publish Docker Images / build (push) Has been cancelled
Give task prompts full-width, resizable fields and an expanded view in
the shared modal stack. Preserve drafts on failed saves and keep actions
in the pinned footer.

Honor the selected initial task state and inherit only the active chat's
project. Support existing tasks.yaml files through the existing helpers,
with JSON remaining the default and taking precedence. Do not migrate
existing task files or change scheduler execution logic.

Validation:
- 28 focused scheduler, timezone, and tool-contract checks passed.
- 8 checks passed in the Docker framework runtime.
- Live desktop/mobile creation, editing, deletion, and storage checks.
2026-09-24 00:59:39 +02:00
Alessandro
50db781a4d Reduce browser startup and rendering overhead
Some checks are pending
Build And Publish Docker Images / plan (push) Waiting to run
Build And Publish Docker Images / build (push) Blocked by required conditions
Avoid starting Chromium for empty tab listings while preserving saved-tab
restoration. Honor navigation readiness without redundant load waits or
fixed pauses, and let WebUI navigation return at document commit.

Skip automatic history screenshots for inspection, evaluation, and batches
containing only those actions. Read page metadata in one evaluation and
report the actual loading state. Reuse the native viewer display size when
no resize is requested, preventing page zoom from enlarging and clipping
frames during navigation.

Update browser documentation and regression coverage. Validated 194 browser
regression/output tests and 29 host-browser tests in separate runs, plus
live WebUI navigation, pointer input, screenshots, and repeated reloads.
Local test-page medians improved from 474 to 83 ms for navigation and from
82 to 19 ms for content reads.
2026-09-23 23:38:37 +02:00
Alessandro
45b74ab7cf fix(oauth): guide Codex reconnection and add sign-in code copying
Handle rejected Codex refresh tokens with a clear authentication error and
an actionable toast that opens OAuth settings. Stop retrying marked tokens
and offer Reconnect without requiring a manual disconnect; successful
sign-in replaces credentials while cancellation preserves model choices.

Display device challenge codes in a selectable box with an accessible copy
button and success/error feedback. Keep recovery behavior inside _oauth
and document the connection lifecycle.

Validation: 221 Python checks and the Node frontend regression passed.
Verified recovery navigation, reconnect cancellation, clipboard copying,
keyboard access, and desktop/mobile layouts at localhost:32081 using
simulated OAuth responses.
2026-09-23 21:56:23 +02:00
Alessandro
12b3cb83fb Fix model search spinner alignment
Target x-icon children in the model search button so the magnifier and loading spinner share the same grid cell. The stale span selector placed the spinner in a second row after the icon migration. Document the alignment contract.

Validation: 9 focused tests passed; verified centered icons during loading in the live WebUI at localhost:32081.
2026-09-23 21:28:27 +02:00
Alessandro
e3051fb584 Fix v2.13 desktop dependency installation
Some checks failed
Build And Publish Docker Images / plan (push) Has been cancelled
Build And Publish Docker Images / build (push) Has been cancelled
Resolve the existing Python 3.13-compatible package pins from a signed, dated Debian archive while preserving normal Kali sources.

Validated seven focused tests, a full amd64 image build, LibreOffice/Chromium/Xpra smoke checks, and ARM64 dependency resolution.
2026-09-23 19:39:16 +02:00
Alessandro
3397c4f87c Reduce sidebar agent indentation and remove row tooltips
Reduce indentation from 30px to 25px at the first two child levels, preserving the deeper-level taper.

Remove new-chat and overflow tooltips from sidebar rows while retaining accessible labels and both Chats header tooltips. Update sidebar contracts to match.

Validation: 7 focused pytest checks passed, sidebar folder frontend checks passed, and live browser checks confirmed row labels and header tooltips.
2026-09-23 18:44:19 +02:00
Alessandro
965c4d07be Cache empty plugin lookup results
get_plugins_list, get_enabled_plugins and get_enabled_plugin_paths
checked cached values by truthiness, so empty lists were recomputed on
every call. Profiles and tools without plugin-provided paths re-ran
find_plugin_dir for every enabled plugin on each lookup: about 5,700
calls per Responses tool build. Check for None like the other cache
sites; plugin watchdog clears still invalidate the same areas.

Add a regression proving an empty path lookup is computed once and
document the contract. Tool prompts remain uncached.

Validation: 108 focused plugin and tool-resolution tests passed with
this change alone on the original base in the Docker framework
runtime. The new regression fails on the old code. The earlier full
suite reported 1,981 passed, with 7 pre-existing or Playwright Chromium
environment failures. Earlier warm measurements showed Responses tool
builds dropping from 112 ms to 58 ms and the tools system prompt from
77 ms to 46 ms.
2026-09-23 18:27:38 +02:00
Alessandro
d1be399f38 Reuse pooled connections for Codex upstream requests
request_codex opened a new TCP and TLS connection to the Codex
backend for every main and utility model call. Send through a
module-level keep-alive requests.Session with cookie persistence
disabled, so each request still carries only its explicit headers.

Point the request-header test stub at the session and document the
contract.

Validation: 246 OAuth, model-config, onboarding and plugin-contract
tests passed with this change alone on the original base in the
Docker framework runtime. Earlier container measurements showed
connection reuse saving 50-80 ms per chatgpt.com request.
2026-09-23 18:11:36 +02:00
Alessandro
827f9176d2 Skip rate-limiter token counting without limits
apply_rate_limiter tokenized the full serialized prompt on every call
even when no request, input or output limit was configured. Return
early in that case; callers already skip output accounting when no
limiter is returned.

Add a regression for missing config, disabled limits, and each enabled
limit; document the accounting contract.

Validation: 115 rate-limiter, streaming, Responses and embedding tests
passed with this change alone on the original base in the Docker
framework runtime. The disabled-limits regression fails on the old
code. Earlier live Codex measurements with a 760 KB prompt showed
about 70 ms dropping to 0 ms in apply_rate_limiter.
2026-09-23 18:11:13 +02:00
Alessandro
ade204c7e3 Build native tools only for Responses turns
call_chat_model_turn built Responses function tools on every call,
although the Chat Completions transport drops them. Gate the build on
the chat model's a0_api_mode, as responses_history.prepare_call
already does, and pass an empty tool list and name map otherwise.

Add a parametrized regression for Chat and Responses turns and
document the contract.

Validation: 157 focused tests, including the new regression, passed
with this change alone on the original base in the Docker framework
runtime. Earlier live Kimi K3 and Cerebras measurements showed
400-450 ms spent building unused tools before the request.
2026-09-23 18:10:59 +02:00
Alessandro
1effda4682 Cache parsed global model presets
Model config resolution called get_presets() about 25 times per model
call, re-parsing presets.yaml and the fallback collection each time.
Cache the parsed collection in model_presets(plugins), keyed by the
stat signature of the user, fallback and legacy config files, and
return deep copies. save_presets and reset_presets clear the area;
plugin watchdog clears and file signature changes cover other writers.

Keep failure-derived fallbacks uncached so temporary read errors in
any of the three sources recover without a file edit. Missing files
still allow caching. Cover cache reuse, independent copies, save and
out-of-band invalidation, and recovery from each source's read failure.
Document the cache contract.

Validation: 88 focused tests, including 40 preset tests, passed with
this change alone on the original base in the Docker framework runtime.
Earlier live measurements: get_effective_config dropped from 36.2 ms
to 0.5 ms per call; Agent.get_chat_model fell from 250-350 ms to
5-14 ms per turn.
2026-09-23 18:10:54 +02:00
Alessandro
4073c1d61b Update Codex version and close OAuth upstream streams
Pin the default Codex client version to 0.155.1 for upstream request
headers and model discovery.

Close upstream SSE responses when the Flask response closes, including
unread responses, cancellation, completion, and read errors. Apply cleanup
in the shared OAuth streaming helper and document its lifecycle contract.

Add regression coverage for all four closure paths, update the Copilot
streaming test stub, and isolate provider metadata tests from user config.

Validation: 275 OAuth, Responses, history, and plugin-scan tests passed;
all four cleanup cases also passed in the live framework runtime. Live
synthetic repeated requests reused 3,840 of 4,624 input tokens.
2026-09-23 16:13:22 +02:00
Alessandro
10e7d7c765 Fix mobile settings Save and simplify section navigation
Coerce the Save disabled binding to a boolean so an unloaded optional File Browser store cannot silently disable the button.

Replace the mobile settings tree with a native section picker, use dynamic viewport height, and enlarge footer touch targets. Preserve desktop search and navigation, and document the settings contracts.

Add an Alpine and Playwright regression covering touch Save/Cancel, optional-store loading states, section navigation, desktop search, and footer visibility. Verified the regression fails with the original Save binding and passes with the fix; live Save also succeeded on localhost:32081. Physical iPhone testing remains outstanding.
2026-09-23 15:56:37 +02:00
Alessandro
90bb902bb2 Update Launcher README links to v1.8
Point the root README platform downloads and release notes link at the published Launcher v1.8 release.
2026-09-23 15:39:44 +02:00
Alessandro
fc1582ca1e fix(delegation): preserve scoped subagent model presets
Copy a parent's chat model override only when a new subordinate resolves to
Default after project activation. Preserve non-default scoped presets and
existing child chat selections through the shared delegation path.

Add a 60-case regression matrix using real scoped configuration files and
project activation. Cover absent, default, custom and invalid presets,
project/profile precedence, named and raw overrides, and child continuation.
Update the delegation contract.

Validation: 139 focused tests passed locally; all 60 matrix cases passed in
the Docker framework runtime. The broader container async suite could not
run because pytest-asyncio is not installed.
2026-09-23 15:37:50 +02:00
Alessandro
325d3a982d Adapt thoughts instructions only for Anthropic models
Add a model-config Agent.read_prompt extension that adjusts two bundled
thoughts instructions when the effective main provider or model name
contains anthropic, case-insensitively. This also covers Anthropic models
routed through OpenRouter and named Bedrock endpoints.

Request public action summaries while preserving the thoughts JSON field,
shared prompt files, saved history, custom wording, and other models.
Apply the same adjustment to standalone communication reads so native
protocol projection continues to match the rendered main prompt.

Add regression coverage for provider matching, unaffected models and
custom text, and native prompt projection. Document the scoped behavior.

Validation: 125 focused tests passed across this and the refusal-handling
change. Live Opus 5.5 WebUI checks using the Anthropic API preset completed
a greeting and a terminal calculation with visible thoughts and valid
tool JSON. OpenRouter routing was verified by unit tests.
2026-09-23 15:19:25 +02:00
Alessandro
89a4853310 Surface provider refusals and stop automatic retries
Raise ContentPolicyViolationError for Chat Completions content_filter and
refusal finish reasons in both streaming and non-streaming responses.
Blocked output now reaches the existing visible critical-error handler
instead of being treated as an empty response.

Exclude provider refusals from the error-retry plugin so they do not
trigger repeated requests, repair-history injection, or media removal.
Add regression coverage for blocked tool output, stream cleanup, no
retry, and user-visible error logging; document the transport contract.

Validation: focused transport, retry, architecture, and prompt checks
passed across this change and the accompanying Anthropic adaptation
(125 tests). Replaying the original Opus 5.5 request in the live framework
surfaced the provider refusal.
2026-09-23 15:19:12 +02:00
Alessandro
4d327a3028 fix(sidebar-folders): clarify status and activity filters
Some checks are pending
Build And Publish Docker Images / plan (push) Waiting to run
Build And Publish Docker Images / build (push) Blocked by required conditions
Use All, Working, and Idle consistently for chats and scheduled tasks. Idle includes inactive or paused chats and disabled tasks; a family with an active worker stays under Working instead of also appearing under Idle.

Shorten Recent activity to Last active so the sort label fits its field. Updated filter regressions pass. Desktop and mobile menus were checked at 100% zoom, and the normal cached page also serves the new options.
2026-09-23 14:54:18 +02:00
Alessandro
1b2165714d perf(sidebar-folders): reuse rendered rows during dragging
Every drag hover rebuilt and sorted folders, repeatedly scanning chat families as the visible list grew. Reuse the rendered sections and rows for insertion targets and retain the existing target when the indicated gap has not changed.

Keep folder pin boundaries, family moves, and manual ordering behavior intact. Frontend checks and 24 native drags pass in both directions after sort-mode changes. In the 240-chat browser fixture, median hover-handler time fell from about 10 ms to 0.1 ms.
2026-09-23 14:54:05 +02:00
Alessandro
894b3f6eb8 fix(sidebar): render workers beyond the first child level
The shared chat tree rendered only direct children, leaving A2 and deeper workers hidden. Reuse the row component recursively for expanded children and open every ancestor when selecting or restoring a descendant. Taper deep indentation to preserve space for titles and actions on narrow sidebars.

Update selection and row-action regressions. Verified A0-A4 expansion, selection, menus, pin placement, and aligned actions in both folder and flat views.
2026-09-23 14:53:43 +02:00
Alessandro
efed8c212c fix(chat-naming): preserve subordinate labels
Automatic naming treated each subordinate context's root agent as a user chat and could overwrite its delegation label. Skip delegated contexts in the automatic naming hook while keeping explicit rename actions available.

Document label ownership and cover both automatic naming modes. The chat-naming tests and targeted Docker framework checks pass.
2026-09-23 14:53:07 +02:00
Alessandro
f653f61029 fix(delegation): honor names when continuing subordinates
Continuing call_subordinate with an existing context_id ignored a supplied name. Apply non-empty names to both the child context and sidebar label through the shared direct/parallel continuation path. Preserve existing names when omitted and leave legacy same-context parent names intact.

Update the tool contract and cover direct and parallel continuation after a failure, plus rename persistence across reloads. Verified with the focused subordinate/parallel tests and Docker framework checks.
2026-09-23 14:52:51 +02:00
Alessandro
35376ac053 Suppress tooltips on devices without hover support
Cancel Bootstrap tooltip opening when the device reports hover: none,
preventing touch-generated hover events from leaving tooltips over tapped
controls. Keep title normalization, desktop hover, and keyboard activation
intact, and remove the event listener during store cleanup.

Add a browser regression covering touch taps, programmatic tooltip opening,
mouse hover, and keyboard activation. The regression and a live mobile
settings open/close check pass without lingering tooltips.
2026-09-23 14:07:49 +02:00
Alessandro
71b6e3e43b Prevent mobile text inflation in terminal output
Set prefixed and standard text-size-adjust to 100% on EXE terminal output
so wide, unwrapped content retains its intended font size when expanded
or updated. Preserve horizontal scrolling and normal browser zoom.

All 33 process-renderer tests pass. Chromium mobile checks retain 11.2px
text under forced inflation, repeated expansion, and streamed updates
at portrait, landscape, and desktop widths.
2026-09-23 14:07:42 +02:00
Alessandro
7533d35e4f Fix mobile composer and welcome sizing
Let the contenteditable composer grow within its CSS bounds instead of
retaining measured pixel heights. Keep welcome controls on one row, reduce
the mobile placeholder font while preserving 16px input text, and use flex
layout for welcome action buttons.

Extend the draft regression to cover natural editor sizing and document
the layout contracts. Seven focused tests pass; browser checks cover
320px through desktop widths, multiline input, code blocks, and the
full-screen editor round trip.
2026-09-23 14:07:35 +02:00