Commit graph

895 commits

Author SHA1 Message Date
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
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
Alessandro
fc6370b3ee Fix Browser startup state and stale URLs across chats
Clear the address, page state, viewer, and switching flags when no active
Browser tab remains. Release busy state on subscription failures so the
user can retry instead of remaining on the connecting screen.

Invalidate pending session, subscription, and command results when the
selected chat changes, and apply the active tab state from successful
subscriptions. Add regression coverage and document the lifecycle contract.

Validation: 176 browser tests and 29 host connector tests pass in separate
runs. The combined run encounters an existing ws_manager mock isolation
failure. Live checks on localhost:32081 cover blank-tab startup, switching
to an empty chat and back, closing the last tab, and retrying a failed
subscription.
2026-09-17 19:19:20 +02:00
Alessandro
6dd3ef4ee3 Keep LibreOffice saves on the renamed document
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
Desktop rename previously moved the file while Writer retained the old save
target. Use native Save As for the matching open document, preserving unsaved
edits, format settings, source permissions, and version history. Closed files
keep filesystem rename; validation and failed native operations preserve the
original file.

Use the installed system UNO runtime through a profile-scoped named pipe and
match full document URLs so equal basenames cannot select another document.

Validated with 116 focused tests, live Writer rename followed by WebUI and
native saves, and native rename/save checks for all six supported formats.
2026-09-17 04:41:34 +02:00
Alessandro
741d5233c0 Simplify Files navigation and preserve picker lifecycle
Separate inline rename and creation from external modal actions, share path
editing, and keep menus and observers scoped to their mounted hosts. Preserve
picker drafts, close promises, pending writes, and canvas state across modal
reuse and docking. Activate parked pickers and ignore stale navigation and
suggestion responses, including incomplete remote connection paths.

Add behavioral regression coverage and update the Files ownership contracts.
Validated with 29 focused tests and live CLI-host/SFTP file operations, picker
activation, pending-write protection, and remote autocomplete checks.
2026-09-17 04:23:42 +02:00
Alessandro Frau
ffa042e8ef
Merge pull request #1900 from linkliti/feat/file-browser-upgrades
feat: Improved File Browser navigation
2026-09-17 01:43:48 +02:00
Alessandro
ab88f87b6f Fix flashing process groups during memory search
Text Editor logs rendered as process steps but were missing from raw-log
classification, allowing a following hidden utility message to hide the
whole group. Let plugins register process-step types through the existing
extension system and use those types for grouping and paging.

Preserve the generic tool-step fallback by classifying types that select
that renderer before merging logs. Document the custom handler contract
in the bundled plugin authoring skill.

Validated with 46 targeted tests and live desktop/mobile rendering checks,
including disabled plugins, fallback types, paging, and chat-switch races.
2026-09-16 16:17:37 +02:00
Alessandro
335811833a Fix SOCKS proxy support for HTTPX clients
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
Include HTTPX's SOCKS extra in framework requirements so SOCKS proxy
settings work when LiteLLM starts. Let the Browser install hook repair
missing SOCKS support in existing framework environments, skipping the
installation when socksio is already available.

Cover missing dependencies, existing installations, and repeated hook
calls, and document the framework and plugin ownership.

Validation:
- 139 Browser and Docker release-planning tests passed.
- Local amd64 and ARM64 (QEMU) production image builds passed; ARM64
  needed an unchanged retry after a transient Kali mirror/DNS failure.
- Browser hook and sync/async SOCKS5 and SOCKS5h requests passed in both
  fresh images, including client initialization with mixed proxy settings.
2026-09-16 03:11:47 +02:00
Alessandro
40a4303637 Rebase local plugin commits during updates
Divergent local and upstream commits caused plugin updates to fail because
git pull had no reconciliation strategy.

Fetch the configured upstream and rebase local commits. Abort conflicting
rebases and restore the original commits and edits, preserving the stash
index during rollback. Refuse existing Git operations and leave other
branch refs untouched. Include escaped conflicting filenames in a
persistent error toast and retain the existing detail view.

Validation: 12 updater tests passed. Isolated installer/API checks covered
Git and ZIP installation, ordinary updates, rebasing, conflicts, and an
unavailable remote. Browser checks verified the conflict toast and filename
escaping.
2026-09-16 00:44:04 +02:00
Alessandro
4470d206b7 Preserve repository thumbnails during plugin installation
Downloading a Plugin Hub thumbnail after cloning could overwrite a tracked
image and leave the plugin checkout dirty, interfering with later updates.

Download a fallback only when no supported thumbnail exists. Repository
images continue to change through Git updates. Add regression coverage for
preservation, missing-image downloads, and upstream thumbnail changes.

Validation: 8 updater tests passed for this fix; isolated Git and ZIP
installation checks passed.
2026-09-16 00:43:54 +02:00
linkliti
975129e856 Move New folder and Rename to the shared footer input
Edit New folder and Rename names in the same footer row as the Save As filename through a renameInline state instead of opening the rename modal inside the browser, keep the rename-modal window for external Editor and Desktop callers through a modal option, clear the inline state on browser reopen, add a navigation regression test covering inline and external flows, and extend the owning DOX with the shared footer contract. All 52 file browser, editor, and desktop tests pass.
2026-09-15 16:03:49 +03:00
Alessandro
e9384d2748 Preserve file permissions and ownership when applying editor patches
All three patch methods replaced the destination with a root-owned 0600
file, removing executable bits and preventing host users from editing
bind-mounted files. Preserve the existing mode and, when running as root,
UID/GID in one shared helper before atomic replacement. Read metadata once
and use os.replace directly; metadata errors leave the original intact.

Add regression coverage for each patch format, permission modes, root
ownership preservation and failed metadata updates. Document the existing-
file scope; ownership policy for new workspace files remains separate.

Validation: 48 focused editor tests passed, plus 15 metadata checks in the
root container. Live bind-mount checks confirmed host-owned files remain
writable and executable by the host user after all three patch methods.
2026-09-14 23:00:41 +02:00
Alessandro
b68306356c Bound browser evaluate with recoverable JavaScript cancellation
Some checks failed
Build And Publish Docker Images / plan (push) Has been cancelled
Build And Publish Docker Images / build (push) Has been cancelled
Add evaluate_timeout_seconds to Browser settings, defaulting to 30 seconds
with strict finite bounds of 0.1 through 60 seconds. Bound user evaluation
and result-state collection while preserving existing results and
non-breaking tool errors.

Propagate caller cancellation to the Browser worker and interrupt Chromium
execution in place. Preserve the document when the original request
settles; reserve reload and targeted closure for unresolved execution and
report disruptive recovery explicitly without stopping shared workers.

Require evaluate_timeout_v1 for host evaluation, forward the settings
deadline, and await host cancellation acknowledgement. Reuse per-browser
multi dispatch and clean up pending connector operations. Update the
settings UI, tool guidance, ownership contracts and regression coverage.

Validation: 173 Core Browser tests and 29 connector bridge tests passed.
Framework compilation and isolated Chromium checks verified preserved
form drafts and page state, async fallback, recovery and protocol cleanup.
2026-09-14 16:38:01 +02:00
Alessandro
359ccb11c5 Extend slash command support to WhatsApp
Reuse the context-aware command catalog across messaging integrations and resolve WhatsApp commands before adding message envelopes. Preserve custom overrides, attachments, and once-only execution.

Add text menus, tool permissions, plugin settings, confirmed compaction, transcript exports, and persistent chat selection scoped to the originating conversation.

Validation: 57 focused Python tests and 2 WhatsApp bridge tests passed. Live WhatsApp command checks were confirmed by the user.
2026-09-14 14:08:47 +02:00
Alessandro
17033d277e Extend slash commands coverage and menus in Telegram
Resolve built-in, plugin, global, and project slash commands before wrapping Telegram messages, preserving custom overrides and existing integration controls. Add paginated command, plugin, and permission menus, compaction confirmation, transcript export, and fresh-chat session binding.

Generate stable names for unnamed bots, reject duplicate names on save, and restart bots when their connection settings change. Preserve webhook authentication and private-only group controls, and prevent rendered or queued messages from resolving a second slash command.

Validation: 80 tests and 11 webhook subtests passed. Verified command execution and menu rendering in the Docker framework runtime, source/runtime file hashes, HTTP health, and polling with 33 registered commands. Telegram replies were confirmed by the user; direct in-app browser automation was unavailable.
2026-09-14 13:21:15 +02:00
Alessandro
8426c137eb Preserve file tree ancestors and make the starting folder configurable
Some checks failed
Build And Publish Docker Images / plan (push) Has been cancelled
Build And Publish Docker Images / build (push) Has been cancelled
Keep parent folders clickable during nested navigation in Files and Editor.
Folder names open directories while chevrons inspect branches, preserving
loaded children and sharing pending directory requests. Scroll the selected
folder or file into view after rendering without disrupting manual branch
inspection.

Default local trees to /a0 and add a browser-local starting folder setting
shared with Editor. Keep remote folders in their own tree and retain the
configured local root when navigating outside it through the path bar.

Update regression coverage and ownership docs. Verified with 18 focused
tests and live Files/Editor checks, including preference persistence after
reload, automatic selection scrolling, and narrow layouts.
2026-09-12 21:05:25 +02:00
Alessandro
46ab911a3e Reject browser evaluate calls without a script
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
Require a non-empty script string in the shared browser runtime so single and multi calls report a missing argument instead of successfully evaluating undefined. Add concise prompt guidance and retain legitimate null, false, zero, and object results.

Add argument and result regression coverage; refresh the existing browser-test WebSocket stub for transfer-cleanup imports. Validation: 165 focused Core checks passed in isolated runs, and real Chromium reproduced the reported expression/script mismatch before the fix and the actionable error afterward.
2026-09-12 20:12:37 +02:00
Alessandro
e46242fd3e Skip hidden Markdown previews when opening source files
Render editor previews only for previewable documents in preview mode. This avoids parsing code and source text into hidden Markdown DOM while preserving normal preview behavior.

Add regression coverage for source mode, unsupported file types, and fresh content on preview entry. Four focused editor and file-tree tests pass. Live checks cover editing, saving, syntax mode, and source/preview switching; the 1.64 MB synthetic JSON median fell from 22.49 s to 0.37 s.
2026-09-12 18:48:56 +02:00
Alessandro
4fc6f03117 Keep text editor line edits explicitly supported
Remove the legacy label from line-edit guidance and document all three supported patch forms in the plugin contract. Preserve fresh-read and line-shift safeguards.

Validation: 27 text editor context-patch and freshness tests passed; git diff --check passed.
2026-09-12 18:30:53 +02:00
Alessandro
a2dc9dc8d7 Align remote execution and Computer Use tool contracts
Expose input_remote as a thin facade over the existing gated execution path,
matching local input and sharing connection, permission, timeout, transfer,
and disconnect handling. Remove runtime=input without a compatibility alias.
Keep native execution/input schemas aligned and session follow-ups sequential.

Keep Computer Use arguments concise and place scoped macOS targeting guidance
in its backend skill behind the advertised capability. Remove the ineffective
mode argument from model-facing guidance and refresh prompt contract coverage.

Validation: 128 focused Core checks passed. Live Docker framework checks covered
tool discovery, prompt rendering, disconnected gating, and removed-runtime
rejection. Native macOS desktop actions were not verified on this Linux host.
2026-09-12 18:24:54 +02:00