Commit graph

514 commits

Author SHA1 Message Date
Alessandro
f8c96860c2 Add context window usage indicator
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
Add a bundled context-window plugin with a composer usage ring, responsive breakdown popover, token counts, percentages, and free-space reporting.

Keep accounting plugin-owned, reuse existing history token counts, cache bounded prompt fragments by content, and expose independent mobile and desktop visibility controls.
2026-08-23 06:08:41 +02:00
Alessandro
d1a9bfa13e Scope settings snapshots to prompt builds
Reuse one normalized settings snapshot only while Agent.prepare_prompt builds a prompt, then restore normalize-on-read behavior immediately.

Keep the canonical get_settings function unchanged while prompt-building callers explicitly avoid repeated Git and default resolution.
2026-08-23 06:08:41 +02:00
Alessandro
fe86e99a34 Add WebUI slots for plugin controls
Expose extension slots beside the model/profile strip and at the end of Interface visibility controls.

Let plugin stores register responsive visibility defaults without coupling shared WebUI components to a specific affordance.
2026-08-23 06:08:41 +02:00
Alessandro
b22a144bf5 Repair the pinned Xpra runtime stack
Some checks failed
Build And Publish Docker Images / plan (push) Has been cancelled
Build And Publish Docker Images / build (push) Has been cancelled
Install matching Xpra client packages and carry Kali rolling's ATK introspection package into snapshot-based image builds.

Repair self-updated containers by installing the complete Xpra and GTK stack at the installed Xpra version.
2026-08-19 21:22:17 +02:00
Alessandro
d52a1692c1 Pin Docker desktop package versions
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
Pin the Python 3.13-compatible LibreOffice and Xpra releases used by the last successful multi-architecture build.

Use Kali's last snapshot and remove beta probing so repository updates cannot pull Python 3.14 into ready images.
2026-08-19 13:30:55 +02:00
Alessandro
7eb819731c Preserve per-chat composer drafts
Store unsent composer text per chat in session storage and restore it when switching contexts or refreshing the page.

Keep the Welcome composer prompt intact when its first send creates a chat, and cover the behavior with a focused Node regression.
2026-08-19 12:28:42 +02:00
Alessandro
81fcc24364 Support standalone user API and WebUI routes
Add usr/api as a contained fallback after existing built-in and plugin handlers, preserving current route precedence and security gates.

Serve usr/extensions/webui assets from an authenticated, root-contained namespace while keeping built-in extension paths unchanged.

Cover source precedence, authentication, path traversal, and manifest-to-asset routing with focused regressions.
2026-08-19 12:14:29 +02:00
Alessandro
a304c7665f Unify subordinate lifecycle across parallel calls
Route direct and parallel call_subordinate execution through one reusable, persisted A1/A2 child-context lifecycle.

Keep failed children resumable with reset=false and cover sibling reuse, recursive numbering, persistence, and nested task ownership.
2026-08-19 09:30:50 +02:00
Alessandro
e6123e476a Fix backup restore allowed origins
Preserve the destination ALLOWED_ORIGINS during restore so a backup created at another URL does not lock out the new instance.

Restore backup credentials and other portable settings without reloading them into the active process.
2026-08-19 04:26:57 +02:00
Alessandro
f6dd6128d9 Fix Codex OAuth utility responses
Preserve completed SSE output items when the final Codex response envelope omits them so non-streaming utility calls retain their generated text. Add focused regression coverage for the native output-item path.
2026-08-19 04:23:36 +02:00
Alessandro
fdf64a7f29 Scope strict response schema to Codex
Keep generic Responses tool schemas provider-neutral and apply the strict text-only response contract at the Codex OAuth request boundary.

Preserve tool-policy filtering by tightening only an already-advertised response tool, with focused regression coverage for both generic and Codex paths.
2026-08-19 04:04:26 +02:00
Alessandro
758f74fd75 Avoid reload prompts for scoped plugin changes
Keep plugin cache invalidation and Python module refreshes for project- and agent-scoped changes, but reserve frontend reload notifications for global plugin changes that can affect the loaded WebUI bundle.

Cover watchdog and direct-toggle paths with focused regressions and document the scoped lifecycle contract.
2026-08-18 14:02:45 +02:00
Alessandro
1fb9363b49 Restore internal Browser tabs automatically
Persist Browser tab ownership and URLs in the shared KVP store, migrate an existing Chromium session once, and restore tabs automatically for per-chat and shared scopes without showing Chromium's crash advisory.

Add composer-style microphone and arrow controls to the annotation dialog while preserving draft-versus-send voice behavior.
2026-08-16 18:02:51 +02:00
Alessandro
227b47f53d Share one internal Browser runtime
Route every chat through one persistent Chromium, Xvfb, and Xpra runtime while keeping tab ownership and per-chat limits context-bound.

