Commit graph

913 commits

Author SHA1 Message Date
Alessandro
ff2a5b9c9c fix(docker): load the signed Xpra ARM64 package index
Some checks failed
Build And Publish Docker Images / plan (push) Has been cancelled
Build And Publish Docker Images / build (push) Has been cancelled
2026-10-13 17:23:11 +02:00
Alessandro
a251f6275b fix(browser): remove tooltips from quick settings
Remove overlapping zoom hints and extension path/action tooltips from the
Browser quick settings popover. Preserve accessible control labels and
document the tooltip-free popover contract.

Validation: focused quick-settings regression passed; live served HTML
retains accessible labels without tooltip titles; git diff --check passed.
Visual hover verification was unavailable because the in-app browser could
not connect. The full suite was not run.
2026-10-13 16:36:29 +02:00
Alessandro
f72945e70c fix(llm): enable Venice cache routing and custom provider overrides
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
Venice and Agent Zero API missed automatic cache hints because the transport
only recognized a fixed set of provider routes. Default both to stable
prompt_cache_key routing and expose a0_prompt_cache_mode through the existing
Additional parameters field for custom providers.

Support cache keys, cache_control markers, automatic detection, and disabling
automatic hints. Preserve explicit caller keys, keep marked requests on Chat
Completions, and strip the internal control before either provider API call.
Document the configuration and add regression and installed-SDK HTTP coverage.

Validation: 316 targeted tests passed in the live Docker framework runtime;
git diff --check passed. Full suite and upstream cache-hit measurements were
not run.
2026-10-13 15:48:32 +02:00
Alessandro
c946b3c347 fix(model-config): keep selector menus within viewport
Cap preset and agent profile menus to the space above the selector when
opening or resizing the window. Keep the full scroll track reachable
without changing its width, and preserve shared overflow positioning.

Add browser regression coverage for short viewports, resize, native
scrollbar dragging, wheel scrolling, and preset selection through overflow.
Update the plugin contracts and README.

Validation: 11 focused tests passed; live UI verified at localhost:32081.
2026-10-13 15:09:06 +02:00
Alessandro Frau
29288a8acc
Merge pull request #1931 from gf239/fix/model-presets-stale
fix(model-config): reload presets before the preset editor opens
2026-10-13 14:33:58 +02:00
Alessandro
cab075307e fix(chat-naming): validate names before marking them manual
Validate custom /rename names before setting the persisted manual-name flag. A rejected name must leave automatic naming enabled.

Add a regression test for a name exceeding the 200-character limit.
2026-10-13 13:48:31 +02:00
Alessandro Frau
229b671ace
Merge pull request #1949 from Li-john1021/fix/1941-preserve-manual-chat-name
fix(chat-naming): preserve manual names under always mode
2026-10-13 13:46:36 +02:00
Li-john1021
3e87172178 fix(chat-naming): preserve manual names under always mode (#1941) 2026-10-13 13:30:28 +08:00
Alessandro
298cb2c05d Speed up chat loading and guard selector refresh races
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
Run model/profile, context-usage and goal display refreshes independently
of snapshot rendering so chat switches do not wait for their API calls.

Guard refreshes and save completions by request sequence and selected chat.
Pending saves still finish for their original chat, while late responses
cannot replace the current selector state or finish a newer loading cycle.
Add deterministic pending-request and save-race regressions and update
the owning plugin contracts.

Validation: 94 focused tests passed for the loading change, followed by
47 focused tests after the model/profile race fixes. Live checks at
localhost:32081 covered delayed API responses, rapid chat switching,
late profile/preset/clear saves, and desktop/mobile behavior.
2026-10-10 14:10:35 +02:00
Alessandro
ce48667e98 Add Paradee as the default voice in Local TTS
Some checks failed
Build And Publish Docker Images / plan (push) Has been cancelled
Build And Publish Docker Images / build (push) Has been cancelled
Offer Paradee Heart alongside Kokoro voices in the existing bundled TTS
plugin. Default unconfigured settings to Paradee while preserving saved
Kokoro voices, blends, speed and activation choices. Switching engines
replaces the voice selection without a separate plugin or startup dialog.

Add lazy CPU ONNX synthesis with cached, pinned model assets and split
long input without dropping phonemes. Make status and preload follow the
selected engine, and present both engines through the Local TTS UI.

Prepare Paradee dependencies in hooks.py on plugin install/update,
enabled-plugin startup and re-enable. Reuse installed packages, preserve
browser fallback on setup failure and keep requirements.txt unchanged.
Update plugin documentation and regression coverage.

Validation: 44 focused tests passed in both host and Docker framework
runtimes. Live synthesis and voice-picker switching passed on localhost:32081.
git diff --check passed. Fresh-image builds and actual missing-package
installation were not tested.
2026-10-08 21:36:02 +02:00
Alessandro
a4e65d4721 Fix user plugin precedence in provider and profile merges
User-first discovery let last-value-wins merges overwrite community
provider and profile definitions with bundled values. Apply bundled root
groups first in provider loading, profile loading and catalogs, and Agent
Editor metadata.

Share the existing root-priority key and use stable sorting at merge sites,
preserving same-root order and cached lookup lists. Add collision, fallback,
scoped-override and prompt/schema/dispatch regressions, and update DOX.

Validation: 206 focused tests and 17 checks against the bind-mounted Docker
framework runtime passed. git diff --check and helper DOX coverage passed.
2026-10-08 15:51:32 +02: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
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
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
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
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
gf239
b8905741d0 Reload model presets before the preset editor opens
The preset editor builds its draft as soon as it renders. The store's
loaded flags stay set after the first open, so later opens showed the
previous preset list and fell back to Default when the requested preset
was new. Saving that stale draft deleted presets created elsewhere:
another tab, the API, or a plugin.

Reload the global presets and resolve the initial preset in an
open_modal_before hook, so every open starts from fresh data, including
/presets, which opens the modal without openPresetEditor(). The modal
now appears after that reload; the editor still renders at once from the
fresh store data, so its footer stays pinned.

Verified with a behavioural regression test and the full suite (2171
passed, including the new test; the same 5 failures as 0efb0d4f).

Fixes #1928

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 02:29:59 +00: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
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
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
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
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
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 Frau
87e449bb34
Merge pull request #1907 from GreifMax/fix_notification_refresh_preset_selection
fix: notification actions in notifications modal and preset editor selection
2026-09-23 08:27:53 +02:00
Alessandro
af59a801c6 feat(sidebar-folders): add Projects to the No project menu
Open the existing global projects list from the No project folder's
three-dot menu, using the same icon as the in-chat project selector.
Close the folder menu before opening the modal and document the shortcut.

Validation: Node frontend checks passed. Live checks on normal and safe
pages verified that the modal opens, the folder menu closes, and the
action appears only for No project.
2026-09-23 06:42:24 +02:00
Alessandro
9ffa0fa8f5 Add reusable overflow menus for chat controls
Keep composer selectors on one row with x-overflow and open their existing
menus from the overflow list. Preserve plugin controls, live avatars and
percentage rings, Alpine state, and mouse, touch, and keyboard interaction.

Fit submenus within the available space and tolerate fractional-pixel
rounding at browser zoom levels. Add DOM and native Chromium zoom
regressions and document the shared directive's contracts.

Validation: 57 focused WebUI checks and 10 context-window checks passed.
Verified the live UI at 100%, 110%, 150%, and 175% browser zoom. Two existing
startup favicon assertions remain unrelated failures.
2026-09-23 06:24:49 +02:00
Alessandro
ef42aec943 Refresh chat names as topics change by default
Default the bundled config and backend/UI fallbacks to the existing always
mode so chats do not stay named after an initial greeting. Preserve explicitly
saved naming settings.

Naming continues in the existing background monologue_end task. Add regression
coverage for updating greeting titles and returning from the hook while the
Utility Model is still pending, and document the default and background contract.

Validation: 19 focused tests passed. The live Utility Model followed English
and Italian topic changes and kept the title for a short confirmation.
2026-09-23 04:59:07 +02:00
Alessandro
6c10ef62a1 feat(sidebar-folders): organize chats and tasks by project
Group sidebar chats and scheduler tasks into collapsible project folders,
with a flat-view option and creation-time sorting by default. Keep view,
sort, project, status, and activity controls in the sidebar menu.

Preserve nested parallel workers, integrate Pin to Top, and support new
chats in explicit projects, manual reordering, and whole-family project
moves. Keep pinned folders together and reject project changes for running
chats or scheduled tasks. Persist ordering and view preferences through
plugin-owned APIs and the existing settings contract.

Include documentation, backend and frontend regression coverage, and a
generated 256x256 WebP thumbnail under 20 KB.

Validation: 69 focused pytest checks and the Node frontend suite passed.
Live browser checks covered folder/flat views, Bots 1.2.1 compatibility,
workers, pins, sorting, and drag/drop, including 30 pinned-folder boundary
cases. The thumbnail is 17,930 bytes and serves correctly in the live UI.
2026-09-22 23:05:11 +02:00
Alessandro
f3658a816f fix(pin-to-top): scope indicators to shared row components
Prevent Bots profile titles and other plugin rows that reuse sidebar
styles from receiving pin bindings in an incompatible Alpine scope.
Limit decoration to the shared chat-tree and task-row components and
document that boundary.

Validation: focused pin/sidebar regression tests and live Bots,
parent-chat, parallel-worker, and task indicator checks.
2026-09-22 21:32:43 +02:00
Alessandro
ceb252ff87 feat(pin-to-top): add plugin-owned sidebar pin indicators
Show reactive pin icons beside chat, parallel-worker, and task titles in
both sidebar views. Keep decoration and styling inside Pin to Top, with
idempotent handling of dynamically added rows.

Document ownership and add a regression check that keeps pin-specific
rendering out of core sidebar components.

Validation: 19 focused pin/sidebar tests, JavaScript syntax check, and
live pin/unpin, row remount, and flat/folder view checks.
2026-09-22 19:15:55 +02:00
Alessandro
6d0e1a5031 feat(pin-to-top): support the default No project pin
Allow the empty project key to represent the No project folder and pin it by default ahead of dated project pins. Remember explicit unpin choices across reloads and unrelated pin changes while preserving existing pins.

Keep empty chat/task IDs and missing project IDs invalid. Add backend and frontend regression coverage and document the default pin behavior.

Validation: 18 focused tests passed; live pin/unpin persistence verified.
2026-09-22 13:05:31 +02:00
Alessandro
e86f32982a feat(pin-to-top): support project folder pins
and document index project folder pinning
2026-09-22 08:55:56 +02:00
Alessandro
ed609af7e9 Revert "Add optional Right Click menus for chats, tasks, and files"
This reverts commit f4f7823b5f.
2026-09-21 19:55:41 +02:00
Alessandro
41476c478c Fix notification actions in notifications modal and preset editor select state
- Notification modal: expose a toast-compatible scope so action buttons authored against toast.toastId keep working when notification message HTML is rendered through x-html inside the notifications modal; dismissToastAndReload now resolves the notification id even when the toast is no longer in the stack, and dismissToast marks the notification read instead of being a silent no-op.
- Preset editor: keep the select DOM selection in sync with Alpine's selectedKey via :selected on options, so the editor opens showing the actual preset and selecting Default works on first click (x-model syncs before x-for renders options, leaving the DOM on the first option with no change event when clicked).
- Add regression tests for both fixes.
2026-09-19 14:02:13 +02:00
Alessandro
f4f7823b5f Add optional Right Click menus for chats, tasks, and files
Some checks failed
Build And Publish Docker Images / plan (push) Has been cancelled
Build And Publish Docker Images / build (push) Has been cancelled
Bundle a toggleable Right Click plugin that opens the existing row action
menus at the pointer for sidebar chats/tasks and file entries in list or
icon view, preserving the three-dot buttons and shared menu styling.

Add targeted Save Chat, Load Chat, and Open in Files alongside chat pinning
and renaming. Resolve the clicked chat's saved usr/chats folder without
selecting it, falling back to usr/chats for chats without a saved folder.
Apply the requested directory when Files opens in either a modal or canvas.

Add file Download, inline two-click Delete, and directory Open while reusing
existing Editor, Browser/Desktop, and ZIP actions and remote permissions.
Preserve native menus for text inputs, file pickers, and Shift-right-click;
support keyboard navigation and dismissal. Include plugin docs, regression
coverage, and a generated 256x256 thumbnail under 20 KB.

Validation: 13 focused Agent Zero tests and 33 Launcher instance-tab tests
passed. Verified the live repo-mounted instance at localhost:32081 in the
browser and Linux Launcher dev checkout, including attached/detached views,
list/icon actions, downloads, deletion confirmation, and disable/re-enable.
2026-09-19 05:01:56 +02:00
Alessandro
255ff63bff Preserve configured API-key pools when saving settings
Separate reading the configured key value from selecting a runtime key.
Settings and key reveal retain the complete comma-separated list; model
calls keep the existing rotation and provider hooks. Runtime-only OAuth
placeholders are not treated as configured keys.

Keep the existing 6.5x Git-version-cache save optimization unchanged.

Verified 24 focused settings/profile tests, 30 model-key tests, and the
Docker framework getter/cache/OAuth suite, including alias preservation
and the configured-key versus runtime-hook boundary.
2026-09-19 02:31:45 +02:00