Share sign-ins across chats, adopt the first requesting legacy profile on upgrade, and close only the owning chat's tabs during reset or removal.

Keep separate and shared tab-strip modes as visibility choices and cover cross-context access, popups, screenshots, startup ownership, and cleanup.
2026-08-16 15:51:32 +02:00
Alessandro
4bf92a6072 Improve Browser startup and annotations
Keep tab loading feedback stable and visible while the interactive Browser starts without waiting for a redundant screenshot.

Add DOM hover feedback, multi-page annotation batches, compact composer-style controls, and shared Whisper draft or send behavior.
2026-08-16 15:22:10 +02:00
Alessandro
a0eefe19bd Honor configured Browser model preset
Activate the selected Browser preset after the first Browser tool call so follow-up model turns use it.

Clear the temporary override at monologue end and preserve the main model as the safe fallback.
2026-08-16 15:21:52 +02:00
Alessandro
005b366b51 Add interactive internal Browser viewport
Render the existing Patchright page through an isolated, authenticated Xpra session with CDP screencast and snapshot fallbacks.

Keep Chromium out of fullscreen, synchronize native viewport resizing across canvas and modal handoffs, and remove Xpra decoration and shadow-cursor artifacts.

Move loading feedback into each Browser tab while reserving the footer for actual errors.
2026-08-16 12:58:17 +02:00
Alessandro
e2f43a3fb8 Harden internal Browser against bot detection
Run Chromium headful through Patchright on a private Xvfb display while keeping Agent Zero's page helpers in Patchright's isolated world.

Reconcile the pinned Patchright package and matching architecture-specific Chromium from Browser plugin hooks so fresh Docker images and self-updated installations converge on the same runtime.
2026-08-13 12:34:04 +02:00
Alessandro
a767824fb6 Fix Responses tool call completion
Recover function calls emitted during streaming when a terminal Responses event omits them. Advertise the final response tool with a strict text-only schema across agent profiles.
2026-08-13 12:34:04 +02:00
Alessandro
3ce418a9d5 Align Agent Editor toast action styling
Use the shared toast action row and primary button classes for the Test in new chat action. Remove the plugin-specific link styling and cover the shared markup in the focused WebUI regression test.
2026-08-12 14:34:16 +02:00
Alessandro
517a3cd90b Fix assistant-first provider history
Omit orphaned leading assistant messages from model history so Claude-compatible providers receive a user-first conversation.

Add regression coverage for the initial UI greeting path.
2026-08-12 14:34:16 +02:00
axelray-dev
01def8603a fix(oauth): send Codex client version header on upstream requests
Upstream gates newer models on a version header. Attach
resolve_codex_version() when non-empty so completions match /models.

Fixes #1765
2026-08-12 14:34:16 +02:00
gdeyoung
cb9c877538 fix(transport): fall back on untyped Responses items
Treat opaque 400 type-discrimination errors from OpenAI-compatible Responses endpoints as shape-specific request rejections and retry through Chat Completions. Add focused regression coverage.
2026-08-12 14:34:16 +02:00
King0James0
c42dffa54e feat: Time Travel shadow-repo retention (orphan cleanup, optional age-out, stale-lock repair)
Time Travel keeps a hidden git repository per workspace under
/a0/usr/.time_travel/workspaces/<id>/repo.git and snapshots on every file
change, but ships no retention: nothing deletes a shadow repository when its
chat or project is removed (chat_remove never touches .time_travel), there is
no delete/prune endpoint in the API or web UI, and a workspace whose 'git add'
ever exceeds GIT_TIMEOUT_SECONDS strands repo.git/index.lock, failing every
later snapshot with 'index.lock: File exists'. Observed on a live instance:
518 shadow repositories / 12 GB, most belonging to long-deleted chats, plus a
permanently wedged workspace.

This adds a throttled retention sweep driven from job_loop:

- Orphans: live workspace paths (project folders, the configured workdir,
  per-chat workdirs) are forward-enumerated and hashed with the existing
  workspace_id_for derivation; a shadow directory matching none of them is
  unreachable from the UI forever and is removed after a grace window.
- Optional age-out: retention_max_age_days (default 0 = keep forever) removes
  a live workspace's history when it has had no snapshot in N days. Time
  Travel lazily re-initializes an empty history on the next snapshot, so this
  is always safe for the feature.
- Stale locks: repo.git/index.lock older than retention_stale_lock_minutes is
  removed (git subprocesses are killed at GIT_TIMEOUT_SECONDS, so no
  legitimate lock lives that long), un-wedging future snapshots.
- Corrupt-repo set-asides (repo.git.invalid*) past the grace window.

Deletion is refused for any path outside the shadow root. Settings render in
the existing plugin-config pattern (default_config.yaml + webui/config.html,
settings_sections: agent): enable toggle, sweep interval, age-out days,
orphan grace, stale-lock age. Durable evidence lives next to the workspaces
dir: retention.json (running totals + last sweep stamp) and retention.log
(one JSON line per sweep naming everything removed, tail-capped at 1000).

Sweeps run in a worker thread off the event loop, at most one in flight,
default every 6 hours.

Tests: tests/test_time_travel_retention.py (config defaults/clamps, the full
sweep matrix, keep-forever default, disabled no-op, deletion guard, marker
accrual, per-sweep history + cap, throttle, and workspace_id_for parity).
2026-08-12 14:34:16 +02:00
Alessandro
d541a942b0 fix(api): align downloads with file browser root
Resolve individual and bulk download paths from the filesystem root so authenticated operators can download every path exposed by the File Browser and editor.\n\nKeep the existing authentication, CSRF, path normalization, and archive behavior, and cover downloads outside the Agent Zero runtime directory with a regression test.
2026-08-12 14:34:16 +02:00
Alessandro
b40874e7c0 Fix document query SSRF regression
Route remote document downloads through the existing public-only HTTP fetcher so direct and redirected non-public destinations are rejected while public redirects, request headers, proxy isolation, retries, timeouts, and size limits remain intact.

Add focused CVE-2026-4308 regression coverage for private targets and genuine public-fetch compatibility.
2026-08-12 14:34:16 +02:00
spinnakergit
d1e1c6494e fix(plugin-hub): preserve dirty edits during updates
Temporarily stash tracked plugin edits while updating. Restore the original checkout and edits if the update cannot reapply them, and surface the conflict beside the Update button. Add isolated Git regression coverage for merge, no-op, and conflict cases.
2026-08-12 14:34:16 +02:00
Alessandro
1121758a6f feat: add caller context to plugin config hooks 2026-08-12 14:34:16 +02:00
Alessandro
1b4505d8e5 Guard chat deletion against empty context IDs
Reject empty and whitespace-only chat context identifiers before provider or filesystem cleanup begins. This prevents malformed deletion requests from resolving to the shared chat directory and adds focused regression coverage.
2026-08-12 14:34:16 +02:00
TerminallyLazy
37093f5888 Bound attachment metadata percent decoding 2026-08-12 14:34:15 +02:00
TerminallyLazy
efdb5f4aca Strip encoded attachment metadata delimiters 2026-08-12 14:34:15 +02:00
TerminallyLazy
e9d5274064 Fix attachment replay metadata sanitization 2026-08-12 14:34:15 +02:00
TerminallyLazy
921a390c14 Task 1: Preserve Sanitized WebSocket Attachment Names in Replay Metadata 2026-08-12 14:34:15 +02:00
Alessandro
db4913ff76 Avoid rewriting unrelated chats on project changes
Project updates and deletion previously persisted every loaded chat, while matching chats were written twice through the existing activation helpers.

Keep the established project lifecycle flow and remove the unconditional writes so only affected chats are saved once. Add focused regression coverage and document the persistence contract.
2026-08-12 14:34:15 +02:00
Alessandro
4f8ae9cc2c Keep hidden utility profile out of new chats
Normalize legacy global settings that still select the internal default profile to Agent 0. This keeps fresh chats aligned with the visible profile catalog while preserving existing chat selections.
2026-08-12 14:34:15 +02:00
Alessandro
282f13982b fix agent profile switching logic
Keep profile catalog reads lightweight by detecting sparse editor overrides without building removal plans for every agent.

Use the chat snapshot refresh as the single switch trigger and share concurrent same-context catalog requests while preserving newest-context-wins behavior.
2026-08-12 14:34:15 +02:00
Alessandro
14b5a03e7f Enhance native Kokoro voice blending
Bring the useful community enhancements into the built-in plugin with a current American voice catalog, speed controls, and in-memory weighted blending while preserving existing voice and speed configuration.

Reuse the singleton Kokoro pipeline, validate blend inputs, show resolved ratios in status views, and cover the native flow with focused regression tests.

Co-authored-by: twilso24 <122656888+twilso24@users.noreply.github.com>
2026-08-12 14:34:15 +02:00
Alessandro
864e311c60 Keep slash commands out of agent skills
Return skills only from skills_tool and remove the command-definition loading bridge. Leave slash-command discovery, invocation, and authoring with the Commands plugin and its user-facing surfaces.
2026-08-12 14:34:15 +02:00
Alessandro
b5006d571c Expose scoped plugin configuration indexes
Let project- or agent-scoped plugins open the shared settings surface even without a custom form. Tool Access can now reach existing scoped configurations while inert Save and Reset actions remain hidden.
2026-08-12 14:34:15 +02:00
Alessandro
dbe87ee184 Keep capability discovery aligned with runtime
Humanize MCP catalog labels with their server names while preserving canonical IDs. Suppress skill discovery prompts when skills_tool is unavailable and move the behaviour_adjustment prompt under the Memory plugin so disabling its implementation also removes its instructions.
2026-08-12 14:34:15 +02:00
Alessandro
c327701c83 Fix Agent Editor profile lifecycle state
Base reset visibility on the sparse removal plan, preserve unrelated profile files, and surface completion feedback without waiting for model-profile refreshes.

Keep saved preset controls and fresh-chat selection synchronized across global and project scopes, including the shared sidebar context race, with focused regressions and updated DOX.
2026-08-12 14:34:15 +02:00
Alessandro
13ecab24ee Unify Agent Editor capability and prompt controls
Give Tools, MCPs, and Skills explicit default switches with segmented per-item policy controls while preserving sparse overrides. Simplify Advanced prompt editing around the full-height ACE surface and align the editor contracts and regression coverage.
2026-08-12 14:34:15 +02:00
Alessandro
9dab4f2460 Hide the utility agent from profile selectors
Centralize omission of the internal default profile in the shared presentation catalog and keep status reporting intact for existing chats. Align Settings, model-switcher, Connector, Telegram, and selector contracts with focused regressions.
2026-08-12 14:34:15 +02:00
Alessandro
2a2890d892 Add reusable agent profile commands
Expose sparse Easy-mode profile creation through the Agent Editor and Connector API capability, while preserving existing profile selection behavior.

Reuse /profile in the WebUI for management and fast creation, then open a fresh chat with the new profile in the selected project scope. Add focused backend, command, and WebUI regressions for the shared flow.
2026-08-12 14:34:15 +02:00
Alessandro
36672493ff Polish Agent Editor layouts and interactions
Refine the Advanced modal, prompt path display, review identity summary, reset-to-default workflow, and compact policy controls. Improve mobile footer and profile-card wrapping, make Advanced tool and skill rows directly selectable, and extend WebUI regression coverage for the updated behavior.
2026-08-12 14:34:15 +02:00
Alessandro
7b9f06771f Polish Agent Editor profile management
Add scoped restore for inherited profiles through the existing sparse removal path, and streamline Manage agents with separator rows and no redundant footer.

Remove redundant customization signals, use theme-primary colors for compact identity actions, simplify delegation guidance, and extend focused WebUI regressions.
2026-08-12 14:34:15 +02:00
Alessandro
b5ab1d5b8f Stabilize Agent Editor client workflows
Rebase new-agent drafts when scope changes, recompute Review paths, preserve authored creation metadata, and align client validation with backend prompt requirements.

Guard pending removals and stale manager transitions from discarding edits, let only the newest profile-catalog request own selector state, and hide stale rows during refresh.

Finish the themed, responsive Easy and Advanced presentation and exercise the real Alpine stores with controlled state and request-order regressions.
2026-08-12 14:34:15 +02:00
Alessandro
afff2e3c05 Harden scoped tool policy enforcement
Resolve effective policy through inherited layers without letting empty upper configs shadow restrictions, and carry canonical tool identities through local and MCP execution.

Enforce required policy hooks and parent delegation checks at runtime, keep installed connector capabilities configurable while disconnected, and remove complete blocked-tool examples from rendered prompts.

Use the canonical tool prompts for concise catalog descriptions and add regressions for plugin activation, dotted local names, MCP calls, layered policies, and parallel subordinate paths.
2026-08-12 14:34:15 +02:00
Alessandro
7545eef298 Harden scoped agent profile mutations
Validate destructive requests and project-derived scopes at the Agent Editor API boundary, and reuse the running-profile guard for deletion.

Recheck creation and availability invariants inside the existing mutation boundary, preserve project availability atomically through its dedicated owner, and keep Project Edit and Settings catalogs from replaying stale or unavailable profile state.

Add focused regressions for confirmation, collisions, malformed project metadata, avatar failures, running profiles, and sparse project updates.
2026-08-12 14:34:15 +02:00
Alessandro
9e5fd188e2 Finish scoped Agent Editor profile workflows
Add per-scope availability, duplication, active-profile status, and inline project selection while keeping the profile switcher synchronized with runtime state.

Reconcile unavailable profiles at explicit disable, deletion, project-transition, and context-creation boundaries; polish validation, prompt layout, deletion, and completion states; and extend focused backend and WebUI coverage.
2026-08-12 14:34:15 +02:00