diff --git a/.gitattributes b/.gitattributes index 10c17f97ae73e107f50af157724216697e9418ec..d390e26bdebf6b49e82bb4ef255375d06eaad4f9 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,236 @@ version https://git-lfs.github.com/spec/v1 oid sha256:56c89d9018842070bb8dd1397378f26b814d30f4f7c56d8ff8788dbae1f83682 size 72 +docker/base/Dockerfile filter=lfs diff=lfs merge=lfs -text +docker/base/build.txt filter=lfs diff=lfs merge=lfs -text +docker/base/fs/etc/searxng/limiter.toml filter=lfs diff=lfs merge=lfs -text +docker/base/fs/etc/searxng/settings.yml filter=lfs diff=lfs merge=lfs -text +docker/base/fs/ins/after_install.sh filter=lfs diff=lfs merge=lfs -text +docker/base/fs/ins/configure_ssh.sh filter=lfs diff=lfs merge=lfs -text +docker/base/fs/ins/install_base_packages1.sh filter=lfs diff=lfs merge=lfs -text +docker/base/fs/ins/install_base_packages2.sh filter=lfs diff=lfs merge=lfs -text +docker/base/fs/ins/install_base_packages3.sh filter=lfs diff=lfs merge=lfs -text +docker/base/fs/ins/install_base_packages4.sh filter=lfs diff=lfs merge=lfs -text +docker/base/fs/ins/install_python.sh filter=lfs diff=lfs merge=lfs -text +docker/base/fs/ins/install_searxng.sh filter=lfs diff=lfs merge=lfs -text +docker/base/fs/ins/install_searxng2.sh filter=lfs diff=lfs merge=lfs -text +docker/run/AGENTS.md filter=lfs diff=lfs merge=lfs -text +docker/run/Dockerfile filter=lfs diff=lfs merge=lfs -text +docker/run/build.txt filter=lfs diff=lfs merge=lfs -text +docker/run/docker-compose.yml filter=lfs diff=lfs merge=lfs -text +docker/run/fs/etc/nginx/nginx.conf filter=lfs diff=lfs merge=lfs -text +docker/run/fs/etc/searxng/limiter.toml filter=lfs diff=lfs merge=lfs -text +docker/run/fs/etc/searxng/settings.yml filter=lfs diff=lfs merge=lfs -text +docker/run/fs/etc/supervisor/conf.d/supervisord.conf filter=lfs diff=lfs merge=lfs -text +docker/run/fs/exe/huggingface-entrypoint.sh filter=lfs diff=lfs merge=lfs -text +docker/run/fs/exe/initialize.sh filter=lfs diff=lfs merge=lfs -text +docker/run/fs/exe/node_eval.js filter=lfs diff=lfs merge=lfs -text +docker/run/fs/exe/run_A0.sh filter=lfs diff=lfs merge=lfs -text +docker/run/fs/exe/run_searxng.sh filter=lfs diff=lfs merge=lfs -text +docker/run/fs/exe/run_tunnel_api.sh filter=lfs diff=lfs merge=lfs -text +docker/run/fs/exe/self_update_manager.py filter=lfs diff=lfs merge=lfs -text +docker/run/fs/exe/supervisor_event_listener.py filter=lfs diff=lfs merge=lfs -text +docker/run/fs/exe/trigger_self_update.sh filter=lfs diff=lfs merge=lfs -text +docker/run/fs/ins/copy_A0.sh filter=lfs diff=lfs merge=lfs -text +docker/run/fs/ins/install_A0.sh filter=lfs diff=lfs merge=lfs -text +docker/run/fs/ins/install_A02.sh filter=lfs diff=lfs merge=lfs -text +docker/run/fs/ins/install_additional.sh filter=lfs diff=lfs merge=lfs -text +docker/run/fs/ins/install_playwright.sh filter=lfs diff=lfs merge=lfs -text +docker/run/fs/ins/post_install.sh filter=lfs diff=lfs merge=lfs -text +docker/run/fs/ins/pre_install.sh filter=lfs diff=lfs merge=lfs -text +docker/run/fs/ins/setup_ssh.sh filter=lfs diff=lfs merge=lfs -text +docker/run/fs/ins/setup_venv.sh filter=lfs diff=lfs merge=lfs -text +docker/run/fs/per/root/.bashrc filter=lfs diff=lfs merge=lfs -text +docker/run/fs/per/root/.profile filter=lfs diff=lfs merge=lfs -text +docs/AGENTS.md filter=lfs diff=lfs merge=lfs -text +docs/README.md filter=lfs diff=lfs merge=lfs -text +docs/developer/architecture.md filter=lfs diff=lfs merge=lfs -text +docs/developer/connectivity.md filter=lfs diff=lfs merge=lfs -text +docs/developer/contributing-skills.md filter=lfs diff=lfs merge=lfs -text +docs/developer/extensions.md filter=lfs diff=lfs merge=lfs -text +docs/developer/mcp-configuration.md filter=lfs diff=lfs merge=lfs -text +docs/developer/notifications.md filter=lfs diff=lfs merge=lfs -text +docs/developer/plugins.md filter=lfs diff=lfs merge=lfs -text +docs/developer/sharing-and-safety.md filter=lfs diff=lfs merge=lfs -text +docs/developer/websockets.md filter=lfs diff=lfs merge=lfs -text +docs/guides/a0-cli-connector.md filter=lfs diff=lfs merge=lfs -text +docs/guides/a2a-setup.md filter=lfs diff=lfs merge=lfs -text +docs/guides/agent-profiles.md filter=lfs diff=lfs merge=lfs -text +docs/guides/api-integration.md filter=lfs diff=lfs merge=lfs -text +docs/guides/browser.md filter=lfs diff=lfs merge=lfs -text +docs/guides/contribution.md filter=lfs diff=lfs merge=lfs -text +docs/guides/create-plugin.md filter=lfs diff=lfs merge=lfs -text +docs/guides/desktop.md filter=lfs diff=lfs merge=lfs -text +docs/guides/launcher.md filter=lfs diff=lfs merge=lfs -text +docs/guides/local-model-tool-use.md filter=lfs diff=lfs merge=lfs -text +docs/guides/mcp-setup.md filter=lfs diff=lfs merge=lfs -text +docs/guides/memory.md filter=lfs diff=lfs merge=lfs -text +docs/guides/model-presets.md filter=lfs diff=lfs merge=lfs -text +docs/guides/onboarding.md filter=lfs diff=lfs merge=lfs -text +docs/guides/projects.md filter=lfs diff=lfs merge=lfs -text +docs/guides/self-update.md filter=lfs diff=lfs merge=lfs -text +docs/guides/skills.md filter=lfs diff=lfs merge=lfs -text +docs/guides/troubleshooting.md filter=lfs diff=lfs merge=lfs -text +docs/guides/usage.md filter=lfs diff=lfs merge=lfs -text +docs/quickstart.md filter=lfs diff=lfs merge=lfs -text +docs/res/a0-vector-graphics/banner.svg filter=lfs diff=lfs merge=lfs -text +docs/res/a0-vector-graphics/dark.svg filter=lfs diff=lfs merge=lfs -text +docs/res/a0-vector-graphics/darkSymbol.svg filter=lfs diff=lfs merge=lfs -text +docs/res/a0-vector-graphics/horizontal_banner.svg filter=lfs diff=lfs merge=lfs -text +docs/res/a0-vector-graphics/light.svg filter=lfs diff=lfs merge=lfs -text +docs/res/a0-vector-graphics/lightSymbol.svg filter=lfs diff=lfs merge=lfs -text +docs/res/banner.png filter=lfs diff=lfs merge=lfs -text +docs/res/banner_high.png filter=lfs diff=lfs merge=lfs -text +docs/res/dark.svg filter=lfs diff=lfs merge=lfs -text +docs/res/dev/devinst-1.png filter=lfs diff=lfs merge=lfs -text +docs/res/dev/devinst-11.png filter=lfs diff=lfs merge=lfs -text +docs/res/dev/devinst-12.png filter=lfs diff=lfs merge=lfs -text +docs/res/dev/devinst-13.png filter=lfs diff=lfs merge=lfs -text +docs/res/dev/devinst-14.png filter=lfs diff=lfs merge=lfs -text +docs/res/dev/devinst-3.png filter=lfs diff=lfs merge=lfs -text +docs/res/dev/devinst-4.png filter=lfs diff=lfs merge=lfs -text +docs/res/dev/devinst-5.png filter=lfs diff=lfs merge=lfs -text +docs/res/dev/devinst-6.png filter=lfs diff=lfs merge=lfs -text +docs/res/dev/devinst-7.png filter=lfs diff=lfs merge=lfs -text +docs/res/dev/devinst-8.png filter=lfs diff=lfs merge=lfs -text +docs/res/dev/devinst-9.png filter=lfs diff=lfs merge=lfs -text +docs/res/favicon.png filter=lfs diff=lfs merge=lfs -text +docs/res/favicon_round.png filter=lfs diff=lfs merge=lfs -text +docs/res/header.png filter=lfs diff=lfs merge=lfs -text +docs/res/install_guide.png filter=lfs diff=lfs merge=lfs -text +docs/res/profiles.png filter=lfs diff=lfs merge=lfs -text +docs/res/quickstart/image-24.png filter=lfs diff=lfs merge=lfs -text +docs/res/quickstart/ui_chat_management.png filter=lfs diff=lfs merge=lfs -text +docs/res/quickstart/ui_newchat1.png filter=lfs diff=lfs merge=lfs -text +docs/res/settings-page-ui1.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/1-docker-image-search.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/2-docker-image-run-3.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/2-docker-image-run.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/3-docker-port-mapping.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/4-docker-container-started.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/5-docker-click-to-open.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/6-docker-a0-running-new.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/9-rfc-devpage-on-docker-instance-1.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/9-rfc-devpage-on-local-sbs-1.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/a2a/a2a-conn.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/a2a/a2a2.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/docker-delete-image-1.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/image-1.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/image-10.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/image-11.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/image-12.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/image-13.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/image-14-u.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/image-14.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/image-15.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/image-16.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/image-17.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/image-18.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/image-2.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/image-20.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/image-21.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/image-22-1.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/image-23-1.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/image-3.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/image-4.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/image-5.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/image-6.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/image-7.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/image-8.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/image-9.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/image.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/macsocket.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/mcp/mcp-example-config.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/mcp/mcp-open-config.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/oses/apple.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/oses/linux.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/oses/windows.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/settings/1-agentConfig.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/settings/2-chat-model.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/settings/3-auth.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/settings/4-local-models.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/thumb_setup.png filter=lfs diff=lfs merge=lfs -text +docs/res/setup/update-initialize.png filter=lfs diff=lfs merge=lfs -text +docs/res/splash.webp filter=lfs diff=lfs merge=lfs -text +docs/res/splash_wide.png filter=lfs diff=lfs merge=lfs -text +docs/res/thumbnail-install.webp filter=lfs diff=lfs merge=lfs -text +docs/res/time-travel.png filter=lfs diff=lfs merge=lfs -text +docs/res/ui_screen2.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/a0-cli/a0-cli-browser-host-mode.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/a0-cli/a0-cli-browser-privacy.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/a0-cli/a0-cli-browser-status.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/a0-cli/a0-cli-command-browser.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/a0-cli/a0-cli-command-palette.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/a0-cli/a0-cli-host-picker.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/a0-cli/a0-cli-permissions.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/a0-cli/a0-cli-profile-created.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/a0-cli/a0-cli-profile-menu.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/a0-cli/a0-cli-start.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/action-btns.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/api-int/api-int-1.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/api-int/api-int-2image-gen-api2.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/api-int/api-int-3-api-key-missing-secrets.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/api-int/api-int-4-secrets-setting.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/api-int/api-int-5-finish.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/attachments-1.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/attachments-2.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/browser/browser-annotation-comment.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/browser/browser-canvas-example.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/browser/browser-canvas-wide.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/browser/browser-plugin-settings.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/browser/browser-tool-history-expanded.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/browser/browser-toolbar-settings.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/browser/host-browser-remote-debugging-allow.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/browser/host-browser-remote-debugging-setting.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/file-browser.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/file-edit.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/first-task.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/launcher/launcher-installs.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/launcher/launcher-runtime-setup.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/memory-dashboard.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/memory-editing.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/multi-agent.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/nudge.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/onboarding/onboarding-account-provider.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/onboarding/onboarding-agent-zero-api-key-model.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/onboarding/onboarding-agent-zero-api-model-dropdown.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/onboarding/onboarding-cloud-provider.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/onboarding/onboarding-local-ollama-main.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/onboarding/onboarding-model-gate.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/onboarding/onboarding-ready.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/onboarding/onboarding-start.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/onboarding/onboarding-utility-same-model.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/projects/projects-activate-project.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/projects/projects-creation.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/projects/projects-desc-and-instructions.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/projects/projects-first-ops.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/projects/projects-git-projects-tree.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/projects/projects-gitprojects-clone.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/restart.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/tasks/edit-task.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/tasks/scheduler-1.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/ui-context1.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/ui-history1.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/ui-katex-2.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/ui-settings-5-speech-to-text.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/ui-tts-stop-speech1.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/updating/self-update-v1-to-v2-warning.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/updating/self-update-v2-current.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/webui/agent-editor-advanced-prompts.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/webui/agent-editor-advanced-tools.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/webui/agent-editor-easy-permissions.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/webui/agent-editor-easy.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/webui/agent-editor-review.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/webui/agent-profile-manager.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/webui/agent-profile-selector.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/webui/chat-more-actions-skills.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/webui/dashboard.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/webui/desktop-canvas.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/webui/desktop-new-menu.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/webui/desktop-writer.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/webui/memory-dashboard-controls.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/webui/model-preset-selector.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/webui/model-presets-add.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/webui/model-presets-editor.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/webui/project-active-chat.png filter=lfs diff=lfs merge=lfs -text +docs/res/usage/webui/project-create-filled.png filter=lfs diff=lfs merge=lfs -text diff --git a/docker/base/Dockerfile b/docker/base/Dockerfile index 7e94ed80a5b5000b4946c33b5f5b33e6a54907d9..a52f1d09854e2a2d9258f12a8b8a5e916fd24c56 100644 --- a/docker/base/Dockerfile +++ b/docker/base/Dockerfile @@ -1,40 +1,3 @@ -# Use the latest slim version of Kali Linux -FROM kalilinux/kali-rolling - - -# Set locale to en_US.UTF-8 and timezone to UTC -RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y locales tzdata -RUN sed -i -e 's/# \(en_US\.UTF-8 .*\)/\1/' /etc/locale.gen && \ - dpkg-reconfigure --frontend=noninteractive locales && \ - update-locale LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=en_US.UTF-8 -RUN ln -sf /usr/share/zoneinfo/UTC /etc/localtime -RUN echo "UTC" > /etc/timezone -RUN dpkg-reconfigure -f noninteractive tzdata -ENV LANG=en_US.UTF-8 -ENV LANGUAGE=en_US:en -ENV LC_ALL=en_US.UTF-8 -ENV TZ=UTC - -# Copy contents of the project to / -COPY ./fs/ / - -# install packages software (split for better cache management) -RUN bash /ins/install_base_packages1.sh -RUN bash /ins/install_base_packages2.sh -RUN bash /ins/install_base_packages3.sh -RUN bash /ins/install_base_packages4.sh - -# install python after packages to ensure version overriding -RUN bash /ins/install_python.sh - -# install searxng -RUN bash /ins/install_searxng.sh - -# configure ssh -RUN bash /ins/configure_ssh.sh - -# after install -RUN bash /ins/after_install.sh - -# Keep container running infinitely -CMD ["tail", "-f", "/dev/null"] +version https://git-lfs.github.com/spec/v1 +oid sha256:234bdf6caffd5a7ddac176efea5b3060f1de4d38f26790277876370304b05034 +size 1196 diff --git a/docker/base/build.txt b/docker/base/build.txt index c2c652f480bdd0e87017a88fbebc605aedeee775..0945249e221082af50d3b1cc69dd5622b74c750b 100644 --- a/docker/base/build.txt +++ b/docker/base/build.txt @@ -1,18 +1,3 @@ -# local image with smart cache -docker build -t agent-zero-base:local --build-arg CACHE_DATE=$(date +%Y-%m-%d:%H:%M:%S) . - -# local image without cache -docker build -t agent-zero-base:local --no-cache . - -# dockerhub push: - -docker login - -# with cache -docker buildx build -t agent0ai/agent-zero-base:latest --platform linux/amd64,linux/arm64 --push --build-arg CACHE_DATE=$(date +%Y-%m-%d:%H:%M:%S) . - -# without cache -docker buildx build -t agent0ai/agent-zero-base:latest --platform linux/amd64,linux/arm64 --push --build-arg CACHE_DATE=$(date +%Y-%m-%d:%H:%M:%S) --no-cache . - -# plain output ---progress=plain \ No newline at end of file +version https://git-lfs.github.com/spec/v1 +oid sha256:7e6132c3b52e84a646dfc752ccea6a278c01ef1f6b1c7d20a217496cb0dda743 +size 608 diff --git a/docker/base/fs/etc/searxng/limiter.toml b/docker/base/fs/etc/searxng/limiter.toml index d5cddbc9f54f2538ffb08326bf995386ea924ec2..1ea525f9197aada7e8d939c74e29fdaeb40f0362 100644 --- a/docker/base/fs/etc/searxng/limiter.toml +++ b/docker/base/fs/etc/searxng/limiter.toml @@ -1,33 +1,3 @@ -[botdetection] -# Number of values to trust for X-Forwarded-For. -trusted_proxies = ["127.0.0.1"] - -# The prefix defines the number of leading bits in an address that are compared -# to determine whether or not an address is part of a (client) network. -ipv4_prefix = 32 -ipv6_prefix = 48 - -[botdetection.ip_limit] -# To get unlimited access in a local network, by default link-local addresses -# (networks) are not monitored by the ip_limit -filter_link_local = false - -# Activate link_token method in the ip_limit method -link_token = false - -[botdetection.ip_lists] -# In the limiter, the ip_lists method has priority over all other methods. -# If an IP is in the pass_ip list, it has unrestricted access and is not -# checked if, for example, the "user agent" suggests a bot (e.g., curl). -block_ip = [ - # '93.184.216.34', # Example IPv4 address - # '257.1.1.1', # Invalid IP --> will be ignored, logged in ERROR class -] -pass_ip = [ - # '192.168.0.0/16', # IPv4 private network - # 'fe80::/10', # IPv6 link-local; overrides botdetection.ip_limit.filter_link_local -] - -# Activate passlist of (hardcoded) IPs from the SearXNG organization, -# e.g., `check.searx.space`. -pass_searxng_org = true +version https://git-lfs.github.com/spec/v1 +oid sha256:0823d3680c926766580465b06b07ffb2198c9e4e53ca56a2ca3a45fc4a5811be +size 1199 diff --git a/docker/base/fs/etc/searxng/settings.yml b/docker/base/fs/etc/searxng/settings.yml index e8cc4ef37c704bca49bb998945ca11de1ffd1097..185e2a9eab215ba45174e3e95dbb7aa4455af054 100644 --- a/docker/base/fs/etc/searxng/settings.yml +++ b/docker/base/fs/etc/searxng/settings.yml @@ -1,91 +1,3 @@ -# SearXNG settings - -# Keep a minimal default engine set. Wikidata currently returns -# variant payloads that break the 2026.04 searxng bootstrap init path. -use_default_settings: - engines: - remove: - - wikidata - -general: - debug: false - instance_name: "SearXNG" - -search: - safe_search: 0 - # autocomplete: 'duckduckgo' - formats: - - json - # - html - -server: - # Is overwritten by ${SEARXNG_SECRET} - secret_key: "dummy" - port: 55510 - limiter: false - image_proxy: false - # public URL of the instance, to ensure correct inbound links. Is overwritten - # by ${SEARXNG_URL}. - # base_url: http://example.com/location - -# redis: -# # URL to connect redis database. Is overwritten by ${SEARXNG_REDIS_URL}. -# url: unix:///usr/local/searxng-redis/run/redis.sock?db=0 - -ui: - static_use_hash: true - -# preferences: -# lock: -# - autocomplete -# - method - -enabled_plugins: - - 'Hash plugin' - - 'Self Informations' - - 'Tracker URL remover' - # - 'Ahmia blacklist' - # - 'Hostnames plugin' # see 'hostnames' configuration below - # - 'Open Access DOI rewrite' - -# plugins: -# - only_show_green_results - -# hostnames: -# replace: -# '(.*\.)?youtube\.com$': 'invidious.example.com' -# '(.*\.)?youtu\.be$': 'invidious.example.com' -# remove: -# - '(.*\.)?facebook.com$' -# low_priority: -# - '(.*\.)?google\.com$' -# high_priority: -# - '(.*\.)?wikipedia.org$' - -engines: - - - name: ahmia - disabled: true - inactive: true - - - name: torch - disabled: true - inactive: true - -# - name: fdroid -# disabled: false -# -# - name: apk mirror -# disabled: false -# -# - name: mediathekviewweb -# categories: TV -# disabled: false -# -# - name: invidious -# disabled: false -# base_url: -# - https://invidious.snopyta.org -# - https://invidious.tiekoetter.com -# - https://invidio.xamh.de -# - https://inv.riverside.rocks +version https://git-lfs.github.com/spec/v1 +oid sha256:285a75924555f7ce3e2c31020eb0ea48d9d86cdaae5488b4eedf07b0d3006d89 +size 1890 diff --git a/docker/base/fs/ins/after_install.sh b/docker/base/fs/ins/after_install.sh index ca2028addfc968da4ef97f48d6fc4f0697ea3f1f..4d99c11c98e598681b7cb414a5a2e323277df985 100644 --- a/docker/base/fs/ins/after_install.sh +++ b/docker/base/fs/ins/after_install.sh @@ -1,5 +1,3 @@ -#!/bin/bash -set -e - -# clean up apt cache -sudo apt-get clean +version https://git-lfs.github.com/spec/v1 +oid sha256:307cbee5297787e5f380cd77003e559f66e5f18aa88e8dc8ea07c94971ad7af5 +size 60 diff --git a/docker/base/fs/ins/configure_ssh.sh b/docker/base/fs/ins/configure_ssh.sh index da89272e6665ef5875b94839f9b9bedb68dc4550..c485f5dc715b6f970b5f942858bc82783c1bc362 100644 --- a/docker/base/fs/ins/configure_ssh.sh +++ b/docker/base/fs/ins/configure_ssh.sh @@ -1,6 +1,3 @@ -#!/bin/bash -set -e - -# Set up SSH -mkdir -p /var/run/sshd && \ - sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config \ No newline at end of file +version https://git-lfs.github.com/spec/v1 +oid sha256:16e50ddfdac1068376d23490242d51cfbad1297a3a686b2c70fbebe54b5c95d8 +size 152 diff --git a/docker/base/fs/ins/install_base_packages1.sh b/docker/base/fs/ins/install_base_packages1.sh index 9bd108c1e9dbfe974682a788ef06464f96912c82..808f3c82edf445d9b9802275f82d49608ddc9a71 100644 --- a/docker/base/fs/ins/install_base_packages1.sh +++ b/docker/base/fs/ins/install_base_packages1.sh @@ -1,11 +1,3 @@ -#!/bin/bash -set -e - -echo "====================BASE PACKAGES1 START====================" - -apt-get update && apt-get upgrade -y - -apt-get install -y --no-install-recommends \ - sudo curl wget git cron unzip 7zip - -echo "====================BASE PACKAGES1 END====================" +version https://git-lfs.github.com/spec/v1 +oid sha256:a8fdbbaf67375fd8ce6691a7e5dafef875649687b8355ab3c4f9fefbb4cdb1ca +size 278 diff --git a/docker/base/fs/ins/install_base_packages2.sh b/docker/base/fs/ins/install_base_packages2.sh index 1c33313e868d86da75edf9c9cfae3f562b5c8482..bb8b31855de0c3e93ddddb2e4701c49e9279c0c8 100644 --- a/docker/base/fs/ins/install_base_packages2.sh +++ b/docker/base/fs/ins/install_base_packages2.sh @@ -1,10 +1,3 @@ -#!/bin/bash -set -e - -echo "====================BASE PACKAGES2 START====================" - - -apt-get install -y --no-install-recommends \ - openssh-server ffmpeg supervisor - -echo "====================BASE PACKAGES2 END====================" +version https://git-lfs.github.com/spec/v1 +oid sha256:91b5a734921d9be8fe70705f9d8a1c6ce731ef718b8bfb1cd92d5133498a4c59 +size 239 diff --git a/docker/base/fs/ins/install_base_packages3.sh b/docker/base/fs/ins/install_base_packages3.sh index c77f6d492c459947e6e8bdb3e658e4d31b1afce5..9fe230050d57a4ef501aa9ccc894e740db525e05 100644 --- a/docker/base/fs/ins/install_base_packages3.sh +++ b/docker/base/fs/ins/install_base_packages3.sh @@ -1,13 +1,3 @@ -#!/bin/bash -set -e - -echo "====================BASE PACKAGES3 START====================" - -apt-get install -y --no-install-recommends \ - nodejs npm - -echo "====================BASE PACKAGES3 NPM====================" - -# we shall not install npx separately, it's discontinued and some versions are broken -# npm i -g npx -echo "====================BASE PACKAGES3 END====================" +version https://git-lfs.github.com/spec/v1 +oid sha256:964b5a3d7f2afdaf2e27bf60bb28e77b6bcc8d19476722615d47254529e352c7 +size 384 diff --git a/docker/base/fs/ins/install_base_packages4.sh b/docker/base/fs/ins/install_base_packages4.sh index 45726ddc08b0d9013603e24e31ae532cf2cabd74..2b6b70118ecee57a988402dc9fb50af7d8a93fc7 100644 --- a/docker/base/fs/ins/install_base_packages4.sh +++ b/docker/base/fs/ins/install_base_packages4.sh @@ -1,9 +1,3 @@ -#!/bin/bash -set -e - -echo "====================BASE PACKAGES4 START====================" - -apt-get install -y --no-install-recommends \ - tesseract-ocr tesseract-ocr-script-latn poppler-utils - -echo "====================BASE PACKAGES4 END====================" \ No newline at end of file +version https://git-lfs.github.com/spec/v1 +oid sha256:2d7ac6e3c9ed2b10e886ef56de073e35643981181e1f9b77b22e9541d771b7ce +size 258 diff --git a/docker/base/fs/ins/install_python.sh b/docker/base/fs/ins/install_python.sh index 71c9513ef6fd59d9895948afcd33e52ba654d6b0..d55c88bf953fac626af5c9a4e10d61d20313eec7 100644 --- a/docker/base/fs/ins/install_python.sh +++ b/docker/base/fs/ins/install_python.sh @@ -1,73 +1,3 @@ -#!/bin/bash -set -e - -echo "====================PYTHON START====================" - -echo "====================PYTHON 3.13====================" - -apt clean && apt-get update && apt-get -y upgrade - -# install python 3.13 globally -apt-get install -y --no-install-recommends \ - python3.13 python3.13-venv - #python3.13-dev - - -echo "====================PYTHON 3.13 VENV====================" - -# create and activate default venv -python3.13 -m venv /opt/venv -source /opt/venv/bin/activate - -# upgrade pip and install static packages -pip install --no-cache-dir --upgrade pip pipx ipython requests - -echo "====================PYTHON PYVENV====================" - -# Install pyenv build dependencies. -apt-get install -y --no-install-recommends \ - make build-essential libssl-dev zlib1g-dev libbz2-dev \ - libreadline-dev libsqlite3-dev wget curl llvm \ - libncursesw5-dev xz-utils tk-dev libxml2-dev \ - libxmlsec1-dev libffi-dev liblzma-dev - -# Install pyenv globally -git clone https://github.com/pyenv/pyenv.git /opt/pyenv - -# Setup environment variables for pyenv to be available system-wide -cat > /etc/profile.d/pyenv.sh <<'EOF' -export PYENV_ROOT="/opt/pyenv" -export PATH="$PYENV_ROOT/bin:$PATH" -eval "$(pyenv init --path)" -EOF - -# fix permissions -chmod +x /etc/profile.d/pyenv.sh - -# Source pyenv environment to make it available in this script -source /etc/profile.d/pyenv.sh - -# Install Python 3.12.4 -echo "====================PYENV 3.12 VENV====================" -pyenv install 3.12.4 - -/opt/pyenv/versions/3.12.4/bin/python -m venv /opt/venv-a0 -source /opt/venv-a0/bin/activate - -# upgrade pip and install static packages -pip install --no-cache-dir --upgrade pip pipx - -# Install some packages in specific variants -pip install --no-cache-dir \ - torch==2.4.0 \ - torchvision==0.19.0 \ - --index-url https://download.pytorch.org/whl/cpu - -echo "====================PYTHON UV ====================" - -curl -Ls https://astral.sh/uv/install.sh | UV_INSTALL_DIR=/usr/local/bin sh - -# clean up pip cache -pip cache purge - -echo "====================PYTHON END====================" +version https://git-lfs.github.com/spec/v1 +oid sha256:9c83793cf9f40cc2f1c318e3014f53b540e1056954eba409bc13712b0fc8579d +size 2068 diff --git a/docker/base/fs/ins/install_searxng.sh b/docker/base/fs/ins/install_searxng.sh index 65d0719a53b19e703e31795100b1f84a0a4d772e..a853964739d16ac23decc959d055392d2873a573 100644 --- a/docker/base/fs/ins/install_searxng.sh +++ b/docker/base/fs/ins/install_searxng.sh @@ -1,29 +1,3 @@ -#!/bin/bash -set -e - -echo "====================SEARXNG1 START====================" - -# Install necessary packages -apt-get install -y \ - git build-essential libxslt-dev zlib1g-dev libffi-dev libssl-dev -# python3.12-babel uwsgi uwsgi-plugin-python3 - - -# Add the searxng system user -useradd --shell /bin/bash --system \ - --home-dir "/usr/local/searxng" \ - --comment 'Privacy-respecting metasearch engine' \ - searxng - -# Add the searxng user to the sudo group -usermod -aG sudo searxng - -# Create the searxng directory and set ownership -mkdir "/usr/local/searxng" -chown -R "searxng:searxng" "/usr/local/searxng" - -echo "====================SEARXNG1 END====================" - -# Start a new shell as the searxng user and run the installation script -su - searxng -c "bash /ins/install_searxng2.sh" - +version https://git-lfs.github.com/spec/v1 +oid sha256:b9fdb44b3ed98908f44fdc0dda73946afe22a12e56067863da837bfefc528b8e +size 800 diff --git a/docker/base/fs/ins/install_searxng2.sh b/docker/base/fs/ins/install_searxng2.sh index 97e735fafd6ad47f78961aac86892bcce41827d6..5767049ba6a021fd565f289ff6d0e6c255a18355 100644 --- a/docker/base/fs/ins/install_searxng2.sh +++ b/docker/base/fs/ins/install_searxng2.sh @@ -1,36 +1,3 @@ -#!/bin/bash -set -e - -echo "====================SEARXNG2 START====================" - - -# clone SearXNG repo -git clone "https://github.com/searxng/searxng" \ - "/usr/local/searxng/searxng-src" - -echo "====================SEARXNG2 VENV====================" - -# create virtualenv: -python3.13 -m venv "/usr/local/searxng/searx-pyenv" - -# make it default -echo ". /usr/local/searxng/searx-pyenv/bin/activate" \ - >> "/usr/local/searxng/.profile" - -# activate venv -source "/usr/local/searxng/searx-pyenv/bin/activate" - -echo "====================SEARXNG2 INST====================" - -# update pip's boilerplate -pip install --no-cache-dir -U pip setuptools wheel pyyaml lxml msgspec typing_extensions - -# jump to SearXNG's working tree and install SearXNG into virtualenv -cd "/usr/local/searxng/searxng-src" -# pip install --no-cache-dir --use-pep517 --no-build-isolation -e . -pip install --no-cache-dir --use-pep517 --no-build-isolation . - -# cleanup cache -pip cache purge - -echo "====================SEARXNG2 END====================" \ No newline at end of file +version https://git-lfs.github.com/spec/v1 +oid sha256:ea486499849de2f7bc02febb8cac390b94d01e10dcdf3415f9b126c5f1be6726 +size 1048 diff --git a/docker/run/AGENTS.md b/docker/run/AGENTS.md index fc577fe40bcd2cc89d6865cd0d9c22aa5df31a2f..96fab8dbc9b1d928f10af5aa3fac38420d9e73be 100644 --- a/docker/run/AGENTS.md +++ b/docker/run/AGENTS.md @@ -1,43 +1,3 @@ -# Docker Runtime Image DOX - -## Purpose - -- Own the runnable Agent Zero image context and local compose example. -- Install Agent Zero from a selected branch onto the base image and prepare runtime entrypoints. - -## Ownership - -- `Dockerfile` owns branch-based image assembly, exposed ports, and container startup command. -- `docker-compose.yml` owns the local compose service example. -- `build.txt` owns maintainer build and push command notes. -- `fs/exe/` owns runtime entrypoint, supervisor, self-update, Node eval, and service scripts. -- `fs/exe/huggingface-entrypoint.sh` owns Space-specific startup defaults, including disabling outbound Cloudflare tunnels and enabling A2A. -- `fs/ins/` owns preinstall, installation, virtualenv, Playwright, SSH, and postinstall scripts. -- Files under `fs/` are copied to container root during the runtime build. - -## Local Contracts - -- `BRANCH` is required for branch-based Docker builds. -- Preserve exposed ports for SSH, HTTP, and tunneled services unless docs and workflows are updated together. -- Keep the two-runtime Python model aligned with the root contract. -- Keep runtime desktop packages on `kali-last-snapshot`; carry the rolling base's matching ATK introspection package into that transaction, then pin the verified Python 3.13-compatible LibreOffice and complete Xpra runtime versions in `fs/ins/install_additional.sh` for both published architectures. -- Do not bake secrets, local `.env` values, or user data into the image. -- Runtime startup must ensure `/a0/usr/uploads` exists before supervised services start. -- Runtime startup raises the soft open-file limit toward `A0_NOFILE_LIMIT` (default `65535`) before supervisord starts, bounded by the container hard limit. -- Self-update user-data backups skip Time Travel shadow history under `usr/.time_travel/` and transient Desktop agent state. -- Self-update waits up to 180 seconds for the updated or restored WebUI health check by default; `A0_SELF_UPDATE_HEALTH_TIMEOUT_SECONDS` may override it. -- Successful or already-current self-updates refresh an installed Codex CLI with npm on a best-effort basis; missing CLIs and registry failures must not block Agent Zero startup. - -## Work Guidance - -- Keep startup scripts explicit about framework runtime versus execution runtime. -- Coordinate tag, branch, and publishing changes with GitHub workflow automation. - -## Verification - -- Build `docker/run` when changing Dockerfile or install scripts. -- Smoke-test container startup after entrypoint, supervisor, port, or compose changes. - -## Child DOX Index - -No child DOX files. +version https://git-lfs.github.com/spec/v1 +oid sha256:17bbe98c21959fe36a5b7fe507d326495d066b9cd55358e6244b65c9b375ec6f +size 2574 diff --git a/docker/run/Dockerfile b/docker/run/Dockerfile index 48664461bfc910a7e5b190d58f1ac9e19ac6bcf0..3bbaa73a33bfb446583155fcb9106dd649231c17 100644 --- a/docker/run/Dockerfile +++ b/docker/run/Dockerfile @@ -1,36 +1,3 @@ -# Use the pre-built base image for A0 -# FROM agent-zero-base:local -# FROM agent0ai/agent-zero-base:testing -FROM agent0ai/agent-zero-base:latest - -# Check if the argument is provided, else throw an error -ARG BRANCH -RUN if [ -z "$BRANCH" ]; then echo "ERROR: BRANCH is not set!" >&2; exit 1; fi -ENV BRANCH=$BRANCH - -# Copy filesystem files to root -COPY ./fs/ / - -# pre installation steps -RUN bash /ins/pre_install.sh $BRANCH - -# install A0 -RUN bash /ins/install_A0.sh $BRANCH - -# install additional software -RUN bash /ins/install_additional.sh $BRANCH - -# cleanup repo and install A0 without caching, this speeds up builds -ARG CACHE_DATE=none -RUN echo "cache buster $CACHE_DATE" && bash /ins/install_A02.sh $BRANCH - -# post installation steps -RUN bash /ins/post_install.sh $BRANCH - -# Expose ports -EXPOSE 22 80 9000-9009 - -RUN chmod +x /exe/initialize.sh /exe/run_A0.sh /exe/run_searxng.sh /exe/run_tunnel_api.sh /exe/trigger_self_update.sh - -# initialize runtime and switch to supervisord -CMD ["/exe/initialize.sh", "$BRANCH"] +version https://git-lfs.github.com/spec/v1 +oid sha256:e3ae715c51dbf449efa619d79149742eb9bae802d722a75b8476b0a32ba3e8dd +size 1016 diff --git a/docker/run/build.txt b/docker/run/build.txt index 3aec716ed04e95a6f5b2c3663dfd1c26ffa05a8c..09dce64a68c4b5e9607bbff984d2e9325e4508cf 100644 --- a/docker/run/build.txt +++ b/docker/run/build.txt @@ -1,42 +1,3 @@ - -# LOCAL BUILDS -# Run these commands from the project root folder - -# local development image based on local files with smart cache -docker build -f DockerfileLocal -t agent-zero-local --build-arg CACHE_DATE=$(date +%Y-%m-%d:%H:%M:%S) . - -# local development image based on local files without cache -docker build -f DockerfileLocal -t agent-zero-local --no-cache . - - -# GIT BASED BUILDS -# Run these commands from the /docker/run directory - -# local image based on development branch instead of local files -docker build -t agent-zero-development --build-arg BRANCH=development --build-arg CACHE_DATE=$(date +%Y-%m-%d:%H:%M:%S) . - -# local image based on testing branch instead of local files -docker build -t agent-zero-testing --build-arg BRANCH=testing --build-arg CACHE_DATE=$(date +%Y-%m-%d:%H:%M:%S) . - -# local image based on main branch instead of local files -docker build -t agent-zero-main --build-arg BRANCH=main --build-arg CACHE_DATE=$(date +%Y-%m-%d:%H:%M:%S) . - - - -# DOCKERHUB PUSH -# Run these commands from the /docker/run directory - -docker login - -# development: -docker buildx build -t agent0ai/agent-zero:development --platform linux/amd64,linux/arm64 --push --build-arg BRANCH=development --build-arg CACHE_DATE=$(date +%Y-%m-%d:%H:%M:%S) . - -# testing: -docker buildx build -t agent0ai/agent-zero:testing --platform linux/amd64,linux/arm64 --push --build-arg BRANCH=testing --build-arg CACHE_DATE=$(date +%Y-%m-%d:%H:%M:%S) . - -# main -docker buildx build -t agent0ai/agent-zero:vx.x.x -t agent0ai/agent-zero:latest --platform linux/amd64,linux/arm64 --push --build-arg BRANCH=main --build-arg CACHE_DATE=$(date +%Y-%m-%d:%H:%M:%S) . - - -# plain output ---progress=plain \ No newline at end of file +version https://git-lfs.github.com/spec/v1 +oid sha256:75dc51ca78f49f9860ab89813aedc3d37d7f7003863b465a6c02655729c25ae0 +size 1671 diff --git a/docker/run/docker-compose.yml b/docker/run/docker-compose.yml index b80da0272131dd4adaa36157aa32faba3a4c1030..a81d4a300b1411fde6fc9ef319fea81ff6976d20 100644 --- a/docker/run/docker-compose.yml +++ b/docker/run/docker-compose.yml @@ -1,14 +1,3 @@ -services: - agent-zero: - container_name: agent-zero - image: agent0ai/agent-zero:latest - volumes: - - ./agent-zero:/a0 - ports: - - "50080:80" - ulimits: - nofile: - soft: 65535 - hard: 65535 - extra_hosts: - - "host.docker.internal:host-gateway" +version https://git-lfs.github.com/spec/v1 +oid sha256:a7d6aec3bf1bc9e292ccf8f1dafe513bfb869d5093244cad97b8441375edeca6 +size 289 diff --git a/docker/run/fs/etc/nginx/nginx.conf b/docker/run/fs/etc/nginx/nginx.conf index 54dffe65d9abd688276b821ed06fdfcbb1127734..d6a9aa7a558367a56e4fc422410dd3cd568973e1 100644 --- a/docker/run/fs/etc/nginx/nginx.conf +++ b/docker/run/fs/etc/nginx/nginx.conf @@ -1,31 +1,3 @@ -daemon off; -worker_processes 2; -user www-data; - -events { - use epoll; - worker_connections 128; -} - -error_log /var/log/nginx/error.log info; - -http { - server_tokens off; - include mime.types; - charset utf-8; - - access_log /var/log/nginx/access.log combined; - - server { - server_name 127.0.0.1:31735; - listen 127.0.0.1:31735; - - error_page 500 502 503 504 /50x.html; - - location / { - root /; - } - - } - -} +version https://git-lfs.github.com/spec/v1 +oid sha256:f9e58e00c90a7bbe25c26087c7c52ff49dcdbedce331cc4ac24f980104743337 +size 545 diff --git a/docker/run/fs/etc/searxng/limiter.toml b/docker/run/fs/etc/searxng/limiter.toml index d5cddbc9f54f2538ffb08326bf995386ea924ec2..1ea525f9197aada7e8d939c74e29fdaeb40f0362 100644 --- a/docker/run/fs/etc/searxng/limiter.toml +++ b/docker/run/fs/etc/searxng/limiter.toml @@ -1,33 +1,3 @@ -[botdetection] -# Number of values to trust for X-Forwarded-For. -trusted_proxies = ["127.0.0.1"] - -# The prefix defines the number of leading bits in an address that are compared -# to determine whether or not an address is part of a (client) network. -ipv4_prefix = 32 -ipv6_prefix = 48 - -[botdetection.ip_limit] -# To get unlimited access in a local network, by default link-local addresses -# (networks) are not monitored by the ip_limit -filter_link_local = false - -# Activate link_token method in the ip_limit method -link_token = false - -[botdetection.ip_lists] -# In the limiter, the ip_lists method has priority over all other methods. -# If an IP is in the pass_ip list, it has unrestricted access and is not -# checked if, for example, the "user agent" suggests a bot (e.g., curl). -block_ip = [ - # '93.184.216.34', # Example IPv4 address - # '257.1.1.1', # Invalid IP --> will be ignored, logged in ERROR class -] -pass_ip = [ - # '192.168.0.0/16', # IPv4 private network - # 'fe80::/10', # IPv6 link-local; overrides botdetection.ip_limit.filter_link_local -] - -# Activate passlist of (hardcoded) IPs from the SearXNG organization, -# e.g., `check.searx.space`. -pass_searxng_org = true +version https://git-lfs.github.com/spec/v1 +oid sha256:0823d3680c926766580465b06b07ffb2198c9e4e53ca56a2ca3a45fc4a5811be +size 1199 diff --git a/docker/run/fs/etc/searxng/settings.yml b/docker/run/fs/etc/searxng/settings.yml index e5073d924e20e2a716554d6f8f0584e3eaef28d8..d0a28d43536701670a0a612e54c0cdf8d31d769b 100644 --- a/docker/run/fs/etc/searxng/settings.yml +++ b/docker/run/fs/etc/searxng/settings.yml @@ -1,98 +1,3 @@ -# SearXNG settings - -use_default_settings: - engines: - remove: - - radio browser - - wikidata -# TODO enable radio_browser when it works again -# currently it crashes on x86 on gethostbyaddr - -general: - debug: false - instance_name: "SearXNG" - -search: - safe_search: 0 - # autocomplete: 'duckduckgo' - formats: - - json - # - html - -server: - # Is overwritten by ${SEARXNG_SECRET} - secret_key: "dummy" - port: 55510 - limiter: false - image_proxy: false - # public URL of the instance, to ensure correct inbound links. Is overwritten - # by ${SEARXNG_URL}. - # base_url: http://example.com/location - -# redis: -# # URL to connect redis database. Is overwritten by ${SEARXNG_REDIS_URL}. -# url: unix:///usr/local/searxng-redis/run/redis.sock?db=0 - -ui: - static_use_hash: true - -# preferences: -# lock: -# - autocomplete -# - method - -enabled_plugins: - - 'Hash plugin' - - 'Self Informations' - - 'Tracker URL remover' - # - 'Ahmia blacklist' - # - 'Hostnames plugin' # see 'hostnames' configuration below - # - 'Open Access DOI rewrite' - -# plugins: -# - only_show_green_results - -# hostnames: -# replace: -# '(.*\.)?youtube\.com$': 'invidious.example.com' -# '(.*\.)?youtu\.be$': 'invidious.example.com' -# remove: -# - '(.*\.)?facebook.com$' -# low_priority: -# - '(.*\.)?google\.com$' -# high_priority: -# - '(.*\.)?wikipedia.org$' - -engines: - - name: radio browser - engine: radio_browser - disabled: true - inactive: true - - - name: ahmia - disabled: true - inactive: true - - - name: torch - disabled: true - inactive: true -# TODO enable radio_browser when it works again -# currently it crashes on x86 on gethostbyaddr - -# - name: fdroid -# disabled: false -# -# - name: apk mirror -# disabled: false -# -# - name: mediathekviewweb -# categories: TV -# disabled: false -# -# - name: invidious -# disabled: false -# base_url: -# - https://invidious.snopyta.org -# - https://invidious.tiekoetter.com -# - https://invidio.xamh.de -# - https://inv.riverside.rocks +version https://git-lfs.github.com/spec/v1 +oid sha256:b06e7385e5a7a2e2daad711852551cd82c3c2d7923c1cd5d55ddd085e7a04fad +size 2055 diff --git a/docker/run/fs/etc/supervisor/conf.d/supervisord.conf b/docker/run/fs/etc/supervisor/conf.d/supervisord.conf index 63553ddbccbfcef8a14751475debf1d0c848a8dd..173b4b0ab23068dee98aea0e8728f45cb86632be 100644 --- a/docker/run/fs/etc/supervisor/conf.d/supervisord.conf +++ b/docker/run/fs/etc/supervisor/conf.d/supervisord.conf @@ -1,95 +1,3 @@ -[supervisord] -nodaemon=true -user=root -logfile=/dev/stdout -logfile_maxbytes=0 -pidfile=/var/run/supervisord.pid -exitcodes=0,2 -directory=/ - -[unix_http_server] -file=/var/run/supervisor.sock -chmod=0777 - -[rpcinterface:supervisor] -supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface - -[supervisorctl] -serverurl=unix:///var/run/supervisor.sock - -[program:run_sshd] -command=/usr/sbin/sshd -D -environment= -stopwaitsecs=1 -stdout_logfile=/dev/stdout -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/stderr -stderr_logfile_maxbytes=0 -autorestart=true -startretries=3 -stopasgroup=true -killasgroup=true - -[program:run_cron] -command=/usr/sbin/cron -f -environment= -stopwaitsecs=1 -stdout_logfile=/dev/stdout -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/stderr -stderr_logfile_maxbytes=0 -autorestart=true -startretries=3 -stopasgroup=true -killasgroup=true - -[program:run_searxng] -command=/exe/run_searxng.sh -environment=SEARXNG_SETTINGS_PATH=/etc/searxng/settings.yml -user=searxng -directory=/usr/local/searxng/searxng-src -stopwaitsecs=1 -stdout_logfile=/dev/stdout -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/stderr -stderr_logfile_maxbytes=0 -autorestart=true -startretries=3 -stopasgroup=true -killasgroup=true - -[program:run_ui] -command=/exe/run_A0.sh -environment= -user=root -stopwaitsecs=60 -stdout_logfile=/dev/stdout -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/stderr -stderr_logfile_maxbytes=0 -autorestart=true -startretries=3 -stopasgroup=true -killasgroup=true - -[program:run_tunnel_api] -command=/exe/run_tunnel_api.sh -environment= -user=root -stopwaitsecs=60 -stdout_logfile=/dev/stdout -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/stderr -stderr_logfile_maxbytes=0 -autorestart=true -startretries=3 -stopasgroup=true -killasgroup=true - -[eventlistener:the_listener] -command=python3 /exe/supervisor_event_listener.py -events=PROCESS_STATE_FATAL -stdout_logfile=/dev/stdout -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/stderr -stderr_logfile_maxbytes=0 +version https://git-lfs.github.com/spec/v1 +oid sha256:056f6fddc74b8dae60f17e99049605871faf6b1722b199447bd159d156663dd3 +size 1941 diff --git a/docker/run/fs/exe/huggingface-entrypoint.sh b/docker/run/fs/exe/huggingface-entrypoint.sh index a5c3593cbc56149dcd519f9f18e6fdbe40c61793..fe0f504913da545cfe71039714e3ba4ab7e4117c 100644 --- a/docker/run/fs/exe/huggingface-entrypoint.sh +++ b/docker/run/fs/exe/huggingface-entrypoint.sh @@ -1,42 +1,3 @@ -#!/bin/bash -set -euo pipefail - -# Hugging Face provides the public HTTPS edge; never start an outbound tunnel. -if [ "${A0_CLOUDFLARE_DISABLED:-true}" != "true" ]; then - echo "A0_CLOUDFLARE_DISABLED must remain true on Hugging Face Spaces." >&2 - exit 1 -fi - -mkdir -p /a0/usr - -# Settings normalization fills all other defaults. This deployment default makes -# the authenticated A2A endpoint available immediately after the Space starts. -python3 - <<'PY' -import json -import os -from pathlib import Path - -settings_path = Path("/a0/usr/settings.json") -try: - settings = json.loads(settings_path.read_text(encoding="utf-8")) -except (FileNotFoundError, json.JSONDecodeError): - settings = {} - -settings["a2a_server_enabled"] = True -if api_key := os.environ.get("SPYNEL_AGENT_ZERO_API_KEY", "").strip(): - # Use one secret for the loopback client and the existing API-key verifier. - # It is persisted in the private runtime settings file and never printed. - settings["mcp_server_token"] = api_key -settings_path.write_text(json.dumps(settings, indent=2) + "\n", encoding="utf-8") -PY - -echo "Space URL: ${A0_PUBLIC_URL:-https://leon4gr45-agent.hf.space}" -echo "A2A enabled at /a2a; authenticated incoming API enabled at /api_message." -echo "Starting Agent Zero as uid=$(id -u) on ${WEB_UI_HOST:-0.0.0.0}:${WEB_UI_PORT:-7860}." - -# The general Docker initializer is intentionally not used in a Space: it starts -# privileged SSH/cron/supervisor services and inherited images may include -# password initialization. Space dependencies and model data are installed at -# image-build time, so runtime package installation is disabled by the image. -cd /a0 -exec /opt/venv-a0/bin/python run_ui.py +version https://git-lfs.github.com/spec/v1 +oid sha256:f23cde5677afd1c14ea00d92d8c827198d6b18adb3b70f967875d2577396a126 +size 1689 diff --git a/docker/run/fs/exe/initialize.sh b/docker/run/fs/exe/initialize.sh index f4c4dcd2597c87460864f047997cd5793c13e4fc..6cb73e1c4f881964b4f22bb9783068e2465a50b7 100644 --- a/docker/run/fs/exe/initialize.sh +++ b/docker/run/fs/exe/initialize.sh @@ -1,63 +1,3 @@ -#!/bin/bash - -echo "Running initialization script..." - -# branch from parameter -if [ -z "$1" ]; then - echo "Error: Branch parameter is empty. Please provide a valid branch name." - exit 1 -fi -BRANCH="$1" - -raise_open_file_limit() { - local requested="${A0_NOFILE_LIMIT:-65535}" - local soft - local hard - local target - - if ! [[ "$requested" =~ ^[0-9]+$ ]] || [ "$requested" -lt 1 ]; then - echo "Warning: invalid A0_NOFILE_LIMIT='$requested'; keeping open file limit at $(ulimit -S -n)." >&2 - return - fi - - soft="$(ulimit -S -n)" - hard="$(ulimit -H -n)" - - if [ "$soft" = "unlimited" ]; then - echo "Open file limit is already unlimited." - return - fi - - target="$requested" - if [ "$hard" != "unlimited" ] && [ "$target" -gt "$hard" ]; then - target="$hard" - fi - - if [ "$target" -gt "$soft" ]; then - if ulimit -S -n "$target"; then - echo "Raised open file soft limit from $soft to $(ulimit -S -n) (hard: $hard)." - else - echo "Warning: failed to raise open file soft limit from $soft to $target (hard: $hard)." >&2 - fi - else - echo "Open file soft limit is $soft (target: $requested, hard: $hard)." - fi -} - -raise_open_file_limit - -# Copy all contents from persistent /per to root directory (/) without overwriting -cp -r --no-preserve=ownership,mode /per/* / - -# Ensure upload storage exists before API and connector callers can reference it. -mkdir -p /a0/usr/uploads - -# allow execution of /root/.bashrc and /root/.profile -chmod 444 /root/.bashrc -chmod 444 /root/.profile - -# update package list to save time later -apt-get update > /dev/null 2>&1 & - -# let supervisord handle the services -exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf +version https://git-lfs.github.com/spec/v1 +oid sha256:1fc7c1d54b3d7e6174087f9b63e4b73fc87fd836dc159e544349d73601441d5b +size 1774 diff --git a/docker/run/fs/exe/node_eval.js b/docker/run/fs/exe/node_eval.js index 6fdbfbf8cb79797134f39c04e19af89c260a6397..fc806beeddb99971beb0322aeadfc5a0061f4730 100644 --- a/docker/run/fs/exe/node_eval.js +++ b/docker/run/fs/exe/node_eval.js @@ -1,62 +1,3 @@ -#!/usr/bin/env node - -const vm = require('vm'); -const path = require('path'); -const Module = require('module'); - -// Enhance `require` to search CWD first, then globally -function customRequire(moduleName) { - try { - // Try resolving from CWD's node_modules using Node's require.resolve - const cwdPath = require.resolve(moduleName, { paths: [path.join(process.cwd(), 'node_modules')] }); - // console.log("resolved path:", cwdPath); - return require(cwdPath); - } catch (cwdErr) { - try { - // Try resolving as a global module - return require(moduleName); - } catch (globalErr) { - console.error(`Cannot find module: ${moduleName}`); - throw globalErr; - } - } -} - -// Create the VM context -const context = vm.createContext({ - ...global, - require: customRequire, // Use the custom require - __filename: path.join(process.cwd(), 'eval.js'), - __dirname: process.cwd(), - module: { exports: {} }, - exports: module.exports, - console: console, - process: process, - Buffer: Buffer, - setTimeout: setTimeout, - setInterval: setInterval, - setImmediate: setImmediate, - clearTimeout: clearTimeout, - clearInterval: clearInterval, - clearImmediate: clearImmediate, -}); - -// Retrieve the code from the command-line argument -const code = process.argv[2]; - -const wrappedCode = ` - (async function() { - try { - const __result__ = await eval(${JSON.stringify(code)}); - if (__result__ !== undefined) console.log('Out[1]:', __result__); - } catch (error) { - console.error(error); - } - })(); -`; - -vm.runInContext(wrappedCode, context, { - filename: 'eval.js', - lineOffset: -2, - columnOffset: 0, -}).catch(console.error); +version https://git-lfs.github.com/spec/v1 +oid sha256:b6ddc75ed432d14246ac6c5682634d7467ec632368f163530cbcc46b7b8c3499 +size 1659 diff --git a/docker/run/fs/exe/run_A0.sh b/docker/run/fs/exe/run_A0.sh index 350020d7b30a91beae1aacc5c99a3b5086a263da..8104da01450fad899dd6b602178f1f9286465c2c 100644 --- a/docker/run/fs/exe/run_A0.sh +++ b/docker/run/fs/exe/run_A0.sh @@ -1,7 +1,3 @@ -#!/bin/bash - -. "/ins/setup_venv.sh" "$@" -. "/ins/copy_A0.sh" "$@" - -echo "Starting A0 bootstrap manager..." -exec python /exe/self_update_manager.py docker-run-ui +version https://git-lfs.github.com/spec/v1 +oid sha256:bbc42594385f5c3187721ce83b2c69886e707bcfd03acee7fc00f0c6763f5ff0 +size 161 diff --git a/docker/run/fs/exe/run_searxng.sh b/docker/run/fs/exe/run_searxng.sh index bb544186c84b90cc5b843a2514bd598076858a66..e3dd1bbd70cdb2435f593f157636eced183dd724 100644 --- a/docker/run/fs/exe/run_searxng.sh +++ b/docker/run/fs/exe/run_searxng.sh @@ -1,10 +1,3 @@ -#!/bin/bash - -# start webapp -cd /usr/local/searxng/searxng-src -export SEARXNG_SETTINGS_PATH="/etc/searxng/settings.yml" - -# activate venv -source "/usr/local/searxng/searx-pyenv/bin/activate" - -exec python /usr/local/searxng/searxng-src/searx/webapp.py +version https://git-lfs.github.com/spec/v1 +oid sha256:aa30cf09ba3759f0ec369bb7559347d8478e412cd34f46e1be8ab5bcf4ba561f +size 249 diff --git a/docker/run/fs/exe/run_tunnel_api.sh b/docker/run/fs/exe/run_tunnel_api.sh index 88c4ac4e5d9404eccc59ed3ec6da8362dd475fe3..363d91f242888f9e19a84e2050cbda30e715acb7 100644 --- a/docker/run/fs/exe/run_tunnel_api.sh +++ b/docker/run/fs/exe/run_tunnel_api.sh @@ -1,18 +1,3 @@ -#!/bin/bash - -# Wait until run_tunnel.py exists -echo "Starting tunnel API..." - -sleep 1 -while [ ! -f /a0/run_tunnel.py ]; do - echo "Waiting for /a0/run_tunnel.py to be available..." - sleep 1 -done - -. "/ins/setup_venv.sh" "$@" - -exec python /a0/run_tunnel.py \ - --dockerized=true \ - --port=80 \ - --tunnel_api_port=55520 \ - --host="0.0.0.0" +version https://git-lfs.github.com/spec/v1 +oid sha256:1fda7945842d129c82a418731ea0f9f04fc8c196caf19201675375605699a0d3 +size 353 diff --git a/docker/run/fs/exe/self_update_manager.py b/docker/run/fs/exe/self_update_manager.py index c0d008831e20aa63f53e3a6c1b35ea1ee979c038..0ac181fb6a53482d96afc6c152c997745a5f8134 100644 --- a/docker/run/fs/exe/self_update_manager.py +++ b/docker/run/fs/exe/self_update_manager.py @@ -1,1507 +1,3 @@ -#!/usr/bin/env python3 -from __future__ import annotations - -import argparse -import importlib.util -import json -import os -import re -import shutil -import signal -import stat -import subprocess -import sys -import tempfile -import time -import urllib.error -import urllib.request -import zipfile -from datetime import UTC, datetime -from pathlib import Path -from typing import Any - -import yaml - - -OFFICIAL_REPO_URL = os.environ.get( - "A0_SELF_UPDATE_REMOTE_URL", - "https://github.com/agent0ai/agent-zero.git", -) -REPO_DIR = Path("/a0") -TRIGGER_FILE = Path("/exe/a0-self-update.yaml") -STATUS_FILE = Path("/exe/a0-self-update-status.yaml") -LOG_FILE = Path("/exe/a0-self-update.log") -DEFAULT_HEALTH_URL = os.environ.get( - "A0_SELF_UPDATE_HEALTH_URL", - "http://127.0.0.1:80/api/health", -) -DEFAULT_HEALTH_TIMEOUT_SECONDS = int( - os.environ.get("A0_SELF_UPDATE_HEALTH_TIMEOUT_SECONDS", "180") -) -DEFAULT_HEALTH_POLL_INTERVAL_SECONDS = float( - os.environ.get("A0_SELF_UPDATE_HEALTH_POLL_INTERVAL_SECONDS", "2") -) -DEFAULT_BACKUP_DIR = "/root/update-backups" -DEFAULT_BACKUP_CONFLICT_POLICY = "rename" -BACKUP_CONFLICT_POLICIES = {"rename", "overwrite", "fail"} -MIN_SELECTOR_VERSION = (1, 0) -LATEST_SELECTOR_TAG = "latest" -DESKTOP_PROFILE_STATE_RELATIVE_DIRS = ( - Path("usr/plugins/_desktop/profiles"), - Path("usr/_desktop/profiles"), - Path("tmp/_office/desktop/profiles"), -) - - -def now_iso() -> str: - return datetime.now(UTC).isoformat().replace("+00:00", "Z") - - -class AttemptLogger: - def __init__(self, path: Path): - self.path = path - - def reset(self) -> None: - self.path.parent.mkdir(parents=True, exist_ok=True) - self.path.write_text("", encoding="utf-8") - - def log(self, message: str = "") -> None: - line = f"[{now_iso()}] {message}".rstrip() - print(f"[a0-self-update] {message}", flush=True) - with self.path.open("a", encoding="utf-8") as handle: - handle.write(line + "\n") - - def log_block(self, title: str, content: str) -> None: - cleaned = content.rstrip() - self.log(f"{title}:") - if not cleaned: - self.log("(empty)") - return - with self.path.open("a", encoding="utf-8") as handle: - for line in cleaned.splitlines(): - handle.write(f" {line}\n") - - -class NullLogger: - def reset(self) -> None: - return - - def log(self, message: str = "") -> None: - return - - def log_block(self, title: str, content: str) -> None: - return - - -def load_yaml(path: Path) -> dict[str, Any] | None: - if not path.exists(): - return None - loaded = yaml.safe_load(path.read_text(encoding="utf-8")) - return loaded if isinstance(loaded, dict) else None - - -def write_yaml(path: Path, payload: dict[str, Any]) -> None: - path.parent.mkdir(parents=True, exist_ok=True) - path.write_text( - yaml.safe_dump(payload, allow_unicode=True, sort_keys=False), - encoding="utf-8", - ) - - -def write_status(payload: dict[str, Any]) -> None: - write_yaml(STATUS_FILE, payload) - - -def git_output(repo_dir: Path, *args: str) -> str: - completed = subprocess.run( - ["git", "-C", str(repo_dir), *args], - check=True, - text=True, - capture_output=True, - env={**os.environ, "GIT_TERMINAL_PROMPT": "0"}, - ) - return completed.stdout.strip() - - -def normalize_describe_to_version(describe: str) -> str: - match = re.fullmatch(r"(.+)-\d+-g[0-9a-f]+", describe) - if match: - return match.group(1) - return describe - - -def split_describe_version(describe: str) -> tuple[str, int]: - normalized = describe.strip() - match = re.fullmatch(r"(.+)-(\d+)-g[0-9a-f]+", normalized) - if not match: - return normalized, 0 - return match.group(1), int(match.group(2)) - - -def parse_selector_version(tag: str) -> tuple[int, int] | None: - match = re.fullmatch(r"v(\d+)\.(\d+)", tag.strip()) - if not match: - return None - return int(match.group(1)), int(match.group(2)) - - -def is_valid_selector_tag(tag: str) -> bool: - return parse_selector_version(tag) is not None - - -def is_supported_selector_tag(tag: str) -> bool: - parsed = parse_selector_version(tag) - return parsed is not None and parsed >= MIN_SELECTOR_VERSION - - -def sort_selector_supported_tags(tags: list[str]) -> list[str]: - return sorted( - tags, - key=lambda tag: parse_selector_version(tag) or (-1, -1), - reverse=True, - ) - - -def parse_major_version(tag: str) -> int | None: - match = re.fullmatch(r"v(\d+)(?:[.-].*)?", tag.strip()) - if not match: - return None - return int(match.group(1)) - - -def is_latest_selector_tag(tag: str) -> bool: - return tag.strip().lower() == LATEST_SELECTOR_TAG - - -def get_tag_commit_ref(tag: str) -> str: - return f"refs/tags/{tag}^{{commit}}" - - -def build_default_backup_name() -> str: - timestamp = datetime.now(UTC).strftime("%Y%m%d-%H%M%S") - return f"usr-{timestamp}.zip" - - -def normalize_requested_tag(tag: str) -> str: - normalized = (tag or "").strip() - if not normalized: - return LATEST_SELECTOR_TAG - if is_latest_selector_tag(normalized): - return LATEST_SELECTOR_TAG - if not is_valid_selector_tag(normalized): - raise ValueError("Release tag must use the format vX.Y.") - if not is_supported_selector_tag(normalized): - raise ValueError("Release tag must be v1.0 or newer.") - return normalized - - -def normalize_backup_conflict_policy(conflict_policy: str) -> str: - normalized = (conflict_policy or DEFAULT_BACKUP_CONFLICT_POLICY).strip().lower() - if normalized not in BACKUP_CONFLICT_POLICIES: - raise ValueError("Backup conflict policy must be one of: rename, overwrite, fail.") - return normalized - - -def get_latest_same_major_tag( - repo_dir: Path, - *, - branch_ref: str, - current_version: str, -) -> str: - current_major = parse_major_version(current_version) - if current_major is None: - raise RuntimeError( - f"Could not determine the installed major version from {current_version}. " - "Use an explicit tag instead of latest." - ) - - output = git_output(repo_dir, "tag", "--merged", branch_ref) - same_major_tags = [ - tag - for tag in (line.strip() for line in output.splitlines()) - if is_supported_selector_tag(tag) and parse_major_version(tag) == current_major - ] - if not same_major_tags: - raise RuntimeError( - f"No v{current_major}.x release tags are reachable from branch " - f"{branch_ref.rsplit('/', 1)[-1]}." - ) - return sort_selector_supported_tags(same_major_tags)[0] - - -def ensure_latest_target_matches_current_major( - *, - branch: str, - current_version: str, - target_version: str, -) -> None: - current_major = parse_major_version(current_version) - if current_major is None: - raise RuntimeError( - f"Could not determine the installed major version from {current_version}. " - "Use an explicit tag instead of latest." - ) - - target_major = parse_major_version(target_version) - if target_major is None or not is_supported_selector_tag(target_version): - raise RuntimeError( - f"Could not resolve latest on branch {branch} to a supported vX.Y release. " - "Use an explicit tag instead." - ) - - if target_major != current_major: - raise RuntimeError( - f"Latest on branch {branch} resolves to {target_version}, but the installed " - f"version is {current_version}. Use an explicit tag to change major versions." - ) - - -def get_repo_version_info(repo_dir: Path) -> dict[str, str]: - describe = git_output(repo_dir, "describe", "--tags", "--always") - commit = git_output(repo_dir, "rev-parse", "HEAD") - branch = git_optional_output(repo_dir, "branch", "--show-current") - return { - "branch": branch, - "describe": describe, - "short_tag": normalize_describe_to_version(describe), - "commit": commit, - "short_commit": commit[:7], - } - - -def git_optional_output(repo_dir: Path, *args: str) -> str: - completed = subprocess.run( - ["git", "-C", str(repo_dir), *args], - check=False, - text=True, - capture_output=True, - env={**os.environ, "GIT_TERMINAL_PROMPT": "0"}, - ) - if completed.returncode != 0: - return "" - return completed.stdout.strip() - - -def remove_path(path: Path) -> None: - if path.is_symlink() or path.is_file(): - path.unlink(missing_ok=True) - return - if path.exists(): - shutil.rmtree(path) - - -def get_repo_relative_path(repo_dir: Path, path: Path) -> str | None: - try: - return path.resolve().relative_to(repo_dir.resolve()).as_posix() - except ValueError: - return None - - -def sanitize_filename(name: str, default_name: str) -> str: - raw = (name or "").strip() - if not raw: - raw = default_name - raw = Path(raw).name - raw = re.sub(r"[^A-Za-z0-9._-]+", "-", raw).strip(".-") or default_name - if not raw.lower().endswith(".zip"): - raw = f"{raw}.zip" - return raw - - -def resolve_backup_destination( - directory: Path, - filename: str, - conflict_policy: str, -) -> Path: - normalized_policy = conflict_policy.strip().lower() - directory.mkdir(parents=True, exist_ok=True) - destination = directory / filename - if not destination.exists(): - return destination - - if normalized_policy == "overwrite": - remove_path(destination) - return destination - if normalized_policy == "fail": - raise FileExistsError(f"Backup file already exists: {destination}") - if normalized_policy != "rename": - raise ValueError("backup_conflict_policy must be rename, overwrite, or fail.") - - stem = destination.stem - suffix = destination.suffix - index = 2 - while True: - candidate = directory / f"{stem}-{index}{suffix}" - if not candidate.exists(): - return candidate - index += 1 - - -def create_usr_backup( - *, - repo_dir: Path, - backup_path: str, - backup_name: str, - conflict_policy: str, - logger: AttemptLogger, -) -> Path: - usr_dir = repo_dir / "usr" - if not usr_dir.exists(): - raise FileNotFoundError(f"User directory not found: {usr_dir}") - - destination_dir = Path(backup_path) - if not destination_dir.is_absolute(): - destination_dir = (repo_dir / destination_dir).resolve() - else: - destination_dir = destination_dir.resolve() - destination_name = sanitize_filename(backup_name, "agent-zero-usr-backup.zip") - destination = resolve_backup_destination(destination_dir, destination_name, conflict_policy) - - temp_fd, temp_path = tempfile.mkstemp(suffix=".zip") - os.close(temp_fd) - temporary_backup = Path(temp_path) - - try: - with zipfile.ZipFile( - temporary_backup, - "w", - compression=zipfile.ZIP_DEFLATED, - compresslevel=6, - ) as archive: - for root, dirs, files in os.walk(usr_dir): - root_path = Path(root) - root_relative = root_path.relative_to(usr_dir) - dirs[:] = [ - dirname - for dirname in dirs - if not should_exclude_from_usr_backup( - root_relative / dirname, - logger, - ) - ] - for filename in files: - source_file = root_path / filename - if not should_include_usr_backup_entry(source_file, logger): - continue - archive_name = Path("usr") / source_file.relative_to(usr_dir) - try: - archive.write(source_file, archive_name.as_posix()) - except FileNotFoundError: - logger.log(f"Skipping vanished usr backup entry: {source_file}") - except OSError as exc: - logger.log(f"Skipping usr backup entry after read error: {source_file}: {exc}") - - destination.parent.mkdir(parents=True, exist_ok=True) - shutil.move(str(temporary_backup), str(destination)) - logger.log(f"Created usr backup at {destination}") - return destination - finally: - if temporary_backup.exists(): - temporary_backup.unlink(missing_ok=True) - - -def should_exclude_from_usr_backup( - relative_dir: Path, - logger: AttemptLogger, -) -> bool: - parts = relative_dir.parts - if parts and parts[0] == ".time_travel": - logger.log( - f"Skipping Time Travel history during usr backup: {Path('usr') / relative_dir}" - ) - return True - if ( - len(parts) >= 6 - and parts[0] == "plugins" - and parts[1] == "_desktop" - and parts[2] == "profiles" - and parts[-2] == ".ssh" - and parts[-1] == "agent" - ): - logger.log(f"Skipping transient usr backup directory: {Path('usr') / relative_dir}") - return True - return False - - -def should_include_usr_backup_entry(source_file: Path, logger: AttemptLogger) -> bool: - try: - source_stat = source_file.lstat() - except FileNotFoundError: - logger.log(f"Skipping vanished usr backup entry: {source_file}") - return False - except OSError as exc: - logger.log(f"Skipping unreadable usr backup entry: {source_file}: {exc}") - return False - - if stat.S_ISLNK(source_stat.st_mode): - try: - target_stat = source_file.stat() - except FileNotFoundError: - logger.log(f"Skipping broken symlink during usr backup: {source_file}") - return False - except OSError as exc: - logger.log( - f"Skipping unreadable symlink target during usr backup: {source_file}: {exc}" - ) - return False - if not stat.S_ISREG(target_stat.st_mode): - logger.log( - f"Skipping non-regular symlink target during usr backup: {source_file}" - ) - return False - return True - - if not stat.S_ISREG(source_stat.st_mode): - logger.log(f"Skipping non-regular usr backup entry: {source_file}") - return False - - return True - - -def clean_transient_desktop_agent_state( - repo_dir: Path, - logger: AttemptLogger, -) -> None: - profile_roots = 0 - removed = 0 - for relative_root in DESKTOP_PROFILE_STATE_RELATIVE_DIRS: - profile_root = repo_dir / relative_root - if not _is_cleanup_directory( - profile_root, - logger, - "Desktop profile state", - missing_ok=True, - ): - continue - profile_roots += 1 - try: - profiles = list(profile_root.iterdir()) - except OSError as exc: - logger.log(f"Desktop profile state could not be listed: {profile_root}: {exc}") - continue - for profile_dir in profiles: - if not _is_cleanup_directory(profile_dir, logger, "Desktop profile"): - continue - removed += _clean_directory_entries( - profile_dir / ".ssh" / "agent", - logger, - label="desktop SSH agent", - ) - removed += _clean_gnupg_agent_entries(profile_dir / ".gnupg", logger) - - if removed: - logger.log(f"Removed {removed} transient desktop agent entries.") - elif profile_roots: - logger.log("Transient desktop agent state already clean.") - else: - logger.log("No desktop profile runtime state found, skipping transient agent cleanup.") - - -def _clean_gnupg_agent_entries(gnupg_dir: Path, logger: AttemptLogger) -> int: - if not _is_cleanup_directory(gnupg_dir, logger, "desktop GnuPG state", missing_ok=True): - return 0 - try: - entries = list(gnupg_dir.iterdir()) - except OSError as exc: - logger.log(f"Desktop GnuPG state could not be listed: {gnupg_dir}: {exc}") - return 0 - - removed = 0 - for entry in entries: - if not entry.name.startswith("S.gpg-agent"): - continue - try: - entry_stat = entry.lstat() - except FileNotFoundError: - continue - except OSError as exc: - logger.log(f"Skipping transient desktop GnuPG agent entry after stat error: {entry}: {exc}") - continue - if stat.S_ISREG(entry_stat.st_mode): - continue - if _remove_cleanup_entry(entry, entry_stat, logger, label="desktop GnuPG agent"): - removed += 1 - return removed - - -def _clean_directory_entries(directory: Path, logger: AttemptLogger, *, label: str) -> int: - if not _is_cleanup_directory(directory, logger, label, missing_ok=True): - return 0 - try: - entries = list(directory.iterdir()) - except OSError as exc: - logger.log(f"Transient {label} directory could not be listed: {directory}: {exc}") - return 0 - - removed = 0 - for entry in entries: - try: - entry_stat = entry.lstat() - except FileNotFoundError: - continue - except OSError as exc: - logger.log(f"Skipping transient {label} entry after stat error: {entry}: {exc}") - continue - if _remove_cleanup_entry(entry, entry_stat, logger, label=label): - removed += 1 - return removed - - -def _is_cleanup_directory( - directory: Path, - logger: AttemptLogger, - label: str, - *, - missing_ok: bool = False, -) -> bool: - try: - directory_stat = directory.lstat() - except FileNotFoundError: - if not missing_ok: - logger.log(f"{label} directory not found, skipping: {directory}") - return False - except OSError as exc: - logger.log(f"{label} directory could not be inspected: {directory}: {exc}") - return False - - if stat.S_ISLNK(directory_stat.st_mode) or not stat.S_ISDIR(directory_stat.st_mode): - logger.log(f"{label} path is not a directory, skipping: {directory}") - return False - return True - - -def _remove_cleanup_entry( - entry: Path, - entry_stat: os.stat_result, - logger: AttemptLogger, - *, - label: str, -) -> bool: - try: - if stat.S_ISDIR(entry_stat.st_mode): - shutil.rmtree(entry) - else: - entry.unlink(missing_ok=True) - return True - except FileNotFoundError: - return False - except OSError as exc: - logger.log(f"Skipping transient {label} entry after error: {entry}: {exc}") - return False - - -def run_command( - command: list[str], - *, - cwd: Path | None, - logger: AttemptLogger, - error_message: str | None = None, -) -> subprocess.CompletedProcess[str]: - logger.log(f"$ {' '.join(command)}") - completed = subprocess.run( - command, - cwd=cwd, - text=True, - capture_output=True, - env={**os.environ, "GIT_TERMINAL_PROMPT": "0"}, - ) - if completed.stdout: - logger.log_block("stdout", completed.stdout) - if completed.stderr: - logger.log_block("stderr", completed.stderr) - if completed.returncode != 0: - raise RuntimeError( - error_message - or f"Command failed with exit code {completed.returncode}: {' '.join(command)}" - ) - return completed - - -def clean_uv_cache(logger: AttemptLogger) -> None: - uv_path = shutil.which("uv") - if not uv_path: - logger.log("uv executable not found, skipping uv cache clean.") - return - - logger.log("Cleaning uv cache before continuing self-update startup.") - try: - run_command( - [uv_path, "cache", "clean"], - cwd=None, - logger=logger, - error_message="Failed to clean uv cache during self-update.", - ) - except Exception as exc: - logger.log(f"uv cache clean skipped after error: {exc}") - - -def refresh_codex_cli(logger: AttemptLogger) -> None: - codex_path = shutil.which("codex") - if not codex_path: - logger.log("Codex CLI not installed, skipping Codex refresh.") - return - - npm_path = shutil.which("npm") - if not npm_path: - logger.log("npm executable not found, skipping Codex refresh.") - return - - logger.log("Refreshing the installed Codex CLI after self-update.") - try: - run_command( - [npm_path, "install", "--global", "@openai/codex@latest"], - cwd=None, - logger=logger, - error_message="Failed to refresh the installed Codex CLI.", - ) - except Exception as exc: - logger.log(f"Codex CLI refresh skipped after error: {exc}") - - -def has_local_rollback_changes(repo_dir: Path) -> bool: - status = git_output(repo_dir, "status", "--porcelain=v1", "--untracked-files=all") - return bool(status.strip()) - - -def get_top_stash_ref(repo_dir: Path) -> str: - return git_optional_output(repo_dir, "stash", "list", "--format=%gd", "-n", "1") - - -def create_rollback_stash(repo_dir: Path, logger: AttemptLogger) -> str | None: - if not has_local_rollback_changes(repo_dir): - logger.log("No tracked or non-ignored untracked changes need rollback protection.") - return None - - previous_top = get_top_stash_ref(repo_dir) - message = f"a0-self-update rollback snapshot {now_iso()}" - run_command( - [ - "git", - "-C", - str(repo_dir), - "stash", - "push", - "--include-untracked", - "--message", - message, - ], - cwd=None, - logger=logger, - error_message="Failed to save local tracked/untracked changes before updating.", - ) - stash_ref = get_top_stash_ref(repo_dir) - if not stash_ref or stash_ref == previous_top: - raise RuntimeError("Failed to create the pre-update rollback stash.") - logger.log( - f"Saved local tracked/untracked changes into {stash_ref}. " - "Ignored files stay in place and are not stashed." - ) - return stash_ref - - -def drop_stash(repo_dir: Path, stash_ref: str, logger: AttemptLogger) -> None: - if not stash_ref: - return - run_command( - ["git", "-C", str(repo_dir), "stash", "drop", stash_ref], - cwd=None, - logger=logger, - error_message=f"Failed to drop temporary rollback stash {stash_ref}.", - ) - - -def apply_stash(repo_dir: Path, stash_ref: str, logger: AttemptLogger) -> None: - if not stash_ref: - return - run_command( - ["git", "-C", str(repo_dir), "stash", "apply", "--index", stash_ref], - cwd=None, - logger=logger, - error_message=( - f"Failed to restore local tracked/untracked changes from {stash_ref}. " - "The stash entry has been kept so it can be recovered manually." - ), - ) - try: - drop_stash(repo_dir, stash_ref, logger) - except Exception as exc: - logger.log( - f"Rollback stash {stash_ref} was restored but could not be dropped automatically: {exc}" - ) - - -def clean_repo_worktree( - repo_dir: Path, - logger: AttemptLogger, - *, - exclude_paths: list[Path] | None = None, -) -> None: - command = ["git", "-C", str(repo_dir), "clean", "-ffd"] - for path in exclude_paths or []: - relative_path = get_repo_relative_path(repo_dir, path) - if relative_path: - command.extend(["-e", relative_path]) - run_command( - command, - cwd=None, - logger=logger, - error_message="Failed to remove leftover non-ignored files after checkout.", - ) - - -def fetch_release_refs(repo_dir: Path, branch: str, tag: str, logger: AttemptLogger) -> None: - remote_branch_ref = f"refs/remotes/a0-self-update/{branch}" - tag_commit_ref = get_tag_commit_ref(tag) - logger.log(f"Fetching branch {branch} and tag {tag} from {OFFICIAL_REPO_URL}") - run_command( - [ - "git", - "-C", - str(repo_dir), - "fetch", - "--force", - OFFICIAL_REPO_URL, - f"+refs/heads/{branch}:{remote_branch_ref}", - f"+refs/tags/{tag}:refs/tags/{tag}", - ], - cwd=None, - logger=logger, - error_message=f"Failed to fetch branch {branch} and tag {tag} from the official repository.", - ) - run_command( - [ - "git", - "-C", - str(repo_dir), - "merge-base", - "--is-ancestor", - tag_commit_ref, - remote_branch_ref, - ], - cwd=None, - logger=logger, - error_message=f"Requested tag {tag} is not reachable from official branch {branch}.", - ) - - -def fetch_branch_refs(repo_dir: Path, branch: str, logger: AttemptLogger) -> str: - remote_branch_ref = f"refs/remotes/a0-self-update/{branch}" - logger.log(f"Fetching branch {branch} and tags from {OFFICIAL_REPO_URL}") - run_command( - [ - "git", - "-C", - str(repo_dir), - "fetch", - "--force", - "--tags", - OFFICIAL_REPO_URL, - f"+refs/heads/{branch}:{remote_branch_ref}", - ], - cwd=None, - logger=logger, - error_message=f"Failed to fetch branch {branch} from the official repository.", - ) - return remote_branch_ref - - -def resolve_requested_target( - repo_dir: Path, - branch: str, - tag: str, - current_version: str, - logger: AttemptLogger, -) -> dict[str, str]: - normalized_tag = tag.strip() - - if not is_latest_selector_tag(normalized_tag): - fetch_release_refs(repo_dir, branch, normalized_tag, logger) - tag_commit_ref = get_tag_commit_ref(normalized_tag) - return { - "requested_tag": normalized_tag, - "effective_tag": normalized_tag, - "target_ref": f"refs/tags/{normalized_tag}", - "expected_short_tag": normalized_tag, - "expected_commit": git_output(repo_dir, "rev-parse", tag_commit_ref), - "target_description": f"tag {normalized_tag}", - } - - remote_branch_ref = fetch_branch_refs(repo_dir, branch, logger) - if branch == "main": - effective_tag = get_latest_same_major_tag( - repo_dir, - branch_ref=remote_branch_ref, - current_version=current_version, - ) - tag_commit_ref = get_tag_commit_ref(effective_tag) - logger.log(f"Resolved latest on main to tag {effective_tag}") - return { - "requested_tag": LATEST_SELECTOR_TAG, - "effective_tag": effective_tag, - "target_ref": f"refs/tags/{effective_tag}", - "expected_short_tag": effective_tag, - "expected_commit": git_output(repo_dir, "rev-parse", tag_commit_ref), - "target_description": f"latest tag {effective_tag}", - } - - head_describe = git_output(repo_dir, "describe", "--tags", "--always", remote_branch_ref) - head_short_tag = normalize_describe_to_version(head_describe) - head_commit = git_output(repo_dir, "rev-parse", remote_branch_ref) - ensure_latest_target_matches_current_major( - branch=branch, - current_version=current_version, - target_version=head_short_tag, - ) - logger.log( - f"Resolved latest on branch {branch} to commit {head_commit[:7]} ({head_describe})" - ) - return { - "requested_tag": LATEST_SELECTOR_TAG, - "effective_tag": head_short_tag, - "target_ref": remote_branch_ref, - "expected_short_tag": head_short_tag, - "expected_commit": head_commit, - "target_description": f"latest branch state {head_describe}", - } - - -def checkout_target_release( - repo_dir: Path, - branch: str, - target_ref: str, - target_description: str, - logger: AttemptLogger, - *, - exclude_paths: list[Path] | None = None, -) -> None: - logger.log(f"Checking out branch {branch} at {target_description}") - run_command( - [ - "git", - "-C", - str(repo_dir), - "checkout", - "-B", - branch, - target_ref, - ], - cwd=None, - logger=logger, - error_message=f"Failed to check out requested {target_description} on branch {branch}.", - ) - clean_repo_worktree(repo_dir, logger, exclude_paths=exclude_paths) - - -def restore_git_state( - repo_dir: Path, - *, - head: str, - branch: str, - logger: AttemptLogger, - exclude_paths: list[Path] | None = None, -) -> None: - logger.log(f"Restoring repository state to commit {head}") - if branch: - run_command( - [ - "git", - "-C", - str(repo_dir), - "checkout", - "-B", - branch, - head, - ], - cwd=None, - logger=logger, - error_message=f"Failed to restore branch {branch} to commit {head}.", - ) - else: - run_command( - [ - "git", - "-C", - str(repo_dir), - "checkout", - "--detach", - head, - ], - cwd=None, - logger=logger, - error_message=f"Failed to restore detached HEAD at commit {head}.", - ) - clean_repo_worktree(repo_dir, logger, exclude_paths=exclude_paths) - - -def launch_ui_process(repo_dir: Path, logger: AttemptLogger) -> subprocess.Popen[bytes]: - run_office_cleanup_hook(repo_dir, logger) - - prepare_script = repo_dir / "prepare.py" - if prepare_script.exists(): - logger.log("Running prepare.py before UI start") - run_command([sys.executable, str(prepare_script), "--dockerized=true"], cwd=repo_dir, logger=logger) - else: - logger.log("prepare.py not found, skipping prepare step") - - logger.log("Starting Agent Zero UI") - return subprocess.Popen( - [ - sys.executable, - str(repo_dir / "run_ui.py"), - "--dockerized=true", - "--port=80", - "--host=0.0.0.0", - ], - cwd=repo_dir, - ) - - -def run_office_cleanup_hook(repo_dir: Path, logger: AttemptLogger) -> None: - hook_path = repo_dir / "plugins" / "_office" / "hooks.py" - if not hook_path.exists(): - return - try: - if str(repo_dir) not in sys.path: - sys.path.insert(0, str(repo_dir)) - spec = importlib.util.spec_from_file_location("a0_office_hooks", hook_path) - if spec is None or spec.loader is None: - logger.log("Office cleanup hook could not be loaded.") - return - module = importlib.util.module_from_spec(spec) - spec.loader.exec_module(module) - cleanup = getattr(module, "cleanup_stale_runtime_state", None) - if not callable(cleanup): - return - result = cleanup() - if isinstance(result, dict) and result.get("errors"): - logger.log(f"Office cleanup hook reported errors: {result.get('errors')}") - else: - logger.log("Office cleanup hook completed.") - except Exception as exc: - logger.log(f"Office cleanup hook skipped after error: {exc}") - - -def wait_for_health( - process: subprocess.Popen[bytes], - *, - health_url: str, - timeout_seconds: int, - poll_interval_seconds: float, - expected_version: str | None = None, - expected_commit: str | None = None, - logger: AttemptLogger, -) -> tuple[bool, dict[str, Any] | str]: - deadline = time.monotonic() + timeout_seconds - last_error = "Health check did not return a successful response." - - while time.monotonic() < deadline: - if process.poll() is not None: - return ( - False, - f"UI process exited with code {process.returncode} before passing the health check.", - ) - try: - request = urllib.request.Request( - health_url, - headers={"Cache-Control": "no-cache"}, - method="GET", - ) - with urllib.request.urlopen(request, timeout=5) as response: - body = response.read().decode("utf-8") - payload = json.loads(body) if body else {} - git_info = payload.get("gitinfo") or {} - current_version = (git_info.get("short_tag") or "").strip() - current_commit = (git_info.get("commit_hash") or "").strip() - if expected_commit and current_commit and current_commit != expected_commit: - last_error = ( - f"Health check responded, but commit {current_commit} does not match " - f"expected {expected_commit}." - ) - elif expected_version and current_version and current_version != expected_version: - last_error = ( - f"Health check responded, but version {current_version} does not match " - f"expected {expected_version}." - ) - elif response.status == 200: - logger.log(f"Health check passed at {health_url}") - return True, payload - except (urllib.error.URLError, TimeoutError, ValueError, json.JSONDecodeError) as exc: - last_error = str(exc) - - time.sleep(poll_interval_seconds) - - return False, last_error - - -def terminate_process(process: subprocess.Popen[bytes], timeout_seconds: int = 20) -> None: - if process.poll() is not None: - return - process.terminate() - try: - process.wait(timeout=timeout_seconds) - except subprocess.TimeoutExpired: - process.kill() - process.wait(timeout=5) - - -def wait_for_process(process: subprocess.Popen[bytes]) -> int: - def forward_signal(signum, _frame) -> None: - if process.poll() is None: - process.send_signal(signum) - - for sig in (signal.SIGTERM, signal.SIGINT): - try: - signal.signal(sig, forward_signal) - except ValueError: - pass - - return process.wait() - - -def record_result( - *, - status: str, - message: str, - request_data: dict[str, Any], - source_info: dict[str, str], - current_version: str, - started_at: str, - backup_zip_path: str = "", - rollback_applied: bool = False, - error: str = "", -) -> None: - payload: dict[str, Any] = { - "status": status, - "message": message, - "branch": str(request_data.get("branch", "")), - "tag": str(request_data.get("tag", "")), - "source_version": source_info["short_tag"], - "source_commit": source_info["commit"], - "current_version": current_version, - "requested_at": str(request_data.get("requested_at", "")), - "started_at": started_at, - "finished_at": now_iso(), - "log_file_path": str(LOG_FILE), - "update_file_path": str(TRIGGER_FILE), - "rollback_applied": rollback_applied, - } - if backup_zip_path: - payload["backup_zip_path"] = backup_zip_path - if error: - payload["error"] = error - write_status(payload) - - -def execute_pending_update( - request_data: dict[str, Any], - *, - logger: AttemptLogger, -) -> subprocess.Popen[bytes]: - source_info = get_repo_version_info(REPO_DIR) - started_at = now_iso() - backup_zip_path = "" - stash_ref: str | None = None - repository_changed = False - branch = str(request_data.get("branch", "")).strip() - tag = str(request_data.get("tag", "")).strip() - backup_exclusions: list[Path] = [] - resolved_target: dict[str, str] | None = None - - try: - if not branch: - raise ValueError("Update file is missing the branch field.") - if not tag: - raise ValueError("Update file is missing the tag field.") - - stash_ref = create_rollback_stash(REPO_DIR, logger) - - if bool(request_data.get("backup_usr", True)): - backup_destination = create_usr_backup( - repo_dir=REPO_DIR, - backup_path=str(request_data.get("backup_path", "/root/update-backups")), - backup_name=str(request_data.get("backup_name", "agent-zero-usr-backup.zip")), - conflict_policy=str(request_data.get("backup_conflict_policy", "rename")), - logger=logger, - ) - backup_zip_path = str(backup_destination) - backup_exclusions.append(backup_destination) - - resolved_target = resolve_requested_target( - REPO_DIR, - branch, - tag, - source_info["short_tag"], - logger, - ) - - repository_changed = True - logger.log( - "Applying the requested release with native Git checkout. " - "Ignored files remain untouched; tracked files and non-ignored leftovers are replaced." - ) - checkout_target_release( - REPO_DIR, - branch, - resolved_target["target_ref"], - resolved_target["target_description"], - logger, - exclude_paths=backup_exclusions, - ) - - current_info = get_repo_version_info(REPO_DIR) - if resolved_target.get("expected_commit") and current_info["commit"] != resolved_target["expected_commit"]: - raise RuntimeError( - "Git checkout completed but the repository commit does not match the requested target. " - f"Expected {resolved_target['expected_commit']}, got {current_info['commit']}." - ) - if resolved_target.get("expected_short_tag") and current_info["short_tag"] != resolved_target["expected_short_tag"]: - raise RuntimeError( - "Git checkout completed but the repository version does not match the requested tag. " - f"Expected {resolved_target['expected_short_tag']}, got {current_info['short_tag']}." - ) - - updated_process = launch_ui_process(REPO_DIR, logger) - healthy, details = wait_for_health( - updated_process, - health_url=DEFAULT_HEALTH_URL, - timeout_seconds=DEFAULT_HEALTH_TIMEOUT_SECONDS, - poll_interval_seconds=DEFAULT_HEALTH_POLL_INTERVAL_SECONDS, - expected_version=resolved_target.get("expected_short_tag"), - expected_commit=resolved_target.get("expected_commit"), - logger=logger, - ) - if healthy: - refresh_codex_cli(logger) - record_result( - status="success", - message=f"Updated Agent Zero to branch {branch}, {resolved_target['target_description']}.", - request_data=request_data, - source_info=source_info, - current_version=current_info["short_tag"], - started_at=started_at, - backup_zip_path=backup_zip_path, - rollback_applied=False, - ) - if stash_ref: - logger.log( - f"Update succeeded, dropping temporary rollback stash {stash_ref}. " - "Tracked and non-ignored local changes were not reapplied." - ) - try: - drop_stash(REPO_DIR, stash_ref, logger) - except Exception as exc: - logger.log( - f"Temporary rollback stash {stash_ref} could not be dropped automatically: {exc}" - ) - return updated_process - - logger.log(f"Updated UI failed health check, rolling back: {details}") - terminate_process(updated_process) - restore_git_state( - REPO_DIR, - head=source_info["commit"], - branch=source_info.get("branch", ""), - logger=logger, - exclude_paths=backup_exclusions, - ) - apply_stash(REPO_DIR, stash_ref or "", logger) - stash_ref = None - - rollback_process = launch_ui_process(REPO_DIR, logger) - rollback_healthy, rollback_details = wait_for_health( - rollback_process, - health_url=DEFAULT_HEALTH_URL, - timeout_seconds=DEFAULT_HEALTH_TIMEOUT_SECONDS, - poll_interval_seconds=DEFAULT_HEALTH_POLL_INTERVAL_SECONDS, - expected_version=source_info["short_tag"], - logger=logger, - ) - - if rollback_healthy: - record_result( - status="rolled_back", - message=( - "Updated version failed its health check and the previous version was restored. " - f"Reason: {details}" - ), - request_data=request_data, - source_info=source_info, - current_version=source_info["short_tag"], - started_at=started_at, - backup_zip_path=backup_zip_path, - rollback_applied=True, - error=str(details), - ) - return rollback_process - - terminate_process(rollback_process) - record_result( - status="rollback_failed", - message=( - "Updated version failed its health check and rollback also failed to become healthy." - ), - request_data=request_data, - source_info=source_info, - current_version=source_info["short_tag"], - started_at=started_at, - backup_zip_path=backup_zip_path, - rollback_applied=True, - error=f"Update error: {details}. Rollback error: {rollback_details}", - ) - raise RuntimeError(str(rollback_details)) - except Exception as exc: - restore_error = "" - if repository_changed or stash_ref: - logger.log(f"Restoring pre-update repository state after error: {exc}") - try: - restore_git_state( - REPO_DIR, - head=source_info["commit"], - branch=source_info.get("branch", ""), - logger=logger, - exclude_paths=backup_exclusions, - ) - if stash_ref: - apply_stash(REPO_DIR, stash_ref, logger) - stash_ref = None - except Exception as restore_exc: - restore_error = str(restore_exc) - logger.log(f"Automatic restore failed: {restore_exc}") - - failure_message = str(exc) - if restore_error: - failure_message = f"{failure_message} | Restore error: {restore_error}" - - failure_status = "failed" - if repository_changed: - failure_status = "rollback_failed" if restore_error else "rolled_back" - - record_result( - status=failure_status, - message=failure_message, - request_data=request_data, - source_info=source_info, - current_version=source_info["short_tag"], - started_at=started_at, - backup_zip_path=backup_zip_path, - rollback_applied=repository_changed, - error=failure_message, - ) - logger.log(f"Update flow failed: {failure_message}") - return launch_ui_process(REPO_DIR, logger) - - -def load_request_file() -> tuple[dict[str, Any] | None, str]: - if not TRIGGER_FILE.exists(): - return None, "" - raw_text = TRIGGER_FILE.read_text(encoding="utf-8") - try: - loaded = yaml.safe_load(raw_text) - return (loaded if isinstance(loaded, dict) else None), raw_text - finally: - TRIGGER_FILE.unlink(missing_ok=True) - - -def queue_update_request( - *, - branch: str = "main", - tag: str = LATEST_SELECTOR_TAG, - backup_usr: bool = True, - backup_path: str = DEFAULT_BACKUP_DIR, - backup_name: str = "", - backup_conflict_policy: str = DEFAULT_BACKUP_CONFLICT_POLICY, -) -> dict[str, Any]: - source_info = get_repo_version_info(REPO_DIR) - normalized_branch = (branch or "").strip().lower() or "main" - normalized_tag = normalize_requested_tag(tag) - normalized_policy = normalize_backup_conflict_policy(backup_conflict_policy) - normalized_backup_path = (backup_path or "").strip() or DEFAULT_BACKUP_DIR - normalized_backup_name = sanitize_filename( - backup_name, - build_default_backup_name(), - ) - - payload = { - "branch": normalized_branch, - "tag": normalized_tag, - "source_version": source_info["short_tag"], - "source_describe": source_info["describe"], - "source_commit": source_info["commit"], - "requested_at": now_iso(), - "backup_usr": bool(backup_usr), - "backup_path": normalized_backup_path, - "backup_name": normalized_backup_name, - "backup_conflict_policy": normalized_policy, - } - write_yaml(TRIGGER_FILE, payload) - return payload - - -def installed_target_matches_request( - current_info: dict[str, str], - *, - requested_branch: str, - requested_tag: str, -) -> bool: - normalized_tag = requested_tag.strip() - if not normalized_tag or is_latest_selector_tag(normalized_tag): - return False - - current_branch = current_info.get("branch", "").strip() - if requested_branch.strip() and current_branch != requested_branch.strip(): - return False - - return current_info.get("describe", "").strip() == normalized_tag - - -def trigger_update_command(args: list[str]) -> int: - parser = argparse.ArgumentParser( - prog="trigger_self_update.sh", - description="Queue an Agent Zero self-update for the next startup attempt.", - ) - parser.add_argument( - "branch", - nargs="?", - default="main", - help="Target official branch. Default: main", - ) - parser.add_argument( - "tag", - nargs="?", - default=LATEST_SELECTOR_TAG, - help='Target release tag such as v1.10 or "latest". Default: latest', - ) - parser.add_argument( - "--backup-dir", - default=DEFAULT_BACKUP_DIR, - help=f"Directory for the usr backup zip. Default: {DEFAULT_BACKUP_DIR}", - ) - parser.add_argument( - "--backup-name", - default="", - help="Backup zip filename. Default: autogenerated usr-YYYYMMDD-HHMMSS.zip", - ) - parser.add_argument( - "--backup-conflict-policy", - default=DEFAULT_BACKUP_CONFLICT_POLICY, - choices=sorted(BACKUP_CONFLICT_POLICIES), - help="How to handle an existing backup zip. Default: rename", - ) - parser.add_argument( - "--no-backup", - action="store_true", - help="Skip creating a usr backup before the update.", - ) - parsed = parser.parse_args(args) - - try: - payload = queue_update_request( - branch=parsed.branch, - tag=parsed.tag, - backup_usr=not parsed.no_backup, - backup_path=parsed.backup_dir, - backup_name=parsed.backup_name, - backup_conflict_policy=parsed.backup_conflict_policy, - ) - except Exception as exc: - print(f"Failed to queue self-update: {exc}", file=sys.stderr) - return 1 - - print("Queued Agent Zero self-update for the next startup attempt.") - print(f"Branch: {payload['branch']}") - print(f"Version: {payload['tag']}") - if payload["backup_usr"]: - print(f"Backup dir: {payload['backup_path']}") - print(f"Backup name: {payload['backup_name']}") - print(f"Backup conflict policy: {payload['backup_conflict_policy']}") - else: - print("Backup: disabled") - print(f"Trigger file: {TRIGGER_FILE}") - print(f"Log file: {LOG_FILE}") - print("Restart the container or Agent Zero process to apply it.") - return 0 - - -def docker_run_ui() -> int: - request_data, raw_text = load_request_file() - logger = AttemptLogger(LOG_FILE) - quiet_logger = NullLogger() - - if request_data: - logger.reset() - logger.log(f"Consumed update file at {TRIGGER_FILE}") - logger.log_block("Trigger file content", raw_text) - clean_uv_cache(logger) - try: - clean_transient_desktop_agent_state(REPO_DIR, logger) - except Exception as exc: - logger.log(f"Transient desktop agent cleanup skipped after error: {exc}") - - try: - current = get_repo_version_info(REPO_DIR) - requested_branch = str(request_data.get("branch", "")).strip() - requested_tag = str(request_data.get("tag", "")).strip() - if installed_target_matches_request( - current, - requested_branch=requested_branch, - requested_tag=requested_tag, - ): - logger.log( - "Requested tag already matches the installed version, skipping file replacement." - ) - refresh_codex_cli(logger) - record_result( - status="skipped", - message="Requested tag already matches the installed version.", - request_data=request_data, - source_info=current, - current_version=current["short_tag"], - started_at=now_iso(), - rollback_applied=False, - ) - process = launch_ui_process(REPO_DIR, logger) - else: - process = execute_pending_update(request_data, logger=logger) - except Exception as exc: - logger.log(f"Self-update bootstrap failed unexpectedly: {exc}") - process = launch_ui_process(REPO_DIR, logger) - elif raw_text: - logger.reset() - logger.log(f"Consumed invalid update file at {TRIGGER_FILE}") - logger.log_block("Trigger file content", raw_text) - source_info = get_repo_version_info(REPO_DIR) - record_result( - status="failed", - message="Update file was not valid YAML.", - request_data={}, - source_info=source_info, - current_version=source_info["short_tag"], - started_at=now_iso(), - rollback_applied=False, - error="Update file was not valid YAML.", - ) - process = launch_ui_process(REPO_DIR, logger) - else: - process = launch_ui_process(REPO_DIR, quiet_logger) - - return wait_for_process(process) - - -def main(argv: list[str] | None = None) -> int: - args = list(argv if argv is not None else sys.argv[1:]) - if not args or args[0] == "docker-run-ui": - return docker_run_ui() - if args[0] == "trigger-update": - return trigger_update_command(args[1:]) - if args[0] == "refresh-codex": - refresh_codex_cli(AttemptLogger(LOG_FILE)) - return 0 - if args[0] in {"-h", "--help"}: - print("Usage: self_update_manager.py [docker-run-ui | trigger-update ... | refresh-codex]") - return 0 - print(f"Unknown command: {args[0]}", file=sys.stderr) - return 1 - - -if __name__ == "__main__": - raise SystemExit(main()) +version https://git-lfs.github.com/spec/v1 +oid sha256:f382c6ca87739be6bd9353616a6edc05a4eeaa0e02a6b7f970cb9f5ee25d90b4 +size 50698 diff --git a/docker/run/fs/exe/supervisor_event_listener.py b/docker/run/fs/exe/supervisor_event_listener.py index 143d589ee856d7b5660b37da92a4927969f0d823..87c3d03d3829970d0afd84a48eec9af779b3b0f6 100644 --- a/docker/run/fs/exe/supervisor_event_listener.py +++ b/docker/run/fs/exe/supervisor_event_listener.py @@ -1,47 +1,3 @@ -#!/usr/bin/python -import sys -import os -import logging -import subprocess -import time - -from supervisor.childutils import listener # type: ignore - - -def main(args): - logging.basicConfig(stream=sys.stderr, level=logging.DEBUG, format='%(asctime)s %(levelname)s %(filename)s: %(message)s') - logger = logging.getLogger("supervisord-watchdog") - debug_mode = True if 'DEBUG' in os.environ else False - - while True: - logger.info("Listening for events...") - headers, body = listener.wait(sys.stdin, sys.stdout) - body = dict([pair.split(":") for pair in body.split(" ")]) - - logger.debug("Headers: %r", repr(headers)) - logger.debug("Body: %r", repr(body)) - logger.debug("Args: %r", repr(args)) - - if debug_mode: - continue - - try: - if headers["eventname"] == "PROCESS_STATE_FATAL": - logger.info("Process entered FATAL state...") - if not args or body["processname"] in args: - logger.error("Killing off supervisord instance ...") - _ = subprocess.call(["/bin/kill", "-15", "1"], stdout=sys.stderr) - logger.info("Sent TERM signal to init process") - time.sleep(5) - logger.critical("Why am I still alive? Send KILL to all processes...") - _ = subprocess.call(["/bin/kill", "-9", "-1"], stdout=sys.stderr) - except Exception as e: - logger.critical("Unexpected Exception: %s", str(e)) - listener.fail(sys.stdout) - exit(1) - else: - listener.ok(sys.stdout) - - -if __name__ == '__main__': - main(sys.argv[1:]) +version https://git-lfs.github.com/spec/v1 +oid sha256:9ff1c038b17944bf5b5d77ce5cce96fde37553a57700f13369716a39250ebb35 +size 1670 diff --git a/docker/run/fs/exe/trigger_self_update.sh b/docker/run/fs/exe/trigger_self_update.sh index de0d1fce07e7f631ae6f258747e8ebabe4af373a..2744c53ec741168ae748015d51a605e9ecf70083 100644 --- a/docker/run/fs/exe/trigger_self_update.sh +++ b/docker/run/fs/exe/trigger_self_update.sh @@ -1,6 +1,3 @@ -#!/bin/sh -set -eu - -SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) - -exec python3 "$SCRIPT_DIR/self_update_manager.py" trigger-update "$@" +version https://git-lfs.github.com/spec/v1 +oid sha256:4d011f44c92f138c0fdc4042fd04bd396f19796a11731b1ed3d5357722ee19fd +size 146 diff --git a/docker/run/fs/ins/copy_A0.sh b/docker/run/fs/ins/copy_A0.sh index 0e5a3632129692bdf869aa5bcd6b5874959dd9ba..e32313261c9614acae94e0b148ff0ce80625377a 100644 --- a/docker/run/fs/ins/copy_A0.sh +++ b/docker/run/fs/ins/copy_A0.sh @@ -1,12 +1,3 @@ -#!/bin/bash -set -e - -# Paths -SOURCE_DIR="/git/agent-zero" -TARGET_DIR="/a0" - -# Copy repository files if run_ui.py is missing in /a0 (if the volume is mounted) -if [ ! -f "$TARGET_DIR/run_ui.py" ]; then - echo "Copying files from $SOURCE_DIR to $TARGET_DIR..." - cp -rn --no-preserve=ownership,mode "$SOURCE_DIR/." "$TARGET_DIR" -fi \ No newline at end of file +version https://git-lfs.github.com/spec/v1 +oid sha256:bb5bc666dfb5c75d664be6c2e87a547016b36c68d821c583be59dd3168009041 +size 331 diff --git a/docker/run/fs/ins/install_A0.sh b/docker/run/fs/ins/install_A0.sh index 7b5d0d807350361f8d2007cf3ba73f74b31a4d00..bdec95ad1697cb77e070e9d8a9b1293905688364 100644 --- a/docker/run/fs/ins/install_A0.sh +++ b/docker/run/fs/ins/install_A0.sh @@ -1,44 +1,3 @@ -#!/bin/bash -set -e - -# Exit immediately if a command exits with a non-zero status. -# set -e - -# branch from parameter -if [ -z "$1" ]; then - echo "Error: Branch parameter is empty. Please provide a valid branch name." - exit 1 -fi -BRANCH="$1" - -if [ "$BRANCH" = "local" ]; then - # For local branch, use the files - echo "Using local dev files in /git/agent-zero" - # List all files recursively in the target directory - # echo "All files in /git/agent-zero (recursive):" - # find "/git/agent-zero" -type f | sort -else - # For other branches, clone from GitHub - echo "Cloning repository from branch $BRANCH..." - git clone -b "$BRANCH" "https://github.com/agent0ai/agent-zero" "/git/agent-zero" || { - echo "CRITICAL ERROR: Failed to clone repository. Branch: $BRANCH" - exit 1 - } -fi - -. "/ins/setup_venv.sh" "$@" - -# moved to base image -# # Ensure the virtual environment and pip setup -# pip install --upgrade pip ipython requests -# # Install some packages in specific variants -# pip install torch --index-url https://download.pytorch.org/whl/cpu - -# Install remaining A0 python packages -uv pip install -r /git/agent-zero/requirements.txt - -# install playwright -bash /ins/install_playwright.sh "$@" - -# Preload A0 -python /git/agent-zero/preload.py --dockerized=true +version https://git-lfs.github.com/spec/v1 +oid sha256:02ac5d3e1c0f33de9956752ae32225e90eccc087e7307c6e0d40056604448622 +size 1294 diff --git a/docker/run/fs/ins/install_A02.sh b/docker/run/fs/ins/install_A02.sh index d40132aa0b3356e1d264e6ecc1a73e49c03f2feb..5e0b987a8f0371a0727d1469a961ac270df4e39d 100644 --- a/docker/run/fs/ins/install_A02.sh +++ b/docker/run/fs/ins/install_A02.sh @@ -1,17 +1,3 @@ -#!/bin/bash -set -e - -# cachebuster script, this helps speed up docker builds - -# remove repo (if not local branch) -if [ "$1" != "local" ]; then - rm -rf /git/agent-zero -fi - -# run the original install script again -bash /ins/install_A0.sh "$@" - -# remove python packages cache -. "/ins/setup_venv.sh" "$@" -pip cache purge -uv cache prune \ No newline at end of file +version https://git-lfs.github.com/spec/v1 +oid sha256:fd65145eed86f46ad4c83ef95ff1710bb213fc8b2f3c010210d8c1a1364e2576 +size 332 diff --git a/docker/run/fs/ins/install_additional.sh b/docker/run/fs/ins/install_additional.sh index efdb0d084acce9bb5e92fd839e49689f54571fce..4e297c996fd6989b9f850e2fb95976d1ee4488d3 100644 --- a/docker/run/fs/ins/install_additional.sh +++ b/docker/run/fs/ins/install_additional.sh @@ -1,94 +1,3 @@ -#!/bin/bash -set -e - -# install playwright - moved to install A0 -# bash /ins/install_playwright.sh "$@" - -# searxng - moved to base image -# bash /ins/install_searxng.sh "$@" - -if ! command -v apt-get >/dev/null 2>&1; then - echo "apt-get unavailable; skipping LibreOffice install" - exit 0 -fi - -KALI_SUITE="kali-last-snapshot" -LIBREOFFICE_VERSION="4:26.2.4.2-1" -XPRA_VERSION="6.5.2-r0-1" -arch="$(dpkg --print-architecture)" - -XPRA_HTML5_VERSION="19-r1-1" -if [ "$arch" = "arm64" ]; then - XPRA_HTML5_VERSION="21-r1-1" -fi - -LIBREOFFICE_PACKAGES=( - "libreoffice-core=$LIBREOFFICE_VERSION" - "libreoffice-writer=$LIBREOFFICE_VERSION" - "libreoffice-calc=$LIBREOFFICE_VERSION" - "libreoffice-impress=$LIBREOFFICE_VERSION" - "libreoffice-gtk3=$LIBREOFFICE_VERSION" - "python3-uno=$LIBREOFFICE_VERSION" -) -XPRA_PACKAGES=( - "xpra-common=$XPRA_VERSION" - "xpra-server=$XPRA_VERSION" - "xpra-client=$XPRA_VERSION" - "xpra-client-gtk3=$XPRA_VERSION" - "xpra-x11=$XPRA_VERSION" - "xpra-html5=$XPRA_HTML5_VERSION" -) - -apt-get update -ATK_VERSION="$(dpkg-query -W -f='${Version}' libatk1.0-0t64)" -ATK_GIR_PACKAGE="/tmp/gir1.2-atk-1.0_${ATK_VERSION}_${arch}.deb" -(cd /tmp && apt-get download "gir1.2-atk-1.0=$ATK_VERSION") - -for source in /etc/apt/sources.list /etc/apt/sources.list.d/kali.sources; do - [ ! -f "$source" ] || sed -i "s/kali-rolling/$KALI_SUITE/g" "$source" -done - -apt-get update -DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends ca-certificates wget -wget -O /usr/share/keyrings/xpra.asc https://xpra.org/xpra.asc -cat >/etc/apt/sources.list.d/xpra.sources < External Services**. - -Common external endpoints include: - -| Endpoint | Use it for | -| --- | --- | -| `POST /api_message` | Send a message to Agent Zero. | -| `GET/POST /api_log_get` | Read chat logs. | -| `POST /api_terminate_chat` | Stop a running chat. | -| `POST /api_reset_chat` | Reset a chat. | -| `POST /api_files_get` | Retrieve files. | - -External API calls use the `X-API-KEY` header. - -> [!TIP] -> For exact request and response details, check the current source or the -> matching DeepWiki page. That keeps the API reference tied to the code that is -> actually running. - -## MCP And A2A - -Use MCP when you want Agent Zero to call tools from another app or service. - -Use A2A when you want another agent to talk to Agent Zero as a collaborator. - -Both use the same Agent Zero instance and can be project-aware when configured -that way. - -## Related - -- [A0 CLI Connector](../guides/a0-cli-connector.md) -- [MCP Setup](../guides/mcp-setup.md) -- [A2A Setup](../guides/a2a-setup.md) -- [API Integration](../guides/api-integration.md) -- [DeepWiki for Agent Zero](https://deepwiki.com/agent0ai/agent-zero) +version https://git-lfs.github.com/spec/v1 +oid sha256:c0b8be750e59d57424cf3077ea07d71020f7c1e727eb72d58e203f51d5def254 +size 1968 diff --git a/docs/developer/contributing-skills.md b/docs/developer/contributing-skills.md index 93186496d9989e340a14d5bf30020e1747db5367..cdc94ae137e5b8e157e42527084dcb6e8569b989 100644 --- a/docs/developer/contributing-skills.md +++ b/docs/developer/contributing-skills.md @@ -1,395 +1,3 @@ -# Contributing Skills to Agent Zero - -Welcome to the Agent Zero Skills ecosystem! This guide will help you create, test, and share skills with the community. - ---- - -## What is a Skill? - -A **Skill** is a contextual expertise module that provides the AI agent with specialized knowledge and procedures for specific tasks. Unlike tools (which are always loaded), skills are **surfaced via description/tag matching** when relevant, making them token-efficient and context-aware. - -### Skills vs Tools vs Knowledge - -| Aspect | Skills | Tools | Knowledge | -|--------|--------|-------|-----------| -| **Loading** | Description/tag matching | Always in prompt | Semantic recall | -| **Purpose** | Procedures & expertise | Actions & functions | Facts & data | -| **Format** | SKILL.md (YAML + Markdown) | Python/code | Text/documents | -| **When to use** | "How to do X" | "Do X now" | "What is X" | - -### Cross-Platform Compatibility - -The SKILL.md standard is compatible with: -- **Agent Zero** (this project) -- **Claude Code** (Anthropic) -- **Cursor** (AI IDE) -- **OpenAI Codex CLI** -- **GitHub Copilot** -- **Goose** (Block) - -Skills you create here can be used in any of these platforms! - ---- - -## Quick Start - -### Using the CLI (Recommended) - -```bash -# Create a new skill interactively -python -m helpers.skills_cli create my-skill-name - -# List all available skills -python -m helpers.skills_cli list - -# Validate a skill -python -m helpers.skills_cli validate my-skill-name - -# Search skills -python -m helpers.skills_cli search "keyword" -``` - -### Manual Creation - -1. Create a folder in `usr/skills/` with your skill name -2. Add a `SKILL.md` file with YAML frontmatter -3. Optionally add supporting scripts (`.py`, `.sh`, `.js`) - ---- - -## SKILL.md Standard - -Every skill must have a `SKILL.md` file with this structure: - -```markdown ---- -name: "skill-name" -description: "A clear, concise description of what this skill does and when to use it" -version: "1.0.0" -author: "Your Name " -license: "MIT" -tags: ["category", "purpose", "technology"] -triggers: - - "keyword that activates this skill" - - "another trigger phrase" -allowed_tools: - - tool_name - - another_tool -metadata: - complexity: "beginner|intermediate|advanced" - category: "development|devops|data|productivity|creative" - estimated_time: "5 minutes" ---- - -# Skill Name - -## Overview - -Brief description of what this skill accomplishes. - -## When to Use - -- Situation 1 where this skill applies -- Situation 2 where this skill applies - -## Instructions - -### Step 1: First Step - -Detailed instructions... - -### Step 2: Second Step - -More instructions... - -## Examples - -### Example 1: Basic Usage - -\`\`\`python -# Code example -\`\`\` - -### Example 2: Advanced Usage - -\`\`\`python -# Advanced code example -\`\`\` - -## Common Pitfalls - -- Pitfall 1 and how to avoid it -- Pitfall 2 and how to avoid it - -## Related Skills - -- `related-skill-1` -- `related-skill-2` -``` - -### Required Fields - -| Field | Description | -|-------|-------------| -| `name` | Unique identifier (lowercase, hyphens allowed) | -| `description` | What the skill does (used for semantic matching) | - -### Optional Fields - -| Field | Description | -|-------|-------------| -| `version` | Semantic version (e.g., "1.0.0") | -| `author` | Your name and email | -| `license` | License (MIT, Apache-2.0, etc.) | -| `tags` | Categories for discovery | -| `triggers` | Phrases that activate this skill | -| `allowed_tools` | Tools this skill can use | -| `metadata` | Additional structured data | - ---- - -## Creating Your First Skill - -### Step 1: Identify the Need - -Ask yourself: -- What expertise would help the agent? -- When should this skill be activated? -- What steps should the agent follow? - -### Step 2: Create the Structure - -```bash -# Using CLI -python -m helpers.skills_cli create my-awesome-skill - -# Or manually -mkdir -p usr/skills/my-awesome-skill -touch usr/skills/my-awesome-skill/SKILL.md -``` - -### Step 3: Write the SKILL.md - -```markdown ---- -name: "my-awesome-skill" -description: "Helps with [specific task] when [specific situation]" -version: "1.0.0" -author: "Your Name" -tags: ["category"] ---- - -# My Awesome Skill - -## When to Use - -Use this skill when you need to [specific task]. - -## Instructions - -1. First, do this... -2. Then, do that... -3. Finally, verify by... - -## Examples - -### Example: Basic Case - -[Show a complete example] -``` - -### Step 4: Add Supporting Files (Optional) - -If your skill needs scripts: - -``` -my-awesome-skill/ -├── SKILL.md # Required -├── helper.py # Optional Python script -├── setup.sh # Optional shell script -└── templates/ # Optional templates folder - └── config.json -``` - -Reference them in your SKILL.md: - -```markdown -## Scripts - -This skill includes helper scripts: -- `helper.py` - Does X -- `setup.sh` - Sets up Y -``` - -### Step 5: Test Your Skill - -```bash -# Validate the skill -python -m helpers.skills_cli validate my-awesome-skill - -# Test in Agent Zero -# Start the agent and ask it to perform the task your skill handles -``` - ---- - -## Best Practices - -### Writing Effective Descriptions - -The `description` field is crucial for semantic matching. Make it: - -**Good:** -```yaml -description: "Guides systematic debugging of Python applications using print statements, debugger, and logging to identify root causes" -``` - -**Bad:** -```yaml -description: "Helps with debugging" -``` - -### Structuring Instructions - -1. **Be Specific** - Avoid vague instructions -2. **Use Steps** - Number your steps clearly -3. **Include Examples** - Show, don't just tell -4. **Anticipate Errors** - Include troubleshooting - -### Semantic Triggers - -Design your description and content so the skill is recalled when relevant: - -```yaml -# Include synonyms and related terms -description: "Helps create REST APIs, web services, HTTP endpoints, and backend routes using FastAPI, Flask, or Express" -``` - -### Keep Skills Focused - -One skill = one expertise area. If your skill is getting too long, split it: - -- `api-design` - API structure and patterns -- `api-security` - API authentication and authorization -- `api-testing` - API testing strategies - ---- - -## Testing Skills - -### Local Testing - -1. **Validate Structure:** - ```bash - python -m helpers.skills_cli validate my-skill - ``` - -2. **Test Semantic Recall:** - Start Agent Zero and ask questions that should trigger your skill. - -3. **Verify Instructions:** - Follow your own instructions manually to ensure they work. - ---- - -## Sharing Skills - -### Contributing to Agent Zero - -1. **Fork the Repository:** - ```bash - git clone https://github.com/agent0ai/agent-zero.git - cd agent-zero - ``` - -2. **Create Your Skill:** - ```bash - python -m helpers.skills_cli create my-skill - # Edit usr/skills/my-skill/SKILL.md - ``` - -3. **Move to Default (for contribution):** - ```bash - mv usr/skills/my-skill skills/my-skill - ``` - -4. **Create a Pull Request:** - - Branch: `feat/skill-my-skill-name` - - Title: `feat(skills): add my-skill-name skill` - - Description: Explain what the skill does and why it's useful - -### Publishing Skills - -Share your skills on [skillsmp.com](https://skillsmp.com) or [skills.sh](https://skills.sh): - -1. Create a GitHub repository for your skill -2. Ensure it follows the SKILL.md standard -3. Submit via their contribution process - -### Creating a Skills Collection - -For multiple related skills, create a repository: - -``` -my-skills-collection/ -├── README.md -├── skills/ -│ ├── skill-1/ -│ │ └── SKILL.md -│ ├── skill-2/ -│ │ └── SKILL.md -│ └── skill-3/ -│ └── SKILL.md -└── LICENSE -``` - ---- - -## Community Guidelines - -### Quality Standards - -- **Tested** - Skills must be tested before submission -- **Documented** - Clear instructions and examples -- **Focused** - One expertise per skill -- **Original** - Don't duplicate existing skills - -### Naming Conventions - -- Use lowercase with hyphens: `my-skill-name` -- Be descriptive: `python-debugging` not `debug` -- Avoid generic names: `fastapi-crud` not `api` - -### License - -- Include a license (MIT recommended for maximum compatibility) -- Respect licenses of any code you include -- Don't include proprietary or copyrighted content - ---- - -## FAQ - -### Q: Where should I put my skills? - -**A:** During development, use `usr/skills/`. For contribution, move to `skills/`. - -### Q: How are skills discovered? - -**A:** Skills are matched against their name, description, and tags for the current query. They are not indexed into vector memory. - -### Q: Can I use skills from other platforms? - -**A:** Yes! The SKILL.md standard is cross-platform. Skills from Claude Code, Cursor, or other compatible platforms can be copied directly to `usr/skills/`. - -### Q: How do I update a skill? - -**A:** Edit the SKILL.md file and increment the version number. Changes take effect on agent restart. - -### Q: Can skills call other skills? - -**A:** Skills don't directly call each other, but the agent may combine multiple skills when appropriate for a task. - ---- - -Happy skill building! 🚀 +version https://git-lfs.github.com/spec/v1 +oid sha256:50705bc9123c5c9962e9a0582b466c5bdfa342770f832503fe58cb77b51f4fa8 +size 9033 diff --git a/docs/developer/extensions.md b/docs/developer/extensions.md index b53c24cf652a9b622c135b89b9ac361168875628..80fbdef5656361ab02169f5740b80fc655341ce0 100644 --- a/docs/developer/extensions.md +++ b/docs/developer/extensions.md @@ -1,46 +1,3 @@ -# Extensions - -Extensions are an advanced way to change how Agent Zero behaves. - -If you are new, start with plugins instead. Plugins are easier to create, test, -disable, and remove. - -Architecture details, extension points, and source-linked explanations now live -in [DeepWiki for Agent Zero](https://deepwiki.com/agent0ai/agent-zero). This -local page stays short on purpose. - -## Start Here - -| Goal | Start here | -| --- | --- | -| Add a small user-facing feature | [Create a Small Plugin](../guides/create-plugin.md) | -| Change agent behavior for a project | [Projects](../guides/projects.md) | -| Create a specialized agent style | [Agent Profiles](../guides/agent-profiles.md) | -| Study extension internals | [DeepWiki](https://deepwiki.com/agent0ai/agent-zero) | - -## When Extensions Make Sense - -Use an extension only when a normal plugin, project instruction, skill, or agent -profile is not enough. - -Good extension candidates: - -- adding behavior at a specific lifecycle point; -- shaping prompts in a reusable way; -- integrating tightly with core tools; -- preparing framework-owned state before a task starts. - -Avoid extensions for simple UI changes, one-off scripts, or work that should be -easy to remove. A plugin is usually the cleaner home for that. - -## Maintenance Rule - -Keep extension changes small and easy to explain. If a reader needs the full -architecture to understand why the extension exists, link to the relevant -DeepWiki page instead of copying the architecture into this repository. - -## Related - -- [Create a Small Plugin](../guides/create-plugin.md) -- [Agent Profiles](../guides/agent-profiles.md) -- [DeepWiki for Agent Zero](https://deepwiki.com/agent0ai/agent-zero) +version https://git-lfs.github.com/spec/v1 +oid sha256:bb77856495cd10198eca601ba2ea1cfd4043470d966522462d9589fc9a908aff +size 1682 diff --git a/docs/developer/mcp-configuration.md b/docs/developer/mcp-configuration.md index ee0b8b2eb8818465b0ab857ca7b5a06b93e043c9..9699b4befa1cab25bedf30b69df41f3f363953ea 100644 --- a/docs/developer/mcp-configuration.md +++ b/docs/developer/mcp-configuration.md @@ -1,80 +1,3 @@ -# Advanced MCP Configuration - -Most users should start with [MCP Setup](../guides/mcp-setup.md). - -This page is for people who need to paste or review MCP JSON by hand. MCP -architecture and source-linked internals live in -[DeepWiki for Agent Zero](https://deepwiki.com/agent0ai/agent-zero). - -## Basic Shape - -Command-based MCP tool: - -```json -{ - "mcpServers": { - "sqlite": { - "command": "uvx", - "args": ["mcp-server-sqlite", "--db-path", "/root/db.sqlite"] - } - } -} -``` - -URL-based MCP tool: - -```json -{ - "mcpServers": { - "external-api": { - "url": "https://api.example.com/mcp", - "headers": { - "Authorization": "Bearer YOUR_API_KEY" - } - } - } -} -``` - -## Common Fields - -| Field | Meaning | -| --- | --- | -| `command` | Starts a local MCP tool from a command. | -| `args` | Arguments passed to that command. | -| `url` | Connects to an MCP tool that is already running. | -| `headers` | Optional HTTP headers, often used for authentication. | -| `env` | Optional environment variables for command-based tools. | -| `disabled` | Temporarily turns one MCP entry off. | - -Use `command` for local tools and `url` for tools that are already running -somewhere else. - -## Docker Addresses - -If Agent Zero runs in Docker, remember that "localhost" means the container, not -always your host machine. - -| Where the MCP tool runs | Address to use from Agent Zero | -| --- | --- | -| Host machine on macOS or Windows | `host.docker.internal` | -| Another container | The container name on the same Docker network | -| Remote machine | Its reachable HTTPS URL | -| Inside Agent Zero's container | A command-based config | - -On Linux, `host.docker.internal` may need extra Docker setup. Running the MCP -tool in the same Docker network is often simpler. - -## Safety - -- Use MCP tools you trust. -- Keep real API keys out of public screenshots and repositories. -- Prefer project secrets or environment variables for credentials. -- Remove MCP tools you no longer use. - -## Related - -- [MCP Setup](../guides/mcp-setup.md) -- [Browser Guide](../guides/browser.md) -- [A0 CLI Connector](../guides/a0-cli-connector.md) -- [DeepWiki for Agent Zero](https://deepwiki.com/agent0ai/agent-zero) +version https://git-lfs.github.com/spec/v1 +oid sha256:d6f96af40a0fc64e275bdc8878d9a2b75d98d819c8301d79c8f1624528b4ec22 +size 2182 diff --git a/docs/developer/notifications.md b/docs/developer/notifications.md index a1de52c883a9a67c01a94713c3772e9dde860d04..b7a5ad8d63fb4bde4ff3bb36bb2006df9f3084da 100644 --- a/docs/developer/notifications.md +++ b/docs/developer/notifications.md @@ -1,133 +1,3 @@ -# Agent Zero Notifications - -Quick guide for using the notification system in Agent Zero. - -> [!TIP] -> Notifications pair well with scheduled tasks. See [Tasks & Scheduling](../guides/usage.md#tasks-and-scheduling) for automation patterns. - -## Backend Usage - -Use `AgentNotification` helper methods anywhere in your Python code: - -```python -from helpers.notification import AgentNotification - -# Basic notifications -AgentNotification.info("Operation completed") -AgentNotification.success("File saved successfully", "File Manager") -AgentNotification.warning("High CPU usage detected", "System Monitor") -AgentNotification.error("Connection failed", "Network Error") -AgentNotification.progress("Processing files...", "Task Progress") - -# With details and custom display time -AgentNotification.info( - message="System backup completed", - title="Backup Manager", - detail="

Backup size: 2.4 GB

", - display_time=8 # seconds -) - -# Grouped notifications (replaces previous in same group) -AgentNotification.progress("Download: 25%", "File Download", group="download-status") -AgentNotification.progress("Download: 75%", "File Download", group="download-status") # Replaces previous -AgentNotification.progress("Download: Complete!", "File Download", group="download-status") # Replaces previous -``` - -## Frontend Usage - -Use the notification store in Alpine.js components: - -```javascript -// Basic notifications -$store.notificationStore.info("User logged in") -$store.notificationStore.success("Settings saved", "Configuration") -$store.notificationStore.warning("Session expiring soon") -$store.notificationStore.error("Failed to load data") - -// With grouping -$store.notificationStore.info("Connecting...", "Status", "", 3, "connection") -$store.notificationStore.success("Connected!", "Status", "", 3, "connection") // Replaces previous - -// Frontend notifications with backend persistence (new feature!) -$store.notificationStore.frontendError("Database timeout", "Connection Error") -$store.notificationStore.frontendWarning("High memory usage", "Performance") -$store.notificationStore.frontendInfo("Cache cleared", "System") -``` - -## Frontend Notifications with Backend Sync - -**New Feature**: Frontend notifications now automatically sync to the backend when connected, providing persistent history and cross-session availability. - -### How it Works: -- **Backend Connected**: Notifications are sent to backend and appear via polling (persistent) -- **Backend Disconnected**: Notifications show as frontend-only toasts (temporary) -- **Automatic Fallback**: Seamless degradation when backend is unavailable - -### Global Functions: -```javascript -// These functions automatically try backend first, then fallback to frontend-only -toastFrontendError("Server unreachable", "Connection Error") -toastFrontendWarning("Slow connection detected") -toastFrontendInfo("Reconnected successfully") -``` - -## HTML Usage - -```html - - - - - - -``` - -## Notification Groups - -Groups ensure only the latest notification from each group is shown in the toast stack: - -```python -# Progress updates - each new notification replaces the previous one -AgentNotification.info("Starting backup...", group="backup-status") -AgentNotification.progress("Backup: 30%", group="backup-status") # Replaces previous -AgentNotification.progress("Backup: 80%", group="backup-status") # Replaces previous -AgentNotification.success("Backup complete!", group="backup-status") # Replaces previous - -# Connection status - only show current state -AgentNotification.warning("Disconnected", group="network") -AgentNotification.info("Reconnecting...", group="network") # Replaces previous -AgentNotification.success("Connected", group="network") # Replaces previous -``` - -## Parameters - -All notification methods support these parameters: - -- `message` (required): Main notification text -- `title` (optional): Notification title -- `detail` (optional): HTML content for expandable details -- `display_time` (optional): Toast display duration in seconds (default: 3) -- `group` (optional): Group identifier for replacement behavior - -## Types - -- **info** (ℹ️): General information -- **success** (✅): Successful operations -- **warning** (⚠️): Important alerts -- **error** (❌): Error conditions -- **progress** (⏳): Ongoing operations - -## Behavior - -- **Toast Display**: Notifications appear as toasts in the bottom-right corner -- **Persistent History**: All notifications (including synced frontend ones) are stored in notification history -- **Modal Access**: Full history accessible via the bell icon -- **Auto-dismiss**: Toasts automatically disappear after `display_time` -- **Group Replacement**: Notifications with the same group replace previous ones immediately -- **Backend Sync**: Frontend notifications automatically sync to backend when connected +version https://git-lfs.github.com/spec/v1 +oid sha256:f9cececccc005a4c071574c5706cb157e744f60cbba1e0cceaa442936caf78fc +size 5212 diff --git a/docs/developer/plugins.md b/docs/developer/plugins.md index 301ae77319e483fde1ed3dd120cbe8b7704bf645..199495266b9c5a80bb47d1dac30fb058ba69dfda 100644 --- a/docs/developer/plugins.md +++ b/docs/developer/plugins.md @@ -1,60 +1,3 @@ -# Plugins - -Most people should start with the practical guide: -[Create a Small Plugin](../guides/create-plugin.md). - -Plugin architecture and source-linked internals live in -[DeepWiki for Agent Zero](https://deepwiki.com/agent0ai/agent-zero). This page -stays intentionally small so the repository does not maintain a second plugin -manual. - -## What To Use - -| Goal | Start here | -| --- | --- | -| Build your first plugin | [Create a Small Plugin](../guides/create-plugin.md) | -| Understand how plugins are loaded | [DeepWiki](https://deepwiki.com/agent0ai/agent-zero) | -| Decide what is safe to publish | [Sharing and Safety](sharing-and-safety.md) | -| Contribute a plugin upstream | [Contributing Guide](../guides/contribution.md) | - -## Minimum Local Plugin - -A local plugin usually lives here: - -```text -/a0/usr/plugins// -├── plugin.yaml -├── README.md -└── webui/ -``` - -The smallest useful `plugin.yaml` looks like this: - -```yaml -name: my_plugin -title: My Plugin -description: A short sentence that explains what it does. -version: 1.0.0 -``` - -Ask Agent Zero to keep the first version small. A tiny plugin that does one -visible thing is easier to test, review, and share. - -## Sharing A Plugin - -Before publishing a plugin: - -- keep it in its own public repository; -- include a clear `README.md`; -- include a `LICENSE`; -- avoid secrets, local paths, and machine-specific files; -- explain what the plugin changes and how to remove it. - -For Plugin Index submission, use the current instructions in the -[`agent0ai/a0-plugins`](https://github.com/agent0ai/a0-plugins) repository. - -## Related - -- [Create a Small Plugin](../guides/create-plugin.md) -- [Sharing and Safety](sharing-and-safety.md) -- [DeepWiki for Agent Zero](https://deepwiki.com/agent0ai/agent-zero) +version https://git-lfs.github.com/spec/v1 +oid sha256:e33970a8ee4f9be98e95a53539fa92eaebee795a65ed585fc46fd17c7a974ba0 +size 1777 diff --git a/docs/developer/sharing-and-safety.md b/docs/developer/sharing-and-safety.md index d86ca34580ec1b8a582d811796de106e1c16e6ee..d8df225bb0fbcaddde8b4e032431fc79aca8a30d 100644 --- a/docs/developer/sharing-and-safety.md +++ b/docs/developer/sharing-and-safety.md @@ -1,130 +1,3 @@ -# Sharing and Safety Guide - -This guide helps contributors decide **what to share**, **where to share it**, and **what must stay private**. - -## Start with the decision tree - -### 1. Is this change meant for the Agent Zero core repository? - -Use the main `agent-zero` contribution flow when the change directly improves the framework itself, for example: - -- a bugfix in `webui/`, `helpers/`, `api/`, `tools/`, `extensions/`, or `docs/` -- a test that belongs with core framework behavior -- documentation for built-in functionality - -If yes: - -1. Fork `agent0ai/agent-zero` publicly. -2. Add `upstream` to your local clone. -3. Sync from `upstream/main` (or the currently used upstream target branch). -4. Create a focused branch. -5. Open the PR across forks. - -See [`../guides/contribution.md`](../guides/contribution.md) for the detailed workflow. - -### 2. Is this a community plugin? - -Use a **dedicated public plugin repository** when the work is a standalone plugin that users can install independently. - -Typical signals: - -- it lives cleanly under `usr/plugins//` -- it has its own `plugin.yaml` -- it can evolve independently from the core repository -- it should be discoverable in the Plugin Hub - -If yes: - -1. Put the plugin contents at the root of its own repository. -2. Include `plugin.yaml`, `README.md`, and `LICENSE`. -3. Test it locally from `usr/plugins/`. -4. Submit its `index.yaml` entry to `agent0ai/a0-plugins`. - -See [`agent0ai/a0-plugins`](https://github.com/agent0ai/a0-plugins) for the -current Plugin Index rules and packaging details. - -### 3. Is this a reusable skill? - -Use the **skills workflow** when the work is mainly procedural knowledge in `SKILL.md` form. - -Typical signals: - -- it teaches the agent how to perform a task -- it is portable across Agent Zero, Cursor, Claude Code, or Copilot-style ecosystems -- it lives naturally under `usr/skills/` during development - -If yes: - -1. Develop it locally in `usr/skills/`. -2. Validate the structure and examples. -3. Move it into `skills/` for an Agent Zero contribution, or publish it in a dedicated public repository/collection. - -See [`contributing-skills.md`](contributing-skills.md) for the authoring standard. - -### 4. Should this stay private? - -Keep the work **out of public forks and upstream PRs** when it includes any of the following: - -- credentials, tokens, API keys, `.env` files, or customer secrets -- local-only experiments, snapshots, or temporary branch archaeology -- customer-specific logic or data -- machine-specific configuration, caches, local virtual environments, or editor debris -- plugin or skill prototypes that are not ready for public review - -If yes, keep it in a private repository, in `usr/`, or outside the public contribution path entirely. - -## Safe publication rules - -### Public forks and pull requests - -- Use a **public, pushable fork** for any branch that may become the head branch of an upstream PR. -- Keep the source branch alive until the PR is merged or intentionally closed. -- Search open and recently closed upstream PRs before opening a new one. -- Choose the base branch from current upstream practice; do not hardcode `development` if active comparable PRs target `main`. -- Record the exact tests you ran. - -### Allow edits from maintainers - -GitHub lets you allow maintainers to edit a branch on your fork. - -If the fork branch contains GitHub Actions workflows, GitHub may show **"Allow edits and access to secrets by maintainers"**. Treat this carefully: - -- only enable it when you are comfortable with maintainers editing workflow files on that branch -- do not leave sensitive values or private automation in a fork branch you plan to share publicly - -### Files that usually do not belong in public contributions - -- `.env` -- `.venv/` -- editor settings such as `.vscode/settings.json` -- temporary notes, scratch files, or machine-specific backups -- unrelated formatting churn -- private reports or internal strategy docs - -## Recommended repository model - -For teams or maintainers juggling both private R&D and public contributions, this split keeps things sane: - -1. **Private workspace or backup repository** - - plugin experiments - - customer-specific work - - snapshots and branch archaeology - - internal notes and strategy - -2. **Clean fix-only clone for upstream-facing work** - - only branches that may become public PRs - - synced from upstream - - no snapshots, no unrelated experiments - -3. **Public fork used only for PR head branches** - - only focused, reviewable public branches - - no internal scratch branches - -## Before you publish anything - -- Confirm the work belongs in the chosen publication path. -- Remove secrets and local-only artifacts. -- Check for overlapping upstream work. -- Make sure the diff is narrow and reviewer-friendly. -- Verify the test evidence you plan to mention. -- Make sure the branch source is public if it will back an upstream PR. +version https://git-lfs.github.com/spec/v1 +oid sha256:98d9b8927b6851d0e05201c9289aad81c01b6d90de110cd29aa9a4fb52dd90cd +size 4886 diff --git a/docs/developer/websockets.md b/docs/developer/websockets.md index 6c1e332cdb68b946ff9ea20d23ad72ac10678b48..e6423f27b7a6776db2d90059bcad0451e6098638 100644 --- a/docs/developer/websockets.md +++ b/docs/developer/websockets.md @@ -1,31 +1,3 @@ -# WebSockets - -Agent Zero WebSocket architecture is documented in -[DeepWiki for Agent Zero](https://deepwiki.com/agent0ai/agent-zero). - -This local page is only a handoff. Keeping the full protocol guide here would -duplicate source-linked documentation and become stale. - -## When You Are Working On WebSockets - -Start with the source and DeepWiki: - -- `helpers/ws.py` -- `helpers/ws_manager.py` -- `api/ws_*.py` -- `webui/js/websocket.js` -- WebSocket pages in [DeepWiki](https://deepwiki.com/agent0ai/agent-zero) - -## Keep These Rules In Mind - -- Preserve authentication and CSRF checks. -- Keep payloads JSON-serializable. -- Prefer small, named events over large catch-all events. -- Test reconnects, timeouts, and duplicate deliveries. -- Keep user-facing behavior documented in the relevant guide, not in this - protocol handoff page. - -## Related - -- [Architecture](architecture.md) -- [DeepWiki for Agent Zero](https://deepwiki.com/agent0ai/agent-zero) +version https://git-lfs.github.com/spec/v1 +oid sha256:daceadc52792cb58bedb29e0a90e9432f4ebb47ab0257ea74e67cd6f79180eba +size 943 diff --git a/docs/guides/a0-cli-connector.md b/docs/guides/a0-cli-connector.md index 5a8c98d1e88f8b9bbd7bdfbdf0416facdd32e3a6..f81ca736923547bb45e253de71ff556aaef210f7 100644 --- a/docs/guides/a0-cli-connector.md +++ b/docs/guides/a0-cli-connector.md @@ -1,308 +1,3 @@ -# A0 CLI Connector - -A0 CLI connects your terminal to Agent Zero. - -It is not a second agent. Agent Zero is still the one thinking, remembering, and -using tools. A0 CLI is the doorway that lets Agent Zero work on the computer -where the CLI is running. - -Agent Zero lives in Docker because that is safer and easier to manage. A0 CLI is -the intentional bridge for moments when you want Agent Zero to work with your -real files, terminal, or browser on the host machine. - -Agent Zero stays in Docker. A0 CLI installs on the host machine. - -The same connector can also let Agent Zero use a Chrome-family browser on your -computer. - -## Quick Install - -**macOS / Linux:** -```bash -curl -LsSf https://cli.agent-zero.ai/install.sh | sh -``` - -**Windows (PowerShell):** -```powershell -irm https://cli.agent-zero.ai/install.ps1 | iex -``` - -Run these on the host machine, not inside the Agent Zero container. - -The installer handles the small Python helper it needs. - -## Open it and start working - -1. Make sure Agent Zero is already running. -2. Launch A0 CLI on the host machine: - -```bash -a0 -``` - -3. If Agent Zero is running on the same machine, A0 CLI will usually find it. -4. If Agent Zero is somewhere else, enter its web address. -5. Open or create a chat and confirm you can talk to Agent Zero from the host machine. - -> [!NOTE] -> If A0 CLI says connector support is missing, update Agent Zero first. - -### Connection picker - -On launch, A0 CLI opens a host picker. If it finds Agent Zero on this machine, -click **Connect**. If Agent Zero is somewhere else, click **Enter URL manually** -and paste the address. - -![A0 CLI host picker](../res/usage/a0-cli/a0-cli-host-picker.png) - -Useful launch options: - -```bash -a0 --host http://localhost:32080 -a0 --no-auto-connect -a0 --no-docker-discovery -``` - -You can also set the address before launching: - -```bash -export AGENT_ZERO_HOST=http://localhost:32080 -a0 -``` - -If **Remember this host** is enabled, the CLI saves that address for next time. - -### The connected shell - -After connecting, the shell shows the Agent Zero address, current project, model, -local folder, Agent Zero workspace, and the message box. - -![A0 CLI connected shell](../res/usage/a0-cli/a0-cli-start.png) - -Use the footer when your terminal supports function keys: - -| Key | Action | -|---|---| -| `F3` | Toggle host file read/write access for the active CLI session. | -| `F4` | Toggle remote code execution through the active CLI session. | -| `F5` | Clear the visible chat log. | -| `F6` | Open the chat list. | -| `F7` | Nudge the active agent run. | -| `F8` | Pause the active agent run. | -| `Ctrl+C` | Exit. | -| `Ctrl+P` | Open the command palette. | - -`Ctrl+P` is the best fallback when an IDE terminal or SSH client captures -function keys. - -![A0 CLI command palette](../res/usage/a0-cli/a0-cli-command-palette.png) - -### Slash commands - -Type a slash command in the message box and press Enter. Most commands are also -available from `Ctrl+P`. - -| Command | Use it for | -|---|---| -| `/new` | Create a new empty chat. | -| `/chats` | List previous chats. Add `--project`, `--all-projects`, or `--sort=updated|created|name` when needed. | -| `/project` | Open the project menu, or switch directly with `/project `. | -| `/profile` | Open the profile menu; add a name to select, or a quoted name and instructions to create. | -| `/permissions` | Edit Tool, MCP, and Skill access for the current profile. | -| `/compact` | Compact the current chat after confirmation. | -| `/pause` | Pause the active run. | -| `/resume` | Resume a paused run. | -| `/nudge` | Nudge the active run. | -| `/presets` | Choose a model preset. | -| `/models` | Edit the active models. | -| `/browser` | Check or change Browser mode. | -| `/attach` | Attach local image files to the next message. Aliases: `/image`, `/img`. | -| `/keys` | Show or hide key and widget help. | -| `/disconnect` | Disconnect and return to the host connection flow. | -| `/help` | Print the available command list in the shell. | -| `/quit` | Disconnect and exit the CLI. | - -### Agent profiles and permissions - -Open the compact profile menu: - -```text -/profile -``` - -![A0 CLI profile menu](../res/usage/a0-cli/a0-cli-profile-menu.png) - -Select an existing profile by its unquoted name or ID, or create one directly: - -```text -/profile Developer -/profile "Source Scout" "Verify every important claim and cite the source." -``` - -Quick creation opens a fresh chat with the new profile selected. - -![A0 CLI quick profile creation confirmation](../res/usage/a0-cli/a0-cli-profile-created.png) - -Use `/permissions` to edit the current profile's Tools, MCPs, and Skills. -Entries move through **Default**, **On**, and **Off**; the Tools, MCPs, and -Skills tabs each expose their own category default. - -![A0 CLI permission editor](../res/usage/a0-cli/a0-cli-permissions.png) - -Profile editing follows the current chat scope. A project chat writes project -overrides; a chat with no project writes Global overrides. For the complete Web -UI and file-format guide, see [Agent Profiles](agent-profiles.md). - -## Host Browser - -Use this when you want Agent Zero to browse with a browser on your computer. -This is useful when the page, login, or browser profile should stay on your -machine. - -### Setup Checklist - -- [ ] Keep A0 CLI connected to the Agent Zero chat. -- [ ] In Agent Zero Web UI, open Browser plugin settings and choose **Bring Your - Own Browser**. -- [ ] If you want Agent Zero to use an already-open personal browser window, - open that browser first. -- [ ] In that browser, open its remote debugging page. -- [ ] Enable **Allow remote debugging for this browser instance**. - -Remote debugging pages: - -| Browser | Page | -| --- | --- | -| Chrome, Edge, Brave, Vivaldi, Chromium | `chrome://inspect/#remote-debugging` | -| Opera | `opera://inspect/#remote-debugging` | - -![Chrome remote debugging setting](../res/usage/browser/host-browser-remote-debugging-setting.png) - -When Agent Zero performs its first Browser action against that host browser, -the browser asks for confirmation. Click **Allow** if you trust this Agent Zero -instance and A0 CLI connection. - -![Chrome remote debugging allow prompt](../res/usage/browser/host-browser-remote-debugging-allow.png) - -A0 CLI does not take over the browser while it is only checking status. Browser -control starts when Agent Zero actually needs to use the browser. - -> [!IMPORTANT] -> Remote debugging gives the connected app full control of that browser session, -> including access to saved data, cookies, site data, and navigation. Use it only -> with trusted Agent Zero instances and browser windows you intend the agent to -> control. - -The **Host browser** list in Browser settings comes from the connected local A0 -CLI, not from the Agent Zero Web UI server. It shows Automatic, currently -advertised debug endpoints, and **Custom endpoint**. If a newly authorized -browser does not appear, restart or reconnect A0 CLI. - -If the inspect checkbox is not enough for your browser build, launch it with an -explicit remote debugging port and a separate profile: - -```bash -opera --remote-debugging-port=9222 --user-data-dir="$HOME/.config/a0-opera-debug" -``` - -Then choose **Custom endpoint** in Browser settings, run -`/browser localhost:9222` in A0 CLI, or pass the discovery address to A0 CLI. A -full DevTools WebSocket endpoint also works: - -```bash -export A0_HOST_BROWSER_REMOTE_DEBUGGING_ENDPOINTS="http://localhost:9222" -``` - -### Browser Profiles - -```bash -/browser profile -/browser profile chrome Default -/browser profile chrome-a0 Default -``` - -If your everyday Chrome window cannot be used, choose the separate A0 browser -profile instead. It keeps its own cookies and sign-ins, so you may need to log in -there once. - -### Choose Browser Mode - -In Agent Zero Web UI, open Browser plugin settings and choose one of: - -- **Docker browser:** use Agent Zero's built-in Docker browser. -- **Bring Your Own Browser:** use the browser on your computer through A0 CLI. - If A0 CLI is not connected, Agent Zero will tell you instead of quietly using - a different browser. - -You can also find the Browser commands from the CLI command palette: - -![A0 CLI Browser commands](../res/usage/a0-cli/a0-cli-command-browser.png) - -When **Bring Your Own Browser** is selected, the first browsing request asks A0 -CLI to prepare the browser automatically. These commands are useful when you -want to check or change the state yourself: - -```bash -/browser status -/browser host on -/browser relaunch -``` - -`/browser status` shows which Browser mode is selected and whether your browser -is ready: - -![A0 CLI Browser status](../res/usage/a0-cli/a0-cli-browser-status.png) - -`/browser host` switches the active chat to Bring Your Own Browser mode: - -![A0 CLI Bring Your Own Browser mode](../res/usage/a0-cli/a0-cli-browser-host-mode.png) - -Run `/browser container` to switch that chat back to Docker browser mode. - -`/browser privacy` reminds users where the Browser content policy lives: - -![A0 CLI Browser privacy notice](../res/usage/a0-cli/a0-cli-browser-privacy.png) - -If the selected browser profile is already open in another window, close that -window and try again. You can also run `/browser relaunch`. - -You do not need to install Chrome DevTools MCP for this. A0 CLI already includes -what it needs to connect to the browser you approve. - -### Page Privacy - -Browser settings decide what Agent Zero may do with page text and screenshots -from your own browser: - -- **Local models only:** use host-browser page content only with local models. -- **Warn when using cloud:** allow cloud models, but show a warning. -- **Allow:** allow without warning. - -> [!NOTE] -> The live Browser surface shows the Docker browser. When Agent Zero uses your -> host browser, results and screenshots appear in the chat, but the live Canvas -> is not a stream of your personal browser window. - -## Give this to another agent - -If another agent is helping with setup, do not paste a whole checklist. Paste one line: - -```text -Set up the A0 CLI connector for Agent Zero on this machine using the setup-a0-cli Skill. -``` - -## Troubleshooting - -- **Nothing appears locally:** Enter the Agent Zero web address manually or export `AGENT_ZERO_HOST`. -- **You tried to install from inside Docker:** A0 CLI belongs on the host machine. Agent Zero stays in Docker. -- **Function keys do nothing:** Some terminals and IDEs capture function keys. Use `Ctrl+P`. -- **A0 CLI says connector support is missing:** Update Agent Zero. -- **Host browser says repair is needed:** Run `/browser repair`. -- **Host browser waits for relaunch:** Close the selected Chrome, Edge, or Chromium profile and run `/browser relaunch`. - -## Related links - -- [Quick Start](../quickstart.md) -- [Installation Guide](../setup/installation.md) -- [Browser Guide](browser.md) -- [MCP Setup](mcp-setup.md) +version https://git-lfs.github.com/spec/v1 +oid sha256:7e8e2c699f762d06562a63a3069a06bc068e7eee3dc5e442a6ef99bc7835549d +size 10743 diff --git a/docs/guides/a2a-setup.md b/docs/guides/a2a-setup.md index 3212020fe108c87a2042d477e893dfd15ec217e0..660f20a4746a9e39ab1de0f7828d26bedc52eadc 100644 --- a/docs/guides/a2a-setup.md +++ b/docs/guides/a2a-setup.md @@ -1,153 +1,3 @@ -# A2A Server Setup - -Agent Zero can communicate with other Agent Zero instances using the A2A (Agent-to-Agent) protocol based on FastA2A. This guide shows you how to enable and configure A2A connectivity through the Settings UI. - -## What is A2A? - -A2A enables direct communication between multiple Agent Zero instances. This allows: - -- **Distributed workflows** - Delegate tasks to specialized agent instances -- **Context isolation** - Maintain separate workspaces for different agents -- **Long-running collaboration** - Persistent agent-to-agent conversations -- **Project-specific delegation** - Route work to agents with specific project contexts - -> [!NOTE] -> This guide covers enabling Agent Zero as an A2A server. For API-level integration details, see the [advanced connectivity documentation](../developer/connectivity.md). - -## Enabling the A2A Server - -### Step 1: Open A2A Configuration - -1. Click **Settings** in the sidebar -2. Navigate to the **MCP/A2A** tab -3. Scroll to the **A0 A2A Server** section -4. Toggle **Enable A2A server** to ON - -![A2A Server Settings](../res/setup/a2a/a2a-conn.png) - -### Step 2: Get Connection URL - -1. Click on **connection example** to view your A2A connection details -2. The dialog displays: - - **API Token** - Automatically generated from your username and password - - **A2A Connection URL** - The full URL other agents will use to connect - - Optional **Project selector** - To create project-specific connection URLs - -![A2A Connection Dialog](../res/setup/a2a/a2a2.png) - -### Step 3: Save Configuration - -1. Click **Save** to apply your settings -2. The A2A server is now active and ready to accept connections - -> [!IMPORTANT] -> The API token changes when you update your Agent Zero credentials. Existing connections will need to be reconfigured with the new token. - -## Connection URL Format - -The basic A2A connection URL follows this format: - -``` -http://YOUR_HOST:PORT/a2a/t-YOUR_API_TOKEN -``` - -### With Project Context - -To connect with a specific project active: - -``` -http://YOUR_HOST:PORT/a2a/t-YOUR_API_TOKEN/p-PROJECT_NAME -``` - -When a project is specified: -- All A2A conversations run in that project's context -- The agent has access to project-specific resources and knowledge -- Enables isolated, project-focused agent collaboration - -## Example Use Cases - -### 1. Local Development Setup - -Two Agent Zero instances on the same machine: - -``` -Instance 1: http://localhost:8080/a2a/t-abc123xyz -Instance 2: http://localhost:8081/a2a/t-def456uvw -``` - -### 2. Remote Agent Collaboration - -Connect to a remote Agent Zero instance: - -``` -http://agent.example.com:8080/a2a/t-remote-token -``` - -### 3. Project-Specific Delegation - -Main agent delegates frontend work to specialized agent: - -``` -http://localhost:8081/a2a/t-frontend-token/p-webapp-ui -``` - -## Docker Networking - -If running Agent Zero in Docker: - -- **Same Host:** Use `host.docker.internal:PORT` (macOS/Windows) or container networking (Linux) -- **Different Hosts:** Use the public IP or domain name of the target instance -- **Port Mapping:** Ensure the Agent Zero port is exposed in your Docker configuration - -## Security Considerations - -- **Token Protection:** Keep your API tokens secure - they provide full access to your Agent Zero instance -- **Network Access:** Consider using firewalls or reverse proxies to restrict A2A endpoint access -- **HTTPS:** For production deployments, use HTTPS to encrypt A2A communication -- **Credential Rotation:** Changing your password will invalidate all existing A2A connection URLs - -## Testing Your Connection - -You can test A2A connectivity using curl: - -```bash -curl -X POST http://localhost:8080/a2a/t-YOUR_TOKEN \ - -H "Content-Type: application/json" \ - -d '{"message": "Hello from another agent"}' -``` - -## A2A vs MCP - -| Feature | A2A | MCP | -|---------|-----|-----| -| **Purpose** | Agent-to-agent chat delegation | Tool/function access | -| **Use Case** | Long-running conversations | Specific tool calls | -| **Context** | Full chat context | Function parameters only | -| **Best For** | Workflow delegation | Tool integration | - -> [!TIP] -> Use A2A when you need another agent's reasoning and conversation capabilities. Use MCP when you just need access to specific tools or functions. - -## Troubleshooting - -### Connection Refused - -- Verify the A2A server is enabled in Settings -- Check that the Agent Zero instance is running -- Confirm the port is accessible (check firewall rules) - -### Invalid Token - -- Token may have changed due to credential updates -- Generate a new connection URL from Settings > MCP/A2A -- Update the connecting agent's configuration - -### Project Not Found - -- Verify the project name in the URL matches exactly -- Check that the project exists in the target instance -- Project names are case-sensitive - -## Advanced Configuration - -For detailed A2A protocol specifications, API examples, and integration patterns, see the [Advanced Connectivity Guide](../developer/connectivity.md). +version https://git-lfs.github.com/spec/v1 +oid sha256:7cd68eda8163a3b66370f1d5ab6ce146122a20ccdac07d910e073f6c57743316 +size 4939 diff --git a/docs/guides/agent-profiles.md b/docs/guides/agent-profiles.md index e08f0a1f55f3b21298a37ffae0ead9a3e85c62d7..2772f4c96e45fe4d57da5bad1a3fddcdd1cedd22 100644 --- a/docs/guides/agent-profiles.md +++ b/docs/guides/agent-profiles.md @@ -1,303 +1,3 @@ -# Agent Profiles and the Agent Editor - -Agent Profiles give a chat a repeatable role, set of instructions, model preset, -and capability policy. Use one when you want Agent Zero to work consistently as -a developer, researcher, reviewer, writer, or another specialist. - -The Agent Editor is deterministic: it does not call a model to interpret your -changes. It writes only the profile overrides shown in its Review page and -leaves the bundled profiles under `/a0/agents` unchanged. - -## Open the Agent Editor - -The profile menu is beside the chat input. - -![Profile menu with profile rows, Edit actions, and Manage agents](../res/usage/webui/agent-profile-selector.png) - -- Select a profile name to use it in the current chat. -- Select **Edit** on a row to open that profile in Easy mode. -- Select **Manage agents** to create, duplicate, reset, delete, or change the - availability of profiles. - -Changing the selected profile affects only that chat. To choose the profile for -future Global chats, open **Settings -> Agent Config**. - -## Create or edit a profile in Easy mode - -Open **Manage agents**, select **Create agent**, and complete the form: - -1. Choose **Global** to make the profile available everywhere, or choose a - project to keep the profile and its overrides in that project. -2. Enter the agent name. Agent Zero creates a stable profile ID from the name. -3. Optionally choose a color or image. -4. Select a model preset, or keep the current preset. -5. Write direct instructions: what the agent should do, how it should reason, - and how it should communicate. -6. Review the capability defaults and any individual Tool, MCP, or Skill - decisions. -7. Select **Create agent** or **Save changes**. - -![Easy mode with name, model preset, instructions, and capability defaults](../res/usage/webui/agent-editor-easy.png) - -Creating a profile opens a fresh chat with the new profile selected. Editing an -existing profile also offers **Save & test**, which saves and opens a fresh chat -for testing without changing the old chat's history. - -### Choose capability access - -Easy mode has separate default switches and expandable lists for **Tools**, -**MCPs**, and **Skills**. - -![Easy capability editor with Browser explicitly Off and other tools on Default](../res/usage/webui/agent-editor-easy-permissions.png) - -Each item has three states: - -| State | Meaning | -| --- | --- | -| **On** | Always allow this item for the profile. | -| **Default (on/off)** | Follow the category's **Allow ... by default** switch. | -| **Off** | Block this item for the profile. | - -Changing a category default affects current and future items that remain on -**Default**. Explicit **On** and **Off** decisions stay pinned. Tools and MCPs -have separate defaults even though their decisions are stored by the same Tool -Access policy owner. Skills use their own visibility policy. - -> [!NOTE] -> Skill access controls discovery and new loading. It does not remove skill -> text that is already part of a chat's saved history. - -## Manage existing profiles and project availability - -**Manage agents** shows the active profile and every profile available to the -selected scope. Use the **Project** selector before making a change. - -![Manage agents in Project Showreel with one profile unavailable only in that project](../res/usage/webui/agent-profile-manager.png) - -The row actions have distinct effects: - -| Action | Effect | -| --- | --- | -| Availability toggle | Show or hide the profile for selection and delegation in the selected scope. | -| **Duplicate** | Create an independent copy with a new ID. | -| **Reset to default** | Remove overrides from the selected scope; bundled originals remain. | -| Edit icon | Open the profile in the selected scope. | -| Delete icon | Permanently delete a custom profile after confirmation. | - -To stop a profile from being selected or delegated to in one project: - -1. Open **Manage agents**. -2. Choose the project. -3. Turn that profile's availability toggle off. - -The Global profile is not deleted or changed. Agent Zero keeps at least one -profile available in every scope; if a chat uses a profile that becomes -unavailable, it is reconciled to an available profile. - -## Advanced mode - -Select **Advanced** when you need more than the Easy form. The left navigation -separates six concerns: - -1. **Identity** — title, description, profile ID, delegation guidance, image, - and model preset. -2. **Prompt files** — edit individual inherited or customized Markdown prompt - files in the ACE editor. -3. **Tools** — search local and plugin tools and set their access policy. -4. **MCPs** — set access independently for tools discovered from MCP servers. -5. **Skills** — control which installed skills the profile can discover and - load. -6. **Review** — inspect the exact files that will be created, updated, or - deleted before saving. - -### Edit prompt files - -Choose a prompt file on the left. The editor shows its effective source and the -sparse customization path. **Reset to default** removes only your override for -that file. - -![Advanced Prompt files with the customization path and ACE editor](../res/usage/webui/agent-editor-advanced-prompts.png) - -### Review explicit capability decisions - -Advanced Tools, MCPs, and Skills use the same **On / Default / Off** semantics -as Easy mode, with search and origin filtering. Advanced mode can also show a -retained decision for an item that is not currently available, so you can clear -or change stale configuration. - -![Advanced Tools policy with Browser explicitly Off](../res/usage/webui/agent-editor-advanced-tools.png) - -### Review before saving - -Review is the source of truth for the save. If a file is not listed, the editor -will not write or delete it. - -![Advanced Review showing one exact sparse file update](../res/usage/webui/agent-editor-review.png) - -For a built-in profile, **Remove my changes** deletes only the selected scope's -overrides. Full deletion is offered only for custom profiles. - -## Use profiles from A0 CLI - -The [A0 CLI Connector](a0-cli-connector.md) exposes the same profile and -permission owners. - -```text -/profile -/profile Developer -/profile "Source Scout" "Verify every important claim and cite the source." -/permissions -``` - -- `/profile` opens the profile menu. Choose **Create profile** or **Edit current - profile** for a compact two-step editor. -- `/profile Developer` selects an existing profile by name or ID. -- `/profile "" ""` creates a profile in the current chat's - Global or project scope, then opens a fresh chat with it selected. -- `/permissions` edits Tools, MCPs, and Skills for the current profile. Each row - cycles through **Default**, **On**, and **Off**; Tools and MCPs have independent - defaults. - -![A0 CLI profile menu after quick-creating a profile](../res/usage/a0-cli/a0-cli-profile-menu.png) - -![A0 CLI confirmation after quick profile creation](../res/usage/a0-cli/a0-cli-profile-created.png) - -![A0 CLI permission editor for the current profile](../res/usage/a0-cli/a0-cli-permissions.png) - -The CLI derives scope from the current chat. It intentionally has no separate -scope selector: a project chat edits that project, while a chat with no project -edits Global. - -## Power-user file overrides - -Prefer the Agent Editor because it validates changes and shows the exact save -plan. If you manage files directly, use the same sparse layout and formats. - -| Scope | Writable profile root | -| --- | --- | -| Global | `/a0/usr/agents//` | -| Project | `/a0/usr/projects//.a0proj/agents//` | - -Never edit the bundled `/a0/agents/` files for a customization. -Create only the files and keys you need to override. - -```text -/ -├── agent.yaml -├── prompts/ -│ └── agent.system.main.specifics.md -└── plugins/ - ├── _model_config/config.json - ├── _tool_access/config.json - └── _skills/config.json -``` - -### Identity definition: YAML - -Authored profile definitions use YAML. A missing key inherits; an explicitly -empty value clears that field. - -```yaml -title: Source Scout -description: Researches technical claims and returns concise evidence. -context: Use this agent for source discovery and claim verification. -``` - -### Prompt overrides: Markdown - -Place a Markdown file under `prompts/` with the same filename as the prompt you -want to replace. Do not copy the whole prompt tree. For example: - -```text -prompts/agent.system.main.specifics.md -``` - -The Agent Editor's Prompt files page is the easiest way to discover available -filenames and the exact customization path. See the -[Prompts guide](https://www.agent-zero.ai/p/docs/prompts/) for the -prompt-loading model. - -### Tool and MCP policy: JSON - -Runtime and editor-written configuration uses JSON. Tools and MCPs share -`plugins/_tool_access/config.json`, but have independent defaults: - -```json -{ - "mode": "custom", - "default": "allow", - "mcp_default": "block", - "allowed": [ - "local:call_subordinate", - "mcp:deep_wiki:ask_question" - ], - "blocked": [ - "plugin:_code_execution:code_execution_tool" - ] -} -``` - -Canonical IDs use these forms: - -| Source | ID form | Example | -| --- | --- | --- | -| Core/local tool | `local:` | `local:call_subordinate` | -| Plugin tool | `plugin::` | `plugin:_code_execution:code_execution_tool` | -| MCP tool | `mcp::` | `mcp:deep_wiki:ask_question` | - -An ID in `allowed` is **On**; an ID in `blocked` is **Off**; an ID in neither -list follows `default` or `mcp_default`. Runtime-required response handling is -not offered as a configurable tool. - -MCP server definitions themselves still belong in **Settings -> MCP**. The -profile policy decides which discovered MCP tools the agent may use; it does -not create or connect an MCP server. See [MCP Setup](mcp-setup.md). - -### Skill visibility policy: JSON - -Skills use `plugins/_skills/config.json`. Keep the policy inside -`visibility_policy` so unrelated Skills settings remain intact: - -```json -{ - "visibility_policy": { - "mode": "custom", - "default": "allow", - "allowed": ["Research"], - "blocked": ["Deploy production"] - } -} -``` - -The entries are skill names or paths recognized by the Skills catalog. See the -[Skills guide](skills.md) for writing and installing skill definitions. - -### Model preset selection: JSON - -To pin a profile to an existing preset, use -`plugins/_model_config/config.json`: - -```json -{ - "model_preset": "Codex" -} -``` - -Use **Edit Presets** in the UI to author presets; profile configuration should -only select one. See [Model Presets](model-presets.md). - -## Profile, Skill, Project, or model preset? - -| Use this | When you want to change | -| --- | --- | -| **Agent Profile** | The agent's role, instructions, model choice, and allowed capabilities. | -| **Skill** | A specific procedure the agent can discover or keep active in a chat. | -| **Project** | Files, workspace, memory, instructions, secrets, and scoped overrides. | -| **Model Preset** | The model configuration used by a chat or profile. | - -For small local models that narrate instead of calling tools, use the bundled -**Tiny Local** profile or the project-scoped Prompt Include recipe in -[Local Model Tool Use](local-model-tool-use.md). - -For source-linked internals, use -[DeepWiki for Agent Zero](https://deepwiki.com/agent0ai/agent-zero). +version https://git-lfs.github.com/spec/v1 +oid sha256:c27c1c9135e4ee7548bd60ed7201944225d6fce7811a12187957b69dc9ac8e0f +size 11330 diff --git a/docs/guides/api-integration.md b/docs/guides/api-integration.md index 989ab5d05f3c13fac986c2ffa23a0322acb8b80e..7fed9122389590d10cd02873d724f597a4a80318 100644 --- a/docs/guides/api-integration.md +++ b/docs/guides/api-integration.md @@ -1,234 +1,3 @@ -# Adding External APIs Without Code - -One of Agent Zero's most powerful capabilities is the ability to integrate external APIs on the fly without writing any code. By simply providing API documentation or code snippets, the agent can learn to use new services and remember how to use them in future conversations. - -This tutorial demonstrates how to integrate Google's image generation API from Google AI Studio - but the same process works for any public API. - -## How It Works - -Agent Zero can: - -1. **Analyze API code** - Understand how to use an API from provided snippets or documentation -2. **Execute the integration** - Run the code to accomplish your task -3. **Remember the solution** - Store the approach in its memory for future use -4. **Manage credentials** - Use secrets stored globally or per-project for authentication - -This means you can add capabilities like image generation, translation services, payment processing, or any other API-based feature simply by showing the agent how it works once. - -## Example: Image Generation with Google AI Studio - -Let's walk through adding image generation capabilities using Google's Gemini API. - -### Step 1: Get the API Code - -First, we need the code snippet that shows how to use the API. - -1. Go to [Google AI Studio](https://aistudio.google.com/) -2. Use the interface to create or test an image generation prompt -3. Click **"Get Code"** in the UI -4. Select **"Python"** as the language -5. Download the code file (or copy it to clipboard) - -![Getting code from Google AI Studio](../res/usage/api-int/api-int-1.png) - -> [!TIP] -> Most API platforms (OpenAI, Anthropic, Replicate, etc.) provide similar "Get Code" features or have documentation with ready-to-use snippets. - -### Step 2: Provide the Code to Agent Zero - -Now we'll tell Agent Zero to use this code: - -1. Open a chat with Agent Zero -2. Send a message like: **"Use this code to generate an image of the Agent Zero logo"** -3. Either: - - Attach the downloaded Python file, or - - Paste the code snippet into the chat - -Agent Zero will analyze the code and understand: -- What dependencies are needed (`google-genai` package) -- How to structure the API request -- What parameters are required -- How to handle the response - -![Agent Zero analyzing the API code](../res/usage/api-int/api-int-2image-gen-api2.png) - -### Step 3: Configure API Credentials - -On first run, Agent Zero will attempt to use the API but discover it needs an API key: - -![Missing API key error](../res/usage/api-int/api-int-3-api-key-missing-secrets.png) - -Agent Zero will tell you: -- What credential is missing (e.g., `GEMINI_API_KEY`) -- Where to configure it (Settings → External Services or Project settings) - -#### Adding the API Key - -You have two options for storing credentials: - -**Option 1: Global Secrets** (available to all chats and projects) -1. Click the **Settings** icon in the sidebar -2. Go to **External Services** -3. Add a new line: `GEMINI_API_KEY=your_actual_key_here` -4. Click **Save** - -**Option 2: Project Secrets** (available only within a specific project) -1. Open your project settings -2. Go to the **Secrets** tab -3. Add the key-value pair -4. Save the project - -![Configuring the API key in settings](../res/usage/api-int/api-int-4-secrets-setting.png) - -> [!NOTE] -> Global secrets are ideal for APIs you use frequently across different projects. Project secrets are better for client-specific or project-specific integrations. - -### Step 4: Generate the Image - -After configuring the API key, tell Agent Zero to proceed: - -**"I set the API key in secrets. Now you can use it."** - -Agent Zero will: -1. Retrieve the API key from secrets -2. Install required dependencies (`google-genai` package) -3. Execute the image generation code -4. Save the generated image to disk -5. Report the file location - -![Successful image generation](../res/usage/api-int/api-int-5-finish.png) - -The agent confirms: -- Mission complete -- File location: `/root/agent_zero_logo_0.jpg` -- File size: 378 KB - -## How Memory Helps - -Agent Zero can save useful API patterns in memory so you do not have to explain -the same integration every time. - -For example, it may remember: - -- what the API is useful for; -- what credential name is needed; -- which package or example worked; -- how you prefer to use that service in this project. - -> [!IMPORTANT] -> Memory still needs curation. If Agent Zero keeps using an old API pattern, -> wrong credential name, or outdated package, open Memory and fix or remove that -> memory. Memory should help the agent think, not trap it in yesterday's answer. - -See the [Memory Guide](memory.md) for cleanup and curation tips. - -## Use Cases - -This approach works for any external API. Common examples: - -### Communication & Notifications -- **SendGrid**: Email delivery -- **Twilio**: SMS and phone calls -- **Slack/Discord**: Message webhooks -- **Telegram**: Bot interactions - -### Data & Analytics -- **Google Sheets API**: Spreadsheet automation -- **Airtable**: Database operations -- **Stripe**: Payment processing -- **Plaid**: Banking data - -### Content & Media -- **Unsplash/Pexels**: Stock photos -- **ElevenLabs**: Text-to-speech -- **Whisper API**: Speech-to-text -- **Stable Diffusion**: Image generation -- **Replicate**: Various AI models - -### Development Tools -- **GitHub API**: Repository management -- **Jira/Linear**: Issue tracking -- **Vercel/Netlify**: Deployment -- **Docker Hub**: Container registry - -### Specialized Services -- **WeatherAPI**: Weather data -- **Google Maps**: Geocoding, directions -- **Currency exchange**: Forex rates -- **Translation APIs**: Multi-language support - -## Best Practices - -### 1. Start with Official Examples - -Always use code snippets from official documentation or API providers' "Get Code" features. These are: -- Tested and working -- Up-to-date with latest API versions -- Include proper error handling -- Show recommended practices - -### 2. Organize Credentials - -**For personal/global APIs:** -- Store in **Settings → External Services** -- Use clear naming: `SERVICE_API_KEY`, `SERVICE_SECRET` -- Add comments to document what each key is for - -**For project-specific APIs:** -- Store in **Project Settings → Secrets** -- Keeps client data isolated -- Prevents accidental cross-project usage - -### 3. Document in Project Instructions - -When integrating APIs for a specific project, add notes to the project instructions: - -```markdown -## Available APIs - -This project has access to: - -- **Gemini Image Generation**: Use for creating visuals and illustrations - - Credentials: GEMINI_API_KEY (configured in project secrets) - - Best for: Professional graphics, concept art, UI mockups - -- **SendGrid Email**: Use for sending automated emails - - Credentials: SENDGRID_API_KEY - - Best for: Notifications, reports, customer communications -``` - -This helps the agent understand what tools are available for the current project. - -## Advanced: Custom API Wrappers - -For APIs you use frequently, you can have Agent Zero create reusable wrapper functions: - -**"Create a Python module called `image_gen.py` with a function `generate_image(prompt, style='professional')` that uses the Gemini API. Include error handling and save the image to the current project folder."** - -Agent Zero will: -1. Create a clean, reusable module -2. Add proper documentation -3. Include error handling -4. Make it easy to call from future tasks - -Then in future chats: - -**"Use the image_gen module to create a logo"**, and it just works! - -## Conclusion - -By showing Agent Zero a working API example, you can: - -- add a new service to a project; -- keep credentials in settings or project secrets; -- reuse working patterns later; -- clean up memory when an old pattern stops helping. - -This is not magic permanence. It works best when you keep the example, secrets, -project instructions, and memories tidy. - -## Related - -- [Memory Guide](memory.md) -- [Projects Guide](projects.md) -- [MCP Setup](mcp-setup.md) +version https://git-lfs.github.com/spec/v1 +oid sha256:88bc254e6c6fd5e40de3251425f3485866cc1bc966902e6ec50130284d88eae1 +size 7869 diff --git a/docs/guides/browser.md b/docs/guides/browser.md index 586384228834f0eaae8bbf4c99f8ce50e78e2472..595181ce486280f47c0eabaff3290570f4bbd922 100644 --- a/docs/guides/browser.md +++ b/docs/guides/browser.md @@ -1,247 +1,3 @@ -# Browser Guide - -Agent Zero has a built-in Browser for real web pages. - -Use it for research, forms, screenshots, UI review, downloads, extensions, and -anything else that works best in a browser. - -![Browser Canvas and tool history](../res/usage/browser/browser-canvas-wide.png) - -## Two Parts - -The Browser has two connected parts: - -- **The Browser tool:** the agent can browse even when the Browser surface is not open. -- **The Browser surface:** The right-side Canvas panel where you can watch and interact with the live Docker browser. - -The Browser surface does not open automatically every time the agent browses. -Open it when you want to watch, steer, or annotate the page. - -## Open The Browser Surface - -1. Open the right-side Canvas. -2. Select **Browser**. -3. Click **Open Browser** or the plus button to create a new browser tab. -4. Enter a URL in the Browser address bar. - -![Browser surface](../res/usage/browser/browser-canvas-example.png) - -The surface shows Browser tabs, back/forward/reload controls, an address bar, an annotation toggle, and Browser settings. - -## Ask The Agent To Browse - -You can ask naturally: - -```text -Use the Browser tool to open https://example.com, read the page content, and take a screenshot. Keep the response short. -``` - -The agent can: - -- open pages; -- read page content; -- click links and buttons; -- type into forms; -- upload files; -- take screenshots. - -When a page is read, Agent Zero gets simple references such as `[link 1]`, -`[button 2]`, or `[input text 3]`. It can use those references to act on the -right part of the page. - -
-Advanced Browser actions - -```text -list -state -set_active -navigate -back -forward -reload -hover -double_click -right_click -drag -scroll -evaluate -key_chord -mouse -wheel -keyboard -clipboard -set_viewport -multi -close -close_all -``` - -
- -![Browser tool history](../res/usage/browser/browser-tool-history-expanded.png) - -## Screenshots And History - -When Agent Zero takes a Browser screenshot, the image is saved and shown in the -chat history. - -Many Browser steps also keep a small history screenshot. That means an older -chat can show the page as it looked when the agent worked on it, not just the -latest page frame. - -## Annotate Pages - -Annotate mode lets you mark a page element or region and send a targeted comment back into the chat. This is useful for UI review: you can point at the exact thing that needs to change instead of describing it from memory. - -1. Open the Browser surface. -2. Navigate to the page you want to review. -3. Click **Annotate**. The button changes to **Annotating**. -4. Click the page element or region. -5. Write the comment and click **Add**. - -![Browser annotation](../res/usage/browser/browser-annotation-comment.png) - -## Browser Settings - -Open Browser settings from the Browser toolbar or from the Browser plugin settings. - -![Browser toolbar settings](../res/usage/browser/browser-toolbar-settings.png) - -The toolbar menu includes: - -- **Browser LLM Preset:** Optional model choice for Browser helper work. -- **Chrome Extensions:** Install a Chrome Web Store URL, create a new extension with Agent Zero, or scan an extension with Agent Zero. -- **Settings:** Opens the full Browser plugin settings. - -![Browser plugin settings](../res/usage/browser/browser-plugin-settings.png) - -The full settings include: - -- **Browser location:** Use the Docker browser or **Bring Your Own Browser** through A0 CLI. -- **Proxy:** Optionally route the Docker browser through an HTTP or SOCKS proxy, with bypass and authentication settings. -- **Page content access:** Controls host-browser page text and screenshots. -- **Starting page:** The default URL for new Browser sessions. -- **Autofocus active page:** Lets an already-open Browser surface follow the agent's browsing. -- **Extensions:** Choose which installed Chrome extensions load in the Docker browser. - -## Docker Browser - -The Docker browser is the default. It is a separate browser inside Agent Zero's -Docker environment, and it is the browser shown in the live Browser surface. - -Use Docker browser mode when you want a clean, separate browser that Agent Zero -can show in the Canvas. - -In normal Docker installs, the needed browser is already included. In local -development, Agent Zero can install it the first time it is needed. - -To use a proxy, enter its server in Browser settings, for example -`http://proxy.example:3128` or `socks5://proxy.example:1080`. Add an optional -comma-separated bypass list, username, and password when the proxy requires -them. Saving proxy changes restarts active Docker Browser sessions. - -## Bring Your Own Browser - -Bring Your Own Browser lets Agent Zero use Chrome, Edge, Brave, Opera, Vivaldi, -or Chromium on your own computer through A0 CLI. - -Use it when the page, login, or browser profile should stay on your machine. - -Requirements: - -- [ ] Keep A0 CLI connected to the Agent Zero chat. -- [ ] Choose **Bring Your Own Browser** in Browser settings. -- [ ] Use a Chromium-family browser on the host: Chrome, Edge, Brave, Opera, Vivaldi, or Chromium. -- [ ] For an already-open browser, open its remote debugging page and enable **Allow remote debugging for this browser instance**. - -Remote debugging pages: - -| Browser | Page | -| --- | --- | -| Chrome, Edge, Brave, Vivaldi, Chromium | `chrome://inspect/#remote-debugging` | -| Opera | `opera://inspect/#remote-debugging` | - -The **Host browser** list shows Automatic, currently advertised debug endpoints, -and **Custom endpoint**. If a browser does not appear after enabling remote -debugging, restart or reconnect the local A0 CLI. Restarting only the Agent Zero -Web UI server does not refresh the browser inventory; the list comes from the -connected CLI. - -As a fallback, launch the browser with an explicit debugging port and profile -directory: - -```bash -opera --remote-debugging-port=9222 --user-data-dir="$HOME/.config/a0-opera-debug" -``` - -Then choose **Custom endpoint** in Browser settings and enter `localhost:9222` -or `http://localhost:9222`. A full DevTools WebSocket endpoint also works. The -same forms can be passed to A0 CLI: - -```bash -export A0_HOST_BROWSER_REMOTE_DEBUGGING_ENDPOINTS="http://localhost:9222" -``` - -![Host browser remote debugging setting](../res/usage/browser/host-browser-remote-debugging-setting.png) - -The first time Agent Zero tries to operate that browser, Chrome shows an **Allow -remote debugging?** prompt. Click **Allow** if you trust the connected Agent Zero -instance and A0 CLI session. - -![Host browser remote debugging allow prompt](../res/usage/browser/host-browser-remote-debugging-allow.png) - -> [!IMPORTANT] -> Remote debugging grants full control of that browser session, including access -> to saved data, cookies, site data, and navigation. Enable it only for browser -> instances you intend Agent Zero to control. - -Browser settings decide what Agent Zero may do with page text and screenshots -from your own browser: - -- **Local models only:** Block host-browser content and screenshots unless the active chat model is local. -- **Warn when using cloud:** Allow content and include a warning. -- **Allow:** Allow without warning. - -> [!NOTE] -> The live Browser surface shows the Docker browser. When Agent Zero uses your -> host browser, page results and screenshots appear in the chat, but the live -> Canvas is not a stream of your personal browser window. - -For setup details, profiles, and troubleshooting, see the [A0 CLI Connector guide](a0-cli-connector.md#host-browser). - -## Chrome Extensions - -Browser can load Chrome extensions into the Docker browser. - -Only enable extensions you trust. They run inside the Docker browser, but they -can still change what happens in that browser. - -## MCP Alternatives - -Start with Agent Zero's built-in Browser. - -Use an MCP browser option only when you specifically need another browser tool -or an external automation service. - -Common alternatives include: - -- Chrome DevTools MCP -- Playwright MCP -- Browser OS MCP - -See [MCP Setup](mcp-setup.md) for MCP setup. - -## Troubleshooting - -- **Browser says Chromium is missing:** Docker installs already include the browser. In local development, let Agent Zero install it on first use or preinstall it with `PLAYWRIGHT_BROWSERS_PATH=tmp/playwright patchright install chromium --no-shell`. -- **The Browser surface does not open automatically:** That is expected. Open the Browser surface manually or ask the agent to show it. -- **The Canvas does not follow the agent:** Enable **Autofocus active page** in Browser settings. -- **Bring Your Own Browser cannot start:** Keep A0 CLI connected, verify Browser location is **Bring Your Own Browser**, and check `/browser status` in A0 CLI. -- **Host-browser content is blocked:** Switch to a local model or change Browser **Page content access** from **Local models only** to **Warn when using cloud** or **Allow**. - -## Related - -- [A0 CLI Connector](a0-cli-connector.md): host Browser setup, profiles, and CLI commands. -- [MCP Setup](mcp-setup.md): external browser tools when you need a different setup. -- [Desktop Guide](desktop.md): Linux GUI apps and LibreOffice Cowork in the Canvas. +version https://git-lfs.github.com/spec/v1 +oid sha256:d3dba34c4b0c1f7ed226853f167cc9ef3d7d96f2bc88e39e0dad3db486592aa8 +size 9078 diff --git a/docs/guides/contribution.md b/docs/guides/contribution.md index a56abcd7505215f59210c12f44495da226adae50..7fb4a31a382f965c1716d507d4ba0c983c5c8e28 100644 --- a/docs/guides/contribution.md +++ b/docs/guides/contribution.md @@ -1,57 +1,3 @@ -# Contributing to Agent Zero - -Contributions to improve Agent Zero are very welcome! This guide outlines how to contribute code, documentation, or other improvements. - -## Getting Started - -- See [Development Setup](../setup/dev-setup.md) for a local development environment. -- See [Create a Small Plugin](create-plugin.md) before building a new plugin. -- Use [DeepWiki for Agent Zero](https://deepwiki.com/agent0ai/agent-zero) for architecture and source-linked internals. - -1. **Fork the Repository:** Fork the Agent Zero repository on GitHub. -2. **Clone Your Fork:** Clone your forked repository to your local machine. -3. **Create a Branch:** Create a new branch for your changes. Use a descriptive name that reflects the purpose of your contribution (e.g., `fix-memory-leak`, `add-search-tool`, `improve-docs`). - -## Making Changes - -- **Code Style:** Follow the existing code style. Agent Zero generally follows PEP 8 conventions. -- **Documentation:** Update the documentation if your changes affect user-facing functionality. The documentation is written in Markdown. -- **Commit Messages:** Write clear and concise commit messages that explain the purpose of your changes. - -## Submitting a Pull Request - -1. **Push Your Branch:** Push your branch to your forked repository on GitHub. -2. **Create a Pull Request:** Create a pull request from your branch to the appropriate branch in the main Agent Zero repository. - - Search open and recently closed upstream PRs for overlapping work before opening a new one. - - Target the branch currently used for comparable active upstream contributions or explicit maintainer guidance. Do not assume `development` is always correct. - - Keep the source branch available on your fork until the pull request is merged or intentionally closed. -3. **Provide Details:** In your pull request description, clearly explain the purpose and scope of your changes. Include relevant context, test results, and any other information that might be helpful for reviewers. -4. **Address Feedback:** Be responsive to feedback from the community. We love changes, but we also love to discuss them! - -## Working With Forks Safely - -When contributing from a fork, prefer the standard GitHub flow: - -1. **Fork the repository publicly** if the branch may become the head branch of an upstream pull request. -2. **Add an `upstream` remote** that points to `agent0ai/agent-zero`. -3. **Sync your fork regularly** before starting new work so your branch starts from the current upstream target branch. -4. **Create one focused branch per change** (for example, one bugfix, one plugin, or one docs update). -5. **Open the pull request across forks** by explicitly selecting the upstream base repository/branch and your fork/compare branch. - -If your fork contains GitHub Actions workflows, be careful with GitHub's "Allow edits and access to secrets by maintainers" option. Only enable it when you are comfortable with maintainers editing workflow files on the fork branch. - -## Choosing The Right Publication Path - -- **Core bugfixes and docs for Agent Zero itself:** prepare them in a clean fork/clone of `agent-zero` and open a PR back to the upstream repository. -- **Community plugins:** publish the plugin in its own public repository, then submit it to [`agent0ai/a0-plugins`](https://github.com/agent0ai/a0-plugins). -- **Skills:** develop locally in `usr/skills/`, then move stable skills to `skills/` for Agent Zero contributions or publish them in a dedicated public repository/collection. -- **Private experiments, credentials, local R&D, or customer-specific assets:** keep them out of public forks and upstream pull requests. - -For a contributor-focused decision guide that covers fixes, plugins, skills, and -what should stay private, see [Sharing and Safety](../developer/sharing-and-safety.md). - -## Documentation Stack - -- Write local docs for practical setup, screenshots, and user workflows. -- Point architecture and deep internals to [DeepWiki](https://deepwiki.com/agent0ai/agent-zero). -- Use GitHub Flavored Markdown when it helps: tables, task lists, callouts, and fenced code blocks. +version https://git-lfs.github.com/spec/v1 +oid sha256:adf0181953982462af6cd21425cb003f56a7e6414c4a64413f1410bf17e48f78 +size 4108 diff --git a/docs/guides/create-plugin.md b/docs/guides/create-plugin.md index 53a43056b5665bad88991c0d680e991963d98076..ee962b1217d3b6fe6f9941cadbf14d14d2d7b485 100644 --- a/docs/guides/create-plugin.md +++ b/docs/guides/create-plugin.md @@ -1,158 +1,3 @@ -# Create A Small Plugin - -The fastest way to understand Agent Zero plugins is to make one small enough to -hold in your head. - -This guide walks through a real example: a local plugin named `unread_dot` that -adds a pulsing dot beside a chat when that chat receives new activity while you -are looking somewhere else. - -![Unread dot in the chat list](../res/usage/webui/unread-dot-chat-list.png) - -For architecture and source-linked internals, use -[DeepWiki for Agent Zero](https://deepwiki.com/agent0ai/agent-zero). This page -stays practical: what to ask, where files appear, what to check, and how to know -the plugin actually works. - -## What You Are Making - -`unread_dot` is intentionally tiny: - -- it does not add a server endpoint; -- it adds no tool; -- it installs no package; -- it makes no network calls; -- it touches only the Web UI and one browser `localStorage` key. - -That makes it a good first plugin. You can see the whole shape without learning -every plugin feature at once. - -## Ask Agent Zero To Build It - -Open a new chat and give Agent Zero a very specific plugin task: - -```text -Use the a0-create-plugin skill. - -Create a local-only plugin named unread_dot in /a0/usr/plugins/unread_dot. -The plugin should show a pulsing dot in the chat list whenever a non-selected -chat receives new agent activity. - -Keep it minimal and frontend-only: -- no external dependencies; -- no backend API; -- no tools; -- no network calls. - -If the plugin already exists, improve it instead of creating a duplicate. -When finished, run the a0-review-plugin skill on unread_dot and summarize -PASS/WARN/FAIL. Do not run CodeRabbit. -``` - -The important part is not the exact wording. The important part is giving Agent -Zero the plugin name, the location, the visible behavior, and the boundaries. - -## Where The Files Go - -Local plugins live under `/a0/usr/plugins//` inside the running -Agent Zero instance. For this example, the final plugin shape is: - -```text -/a0/usr/plugins/unread_dot/ -├── plugin.yaml -├── README.md -├── extensions/ -│ └── webui/ -│ ├── apply_snapshot_before/ -│ │ └── track-unread.js -│ └── initFw_end/ -│ └── bootstrap-unread-dot.js -└── webui/ - ├── unread-dot.css - └── unread-dot-store.js -``` - -`plugin.yaml` is the plugin's name tag: - -```yaml -name: unread_dot -title: Unread Dot -description: Shows a pulsing dot beside chats that received new activity while you were elsewhere. -version: 1.0.0 -settings_sections: [] -per_project_config: false -per_agent_config: false -``` - -The two Web UI extension files are the little doorways into the running -interface: - -- `initFw_end/bootstrap-unread-dot.js` loads the store and stylesheet after the Web UI starts. -- `apply_snapshot_before/track-unread.js` watches state snapshots so the plugin can notice when another chat changes. - -The store keeps the unread state. The CSS draws the dot. - -## Try It For Real - -After creating or changing a plugin, restart Agent Zero so the Web UI extension -list is rebuilt. - -Then test the behavior: - -1. Open a fresh chat. -2. Send a short prompt, such as: - - ```text - Please reply with one short sentence: unread dot live test complete. - ``` - -3. Immediately switch to another chat. -4. Wait for Agent Zero to keep working in the first chat. -5. Look at the chat list. - -If the first chat receives new activity while it is not selected, the dot appears. -When you open that chat again, the dot clears. - -This example watches for chat activity. In normal use, that means "the agent did -something in a chat you were not watching." It does not read every message in -every other chat. - -## Review It - -Run the plugin review skill before treating the plugin as done: - -```text -Use the a0-review-plugin skill to review /a0/usr/plugins/unread_dot. -Report PASS/WARN/FAIL by phase. -``` - -For this example, the review result is: - -| Phase | Result | Notes | -| --- | --- | --- | -| Manifest | PASS | `plugin.yaml` is valid, named correctly, and uses simple local settings. | -| Structure | PASS with WARN | The layout is standard. `LICENSE` is absent, which is fine locally but blocks Plugin Index submission. | -| Code patterns | PASS with WARN | The store uses Agent Zero's `createStore` pattern. The unread signal is chat activity, not a parsed message-author check. | -| Security and index | PASS with WARN | No secrets, subprocesses, dependencies, or outbound calls. The community index already has a related `Chat Status Marklet` plugin, so treat this as a learning example unless you make it clearly different. | - -Status: ready as a local demo plugin. Not ready as a new community submission -until it has a license and a reason to exist separately from similar plugins. - -## Make The Example Yours - -Once the small version works, change only one thing at a time: - -- move the dot to a different place in the row; -- use a badge instead of a dot; -- add a plugin setting for color or animation; -- show a different status for running chats and finished chats; -- turn the plugin into a publishable project with a `LICENSE`, screenshots, and a clearer README. - -Small plugins are good teachers. You can see the whole machine turning without -standing inside the engine. - -## Related - -- [Usage Guide](usage.md#plugins-and-plugin-hub): where plugins appear in the Web UI. -- [DeepWiki for Agent Zero](https://deepwiki.com/agent0ai/agent-zero): source-linked architecture when you need it. -- [Contributing Guide](contribution.md): expectations before sharing changes upstream. +version https://git-lfs.github.com/spec/v1 +oid sha256:50e234c4c41a995e78ea97c74bdef593f96a921f0533d6c4543a8edac3e49b7a +size 5529 diff --git a/docs/guides/desktop.md b/docs/guides/desktop.md index 144fcbb34773bdf3eca38e1d83baeb622a90c1c2..9cc59c1dd77fe1b80d9ed55cf7f99b7587e3f38c 100644 --- a/docs/guides/desktop.md +++ b/docs/guides/desktop.md @@ -1,126 +1,3 @@ -# Desktop Guide - -Agent Zero has its own Linux desktop inside the right-side Canvas. - -Open it by clicking the **Desktop** icon in the Canvas rail. The surface starts -an XFCE desktop that Agent Zero can also control when a task needs a real GUI. - -![Desktop Canvas](../res/usage/webui/desktop-canvas.png) - -Use the Desktop when the work is visual: opening Linux apps, inspecting files in -a file manager, checking a document layout, or LibreOffice Cowork. - -For architecture and source-linked internals, use -[DeepWiki for Agent Zero](https://deepwiki.com/agent0ai/agent-zero). This page -is the practical tour. - -## What The Desktop Is For - -The Desktop is a live Linux workspace. You can use it yourself, and Agent Zero -can use its Linux Desktop skill to observe the screen, act through the GUI, and -verify what changed. - -Good uses: - -- open the graphical file manager for `Workdir`, `Projects`, `Skills`, `Agents`, or `Downloads`; -- run Linux GUI apps that are available in the Agent Zero environment; -- open a terminal when a visual terminal session is useful; -- inspect or polish LibreOffice Writer, Calc, and Impress files; -- Cowork with the agent in a document, spreadsheet, or presentation. - -For normal web browsing, use the **Browser** surface instead of launching a -browser inside the Desktop. The Browser surface has dedicated page inspection, -screenshots, history, annotations, and host-browser support. - -## Start From The Canvas - -The Desktop lives next to the Browser surface in the Canvas. - -1. Open Agent Zero. -2. Click the **Desktop** icon on the right Canvas rail. -3. Wait for the desktop to finish starting. -4. Click **Open as window** if you want more room. - -The first start after an update can take longer while the Desktop gets ready. -After that, it normally opens much faster. - -## Create Or Open Files - -The Desktop toolbar has a **New** menu. - -![Desktop New menu](../res/usage/webui/desktop-new-menu.png) - -Use it to create: - -- **Markdown** for notes, drafts, and simple documents; -- **Writer** for LibreOffice text documents; -- **Spreadsheet** for LibreOffice Calc workbooks; -- **Presentation** for LibreOffice Impress decks. - -Use **Open** when you already have a file in the Agent Zero workspace. - -Agent Zero usually creates document files through its document tools first, then -lets you open them in the Desktop when you want to inspect or polish them. That -keeps content changes reliable while still giving you the full GUI when it -matters. - -## Cowork In LibreOffice - -LibreOffice Writer, Calc, and Impress run inside the Desktop. - -![Writer in Desktop](../res/usage/webui/desktop-writer.png) - -You can type directly in the app, save, rename, and close the file from the -Canvas header. Agent Zero can also work with the same file: it can create the -first draft, update cells, revise slides, or use the visible Desktop to check -layout before reporting back. - -Good prompts: - -```text -Create a Writer document for this meeting note and open it in Desktop so I can edit with you. -``` - -```text -Open this spreadsheet in Calc, add a small summary table, save it, and show me the result in Desktop. -``` - -```text -Create a short Impress deck, then use Desktop to check that the slides look clean. -``` - -For default formats, think: - -- Writer -> ODT; -- Calc -> ODS; -- Impress -> ODP. - -Ask for DOCX, XLSX, or PPTX only when you need Microsoft Office compatibility. - -## How Agent Zero Uses It - -When you ask for Desktop work, Agent Zero uses a careful loop: - -1. create or edit the file in the most reliable way; -2. open the Desktop only when the GUI is useful; -3. observe the visible state; -4. act through the app when needed; -5. save and verify the result. - -This means the Desktop is not just a remote screen. It is a shared workspace -where the agent can do GUI work and you can take over at any time. - -## Practical Tips - -- Use **Open as window** for large Writer, Calc, or Impress sessions. -- Save before closing if you edited by hand. -- Use Markdown for quick notes and drafts unless you need a LibreOffice file. -- Use Writer, Calc, or Impress when layout, formulas, charts, or slide polish matter. -- If a GUI app feels stuck, ask Agent Zero to verify the Desktop state before continuing. -- Keep the Browser surface for websites and the Desktop surface for Linux apps. - -## Related - -- [Browser Guide](browser.md): web pages, screenshots, annotations, and host-browser mode. -- [Memory Guide](memory.md): what to check when behavior keeps repeating in an unwanted way. -- [Usage Guide](usage.md): the main Web UI workflows in one guided tour. +version https://git-lfs.github.com/spec/v1 +oid sha256:97829d5780d791be41a5881e48de486a987030580bde26c9f074bbb29e5ac0ec +size 4535 diff --git a/docs/guides/launcher.md b/docs/guides/launcher.md index 2036eb88ea49d8475816ba03458518378fce68b8..674d7925a7454977edd94daf4e51f995b67113ff 100644 --- a/docs/guides/launcher.md +++ b/docs/guides/launcher.md @@ -1,177 +1,3 @@ -# Agent Zero Launcher - -Agent Zero Launcher is the desktop app for installing, running, switching, and -opening Dockerized Agent Zero Instances without starting from Docker commands. - -Use it when you are setting up a new machine, when you want a quiet inventory of -installed Agent Zero images, or when you want one place to open local and remote -Instances. - -## Start Fresh On A New Machine - -1. Download Agent Zero Launcher from the - [A0 Launcher releases](https://github.com/agent0ai/a0-launcher/releases). -2. Open the app. -3. If the launcher cannot reach Docker yet, follow the setup dialog. -4. If Agent Zero is already hosted on another computer or VPS, click - **Add remote Instance** instead of setting up local Docker. - -![Launcher runtime setup dialog](../res/usage/launcher/launcher-runtime-setup.png) - -The first setup dialog keeps the choice simple: - -- **Continue** starts the local runtime setup or refreshes the runtime state. -- **Refresh** checks again after you start Docker yourself. -- **Add remote Instance** saves an existing Agent Zero URL and lets you use the - Launcher without local Docker. - -## Installs - -When Docker is ready, Launcher opens to **Installs**. This page shows official -Agent Zero release lines and local images. - -![Launcher Installs view](../res/usage/launcher/launcher-installs.png) - -Cards usually mean: - -- **latest** tracks the newest published Agent Zero release image. -- **ready** tracks the development-ready image when you intentionally work from - that branch. -- Version cards such as **1.20**, **1.19**, or **1.18** are pinned release - images. -- **Install** downloads an image. -- **Run** starts an installed image as a local Instance. - -## Instances - -Open **Instances** after you run Agent Zero. This is where local containers and -saved remote Instances live. - -Use the Instance card to: - -- open the Web UI; -- start, stop, rename, or delete the container; -- open logs; -- use **Backup `/a0/usr`** to download the same user-data backup you can create - from Agent Zero Core; -- use **Restore `/a0/usr`** to restore that backup zip into the selected - Instance; -- open A0 CLI when the host connector is installed. - -Launcher keeps local Instances and remote Instances separate, so deleting a -container is not the same as deleting a saved remote URL or a workspace backup. - -## Updating With Launcher - -For same-major Agent Zero updates, the Web UI **Self Update** is still the -normal path. - -For a major image jump such as v1.20 -> v2.0, use Launcher or Docker to start a -new v2.0 Instance, then restore a backup from the old Instance. In Launcher, the -flow is: **Instances -> Backup `/a0/usr`** on the old v1.20 Instance, **Installs --> latest -> Install/Run**, then **Instances -> Restore `/a0/usr`** on the new -v2.0 Instance. This avoids mixing an old root install with a new Docker image. - -See [Updating from v1.20 to v2.0](../setup/installation.md#updating-from-v120-to-v20). - -## Capture Launcher Screenshots With Playwright - -Launcher is an Electron app, so browser-only Playwright commands are not enough. -Use Playwright's Electron bridge and the local Electron binary from the Launcher -repo. - -The pattern below installs Playwright into a temporary folder outside the repo, -launches local Launcher content, waits for the `a0app://content/` window, and -saves a screenshot. - -```bash -mkdir -p /tmp/a0-launcher-playwright -npm install --prefix /tmp/a0-launcher-playwright playwright -``` - -```bash -NODE_PATH=/tmp/a0-launcher-playwright/node_modules node <<'JS' -const { _electron: electron } = require("playwright"); - -const launcher = "/home/eclypso/a0/a0-launcher"; -const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); - -(async () => { - const app = await electron.launch({ - executablePath: `${launcher}/node_modules/electron/dist/electron`, - args: [launcher], - env: { - ...process.env, - A0_LAUNCHER_LOCAL_REPO: launcher, - ELECTRON_DISABLE_SECURITY_WARNINGS: "true", - }, - }); - - const windows = []; - app.on("window", (page) => windows.push(page)); - windows.push(await app.firstWindow()); - - let page = null; - const deadline = Date.now() + 45000; - while (Date.now() < deadline && !page) { - page = windows.find((item) => - item && !item.isClosed() && item.url().startsWith("a0app://content/") - ) || null; - if (!page) { - await app.waitForEvent("window", { timeout: 1000 }) - .then((item) => windows.push(item)) - .catch(() => null); - await sleep(250); - } - } - - if (!page) throw new Error("Launcher content window did not open"); - - await page.waitForLoadState("networkidle", { timeout: 10000 }).catch(() => null); - await sleep(3000); - await page.screenshot({ - path: `${launcher}/output/playwright/launcher-installs.png`, - fullPage: false, - }); - await app.close(); -})(); -JS -``` - -For docs screenshots that show the first-run runtime gate without changing the -real machine state, open the real Launcher page and render the real runtime-gate -component with a minimal demo state: - -```js -await page.evaluate(async () => { - const { renderRuntimeGate } = await import( - "a0app://content/components/docker-manager/runtime-gate/runtime-gate.js" - ); - - renderRuntimeGate({ - stateLoaded: true, - dockerAvailable: false, - runtime: { - platform: "linux", - state: "not_provisioned", - action: "install", - canProvision: true, - setupActionLabel: "Setup Agent Zero", - detail: "No local container runtime was found.", - }, - versions: [{ id: "latest", availability: "available" }], - images: [], - containers: [], - remoteInstances: [], - }, { - refresh() {}, - provisionRuntime() {}, - openDockerDownload() {}, - addRemoteInstance() {}, - }); -}); - -await page.locator(".dm-runtime-gate").screenshot({ - path: "/home/eclypso/a0/a0-launcher/output/playwright/launcher-runtime-setup.png", -}); -``` +version https://git-lfs.github.com/spec/v1 +oid sha256:6a14c0157b76021fcacb7ebf2d91b48db894fb24b3e7fdc3c9a0d5160ce1eedd +size 5861 diff --git a/docs/guides/local-model-tool-use.md b/docs/guides/local-model-tool-use.md index 803583b7764d956165cf192e60881ca9006d7090..6184a6a00d0d0044891cdf4bfebe26dd5e5bf3b8 100644 --- a/docs/guides/local-model-tool-use.md +++ b/docs/guides/local-model-tool-use.md @@ -1,65 +1,3 @@ -# Local Model Tool Use - -Small local models can struggle with Agent Zero's full default communication shape. The safest first fix is prompt/profile/plugin-only: use a smaller behavior contract while leaving Agent Zero's core parser and execution code unchanged. - -Use this guide for Ollama, LM Studio, Qwen, and similar local chat models when the model explains commands instead of calling tools. - -## Use The Tiny Local Profile - -Choose the **Tiny Local** profile when starting or switching a chat that uses a small local model. - -The bundled profile lives at: - -```text -agents/tiny-local/ -``` - -Tiny Local keeps the normal Agent Zero tool-call shape, but removes visible reasoning fields from the communication prompt. It tells the model to emit one executable JSON object with `tool_name` and `tool_args`. - -## Use A Project Prompt Include - -If you want to keep your current profile, create a project-local file that matches the Prompt Include plugin pattern (`*.promptinclude.md`): - -```text -local-model-tool-use.promptinclude.md -``` - -Put this content in that file: - -```markdown -## Local model tool-use discipline - -You are Agent Zero. Act on the user's behalf. - -When the user asks you to do something, do it directly. Do not explain how the user could do it themselves. - -Your visible assistant message must be exactly one valid JSON object. - -Use exactly these top-level fields: `tool_name` and `tool_args`. - -Do not include markdown fences, prose before the JSON, prose after the JSON, hidden reasoning, analysis, thoughts, or headlines. - -Choose a tool from the tools listed in the system prompt. Do not invent tool names, action names, or generic names such as `read`, `write`, `terminal`, or `multi`. - -For a final user-facing answer, use the `response` tool: - -`{"tool_name":"response","tool_args":{"text":"Done."}}` - -Use `response` only when the work is complete, blocked, or no tool is needed. If the user says "proceed", "continue", "go ahead", or similar after the agent named a next step, call the next appropriate tool instead of replying with a promise or status update. - -For work that requires a command, file action, browser action, or any other available tool, call the appropriate tool immediately. - -If the framework warns that your prior message was malformed, repeated, or reasoning-only, output a corrected JSON tool request immediately without explaining the warning. -``` - -## Keep This Prompt-Only - -Do not change `agent.py` for this workflow. - -Do not change `helpers/extract_tools.py` for this workflow. - -Do not create parser repair code for this workflow. - -Do not add duplicate execution suppression, LiteLLM transport changes, memory runtime changes, or text-editor file operation changes for this workflow. - -If a specific local model still cannot follow the prompt/profile/plugin-only contract, capture the exact model, prompt, response, and tool warning before considering deeper framework changes. +version https://git-lfs.github.com/spec/v1 +oid sha256:982541be643777705e4de0ed85c2dd940e14632275482dc8a15943a70200507c +size 2912 diff --git a/docs/guides/mcp-setup.md b/docs/guides/mcp-setup.md index d4551b850a1d578a8f8a34258fc5d4c6f3899759..52d7309e4ad1844d666df1627286f3b75ea6024a 100644 --- a/docs/guides/mcp-setup.md +++ b/docs/guides/mcp-setup.md @@ -1,173 +1,3 @@ -# MCP Setup - -MCP lets Agent Zero use tools from other apps and services. - -Think of each MCP connection as a bridge. One bridge might connect Gmail, -another might connect a database, and another might connect an automation app. - -Use MCP when you have a clear external tool you want Agent Zero to call. For -normal browsing, start with Agent Zero's built-in Browser first. - -> [!NOTE] -> This page is about giving Agent Zero tools from other apps. For deeper MCP -> details, see the [advanced MCP reference](../developer/mcp-configuration.md). - -## When To Use MCP - -| Need | Good first stop | -| --- | --- | -| Browse, screenshot, annotate, or use the Docker browser | [Browser Guide](browser.md) | -| Use your host Chrome-family browser through A0 CLI | [A0 CLI Connector](a0-cli-connector.md#host-browser) | -| Connect a third-party app or service with MCP support | This guide | -| Paste or review MCP JSON by hand | [Advanced MCP Configuration](../developer/mcp-configuration.md) | - -## Before You Add One - -- [ ] You know what app or service you want to connect. -- [ ] You trust the package or URL. -- [ ] You know where it will run: inside Agent Zero, on your computer, or online. -- [ ] You have any needed credentials ready. -- [ ] You know whether the tool should be project-specific or global. - -## Open MCP Settings - -1. Click **Settings** in the sidebar. -2. Open the **MCP/A2A** tab. -3. Find **External MCP Servers**. -4. Click **Open**. - -![MCP Configuration Access](../res/setup/mcp/mcp-open-config.png) - -## Add A Connection - -The configuration editor accepts JSON. A command-based MCP connection looks like -this: - -```json -{ - "mcpServers": { - "chrome-devtools": { - "command": "npx", - "args": ["-y", "chrome-devtools-mcp@latest"] - } - } -} -``` - -![MCP Configuration Example](../res/setup/mcp/mcp-example-config.png) - -Click **Apply now** after editing. - -> [!TIP] -> The first launch of an `npx` or `uvx` server can take a little longer because -> the package may need to download. - -## Check That It Connected - -After applying the config, look for the status below the editor. - -| Signal | What it means | -| --- | --- | -| Name | The connection Agent Zero found. | -| Tool count | How many tools are available. | -| Green status | The connection is working. | -| Error text | The command, URL, network, or credentials need attention. | - -After the connection works, Agent Zero discovers the MCP tools. The active -Agent Profile's MCP policy still decides which discovered tools it may use. Use -**Edit agent -> MCPs** to keep the category default or set an individual tool -to **On** or **Off**. See [Agent Profiles](agent-profiles.md#choose-capability-access). - -You can still ask naturally: - -```text -Use the connected Gmail tools to find the last message from Alice and summarize it. -``` - -## Common Examples - -### Tool Started By A Command - -Use this pattern when Agent Zero should start the tool itself. - -```json -{ - "mcpServers": { - "sqlite": { - "command": "uvx", - "args": ["mcp-server-sqlite", "--db-path", "/root/db.sqlite"] - } - } -} -``` - -### Tool At A URL - -Use this pattern when the tool is already running at a URL. - -```json -{ - "mcpServers": { - "external-api": { - "url": "https://api.example.com/mcp", - "headers": { - "Authorization": "Bearer YOUR_API_KEY" - } - } - } -} -``` - -> [!IMPORTANT] -> Do not paste real API keys into public files, screenshots, or issue reports. -> Prefer project secrets or environment variables when possible. - -## Docker Networking - -If Agent Zero runs in Docker and the MCP tool runs somewhere else, the address -matters. - -| Where the MCP tool runs | What to use from Agent Zero | -| --- | --- | -| Host machine on macOS or Windows | `host.docker.internal` | -| Another container | Same Docker network plus the container name | -| Remote server | The reachable HTTPS URL | -| Inside Agent Zero's container | Local command config | - -On Linux, `host.docker.internal` is not always available by default. Running the -MCP tool in the same Docker network is usually cleaner. - -## Browser MCP Or Built-In Browser? - -For most browsing tasks, use Agent Zero's built-in `_browser` plugin and direct -`browser` tool. It covers the Docker browser surface, screenshots, annotations, -Chrome extensions, and optional A0 CLI host-browser mode. - -MCP-based browser tools are still useful when another browser tool is required -for a specific workflow. - -See the [Browser Guide](browser.md) for the built-in workflow. - -## Recommended Server Types - -| Tool type | Useful for | -| --- | --- | -| Chrome DevTools MCP | Direct Chrome debugging/control workflows | -| Playwright MCP | Alternative browser automation stacks | -| n8n MCP | Workflow automation | -| Gmail MCP | Email workflows | -| VS Code MCP | IDE-centered workflows | - -## Troubleshooting - -- **No tools appear:** confirm the JSON is valid and click **Apply now** again. -- **Command not found:** install the command where Agent Zero can run it, or use a URL-based tool instead. -- **Package launch is slow:** wait for the first package download to finish. -- **Host service unreachable:** check Docker networking and try `host.docker.internal` on macOS or Windows. -- **Credentials fail:** rotate or re-enter the credential, then restart or reapply the config. - -## Related - -- [Browser Guide](browser.md): built-in browsing, screenshots, annotations, Docker browser, and host-browser mode. -- [A0 CLI Connector](a0-cli-connector.md): host-machine access and Bring Your Own Browser setup. -- [Advanced MCP Configuration](../developer/mcp-configuration.md): complete configuration reference. +version https://git-lfs.github.com/spec/v1 +oid sha256:102c70597bd968f8f45f021b0f73ead9d8fb5bb874f6e9c8bc6bf8e15b83b98f +size 5571 diff --git a/docs/guides/memory.md b/docs/guides/memory.md index 8f32da923323a5ff352ba6cbfefda37d1ba02d60..cdefbc954db1fbb9fa84c9f9fdfe33d4fc8fcbd6 100644 --- a/docs/guides/memory.md +++ b/docs/guides/memory.md @@ -1,142 +1,3 @@ -# Memory Guide - -Agent Zero can remember useful facts, solutions, preferences, and imported -knowledge so future chats do not always start from zero. - -That power needs curation. Long-term AI memory is not a solved problem, even for -large AI labs and companies. A memory system can help the agent become more -useful, but it can also preserve stale assumptions, wrong conclusions, old test -data, or instructions that no longer fit. A sustainable memory system needs some -human gardening. - -When Agent Zero does something unexpected, keeps repeating a bad habit, or seems -strangely confident about the wrong thing, Memory is one of the first places to -look. - -## Open Memory - -Open **Memory** from the dashboard or sidebar. - -![Memory dashboard](../res/usage/memory-dashboard.png) - -The dashboard shows remembered entries and imported knowledge chunks. Each row -has metadata, a content preview, copy and delete actions, and a detail view. - -## Search And Filter - -Use the controls at the top to narrow what you are looking at. - -![Memory dashboard controls](../res/usage/webui/memory-dashboard-controls.png) - -The most useful controls are: - -- **Memory Directory:** choose the memory store you want to inspect. -- **Area:** filter between `main`, `fragments`, `solutions`, and `skills`. -- **Search:** find memories related to a phrase, behavior, project, tool, error, or preference. -- **Threshold:** adjust how strict the similarity match should be. -- **Limit:** control how many results are returned. -- **Clear:** reset the filters. - -Start with ordinary words. If Agent Zero keeps using the wrong command, search -for the command. If it keeps assuming the wrong project rule, search for the -rule, client name, repo name, or phrase it keeps repeating. - -## Inspect And Edit - -Click a memory row to open its details. - -![Memory editing](../res/usage/memory-editing.png) - -In the detail view you can: - -- read the full content; -- check whether it came from conversation memory or imported knowledge; -- copy the memory with metadata; -- copy only the content; -- edit the text; -- delete the entry. - -Edit a memory when it is almost right but needs correction. Delete it when it is -wrong, obsolete, duplicated, too vague, or harmful to future reasoning. - -## What To Keep - -Good memories are durable and useful: - -- stable user preferences; -- project-specific conventions; -- commands that were verified and still apply; -- decisions that should persist across chats; -- known solutions to recurring problems; -- important constraints that are not obvious from files alone. - -Good memory reads like a note you would happily give a future teammate. - -## What To Remove - -Remove or rewrite memories that are likely to poison future processing: - -- stale setup instructions; -- old paths, ports, service names, or commands; -- temporary experiments; -- failed guesses saved as facts; -- outdated project decisions; -- broad personality instructions that make the agent overcorrect; -- private data that should not have been remembered; -- memories copied from a confused or interrupted chat. - -The danger is not that one bad memory always wins. The danger is that it becomes -one more piece of "evidence" nudging the agent in the wrong direction again and -again. - -## When Behavior Looks Wrong - -Check Memory early when Agent Zero: - -- keeps following an old instruction after you corrected it; -- keeps using a tool, path, or workflow you no longer want; -- mixes two projects together; -- remembers a false preference; -- repeats a wrong explanation; -- ignores current project instructions in favor of old context; -- acts as if a test result or setup step happened when it did not. - -A good debugging loop is: - -1. Search Memory for the repeated behavior or phrase. -2. Open likely entries and read the full content. -3. Edit entries that are useful but inaccurate. -4. Delete entries that are simply wrong. -5. Run the task again with a clear correction in the chat. - -## Use Project Memory For Project Context - -Keep project-specific memories in the project where they belong. Client rules, -repository conventions, local commands, and workflow preferences should not leak -into unrelated work. - -If Agent Zero is mixing contexts, check whether the memory belongs in global -memory or project memory. Moving from "global forever" to "this project only" is -one of the simplest ways to keep the system sane. - -## Be Careful With Bulk Cleanup - -The dashboard can select multiple rows and copy, export, or delete them. - -Before deleting many memories: - -- export or back up important entries; -- search narrowly instead of deleting by broad category; -- delete obvious junk first; -- keep useful solutions even if they are old; -- avoid wiping imported knowledge unless you know how to rebuild it. - -Memory curation is not about making the database empty. It is about keeping the -right signal and removing the noise that makes the agent less trustworthy. - -## Related - -- [Usage Guide](usage.md): where Memory fits in the everyday Agent Zero workflow. -- [Projects Guide](projects.md): how project memory keeps client, repo, and task context separated. -- [Troubleshooting](troubleshooting.md): quick checks when Agent Zero behaves unexpectedly. -- [Backup And Restore](usage.md#backup-and-restore): what to do before large memory cleanup. +version https://git-lfs.github.com/spec/v1 +oid sha256:e34f48de422d1127e7ee98feabc53605fbaf9025d6cb04c26831861e034fe21a +size 5255 diff --git a/docs/guides/model-presets.md b/docs/guides/model-presets.md index 0bf3e317a508473463b66bf5fcadce1b8040a92b..2224f5c562a36f688c7f520537d499b8147c31fd 100644 --- a/docs/guides/model-presets.md +++ b/docs/guides/model-presets.md @@ -1,115 +1,3 @@ -# Model Presets - -Model Presets are named, reusable model setups. Every setup contains a main, -utility, and embedding model. - -Use them when you want to switch a chat between setups such as "fast", "cheap", -"local", "balanced", or "maximum power" without rebuilding the settings each -time. - -## Choose A Preset - -The preset menu is the first dropdown on the left side of the chat status bar. -Its closed label shows the preset and the short main-model name, without the -provider prefix. - -![Model preset selector](../res/usage/webui/model-preset-selector.png) - -1. Open a chat. -2. Click the current preset name. -3. Choose the preset you want. - -The selected preset affects the current chat. Choose **Use scoped preset** to -return the chat to the default selected for its project and agent profile. If no -more specific choice exists, Agent Zero uses the global preset. - -The **Default** preset is always available. You can edit its models, but you -cannot rename or delete it. - -## Initial Presets - -When no saved preset collection exists at startup, Agent Zero downloads the -curated **Default**, **Efficiency**, and **Power** presets from the public -[`agent0ai/a0-presets`](https://github.com/agent0ai/a0-presets) repository. If -GitHub is unavailable or the file is invalid, Agent Zero saves its bundled -plugin fallback instead. Existing saved presets short-circuit this check and -are never replaced. - -## Edit Presets - -Click **Edit presets** from the same menu. - -From this screen you can: - -- rename presets; -- choose the main model; -- choose the utility model; -- choose the embedding model; -- enter the shared API key for each model provider; -- open API key settings; -- add or delete presets (except **Default**); -- save the preset list. - -Think of a preset as a label on a model setup. - -| Field | Simple meaning | -| --- | --- | -| **Main model** | The model that does the main conversation and reasoning. | -| **Utility model** | A smaller helper model for lighter internal tasks. | -| **Embedding model** | The model that creates vectors for memory and knowledge retrieval. | - -The editor presents each preset as one complete setup. Internally, an existing -non-default preset may inherit omitted advanced values from **Default**. - -## Add A Preset - -Click **Add**, give it a name, choose models, then click **Save**. - -Good preset names are easy to spot quickly: - -- `Max Power` -- `Balanced` -- `Fast Cheap` -- `Local Private` -- `GPT-5 Mini` -- `Claude Opus` -- `Kimi Budget` - -Some people prefer names based on purpose. Others prefer names that look like -the model they use most. Both are fine. The important thing is that your eyes -can find the right option quickly. - -## A Simple Starting Set - -If you are not sure what to create, start with three presets: - -| Preset | Use it for | -| --- | --- | -| **Best** | Hard work where quality matters more than cost or speed. | -| **Balanced** | Everyday chats, coding, writing, and research. | -| **Cheap** | Simple tasks, quick drafts, summaries, and tests. | - -You can always rename them later. - -## Choose Defaults For New Chats - -In **Settings → Agent → Models**, choose the global preset used by new chats. -The summary shows its main, utility, and embedding models. Changing it also -applies that preset to the currently open chat. - -Use **Per-project / agent** to open the full Model Configuration plugin. Its -scope selector lets you choose a different default preset for a project, an -agent profile, or their combination. These scopes store only the preset choice; -editing a preset updates every scope that uses it. - -## How Presets Fit With Other Controls - -| Control | What it changes | -| --- | --- | -| **Model Preset** | Which main, utility, and embedding models power the chat. | -| **Agent Profile** | The agent's role, tone, and prompt behavior. | -| **Project** | Workspace, files, memory, secrets, and project instructions. | -| **Skill** | A specific procedure added to prompt protocol. | - -For example, you can use the same "Researcher" Agent Profile with a cheaper -preset for simple questions and a stronger preset for difficult investigations. +version https://git-lfs.github.com/spec/v1 +oid sha256:ee70668e4cfe3400529e6f9fe45a9fa2b2e2080f681e7b2dfdc3b2ecbae23e4b +size 4072 diff --git a/docs/guides/onboarding.md b/docs/guides/onboarding.md index 1b98791906daa51364bc1b69192e37a6ac564285..04e9e019ce54d37762d2ce8a758bbd12781269dc 100644 --- a/docs/guides/onboarding.md +++ b/docs/guides/onboarding.md @@ -1,71 +1,3 @@ -# First-Run Onboarding - -Use onboarding the first time you open Agent Zero, or any time the Web UI says -your models still need setup. The wizard helps you pick Cloud, AI account, or -Local access, configure a main model, choose a utility model, and start -chatting. - -This example uses **OpenRouter** with a masked demo key. Replace the demo key -with your own key. - -## Open Onboarding - -Open the Web UI. The welcome screen can show account shortcuts, and the message -composer is ready immediately. - -![Welcome screen with account and channel setup cards](../res/usage/onboarding/onboarding-start.png) - -If you send a message before models are configured, Agent Zero creates the chat, -holds the message, and shows the model gate inside the conversation. Choose -**Cloud provider**, **AI account**, or **Local model** to open onboarding. - -![Chat model gate with Cloud provider, AI account, and Local model choices](../res/usage/onboarding/onboarding-model-gate.png) - -## Choose A Provider Path - -Choose **Cloud** when you want to paste an API key for OpenRouter, OpenAI, -Anthropic, Google, Venice, or another hosted provider. - -![Cloud provider picker with hosted providers](../res/usage/onboarding/onboarding-cloud-provider.png) - -Choose **Account** when you want to sign in with Codex/ChatGPT, GitHub Copilot, -Google Cloud Gemini, or xAI Grok instead of pasting a provider key. - -![AI account picker with Codex, Copilot, Google Cloud Gemini, and Grok](../res/usage/onboarding/onboarding-account-provider.png) - -Choose **Local** when you want to connect to Ollama, LM Studio, oMLX, llama.cpp, -vLLM, or another model server running on your machine. - -![Local model provider picker with Ollama, LM Studio, oMLX, llama.cpp, and vLLM](../res/usage/onboarding/onboarding-local-ollama-main.png) - -## Configure The Main Model - -For API-key providers, choose the main model and paste the provider key. The -screenshot uses a masked demo key. - -![OpenRouter setup with main model and masked API key](../res/usage/onboarding/onboarding-agent-zero-api-key-model.png) - -After the main model is selected, click **Choose utility model**. - -## Choose The Utility Model - -The utility model handles quick internal tasks such as summaries, naming, and -memory. A small, fast, cheap model usually works best here. The wizard may -prefill a utility provider and model, but it remains an explicit choice. - -![Utility model step with OpenRouter and a fast Gemini model](../res/usage/onboarding/onboarding-utility-same-model.png) - -Click **Finish setup** when the utility model looks right. - -## Start Chatting - -The ready screen confirms that model setup is done. Optional setup cards may -appear for integrations such as Telegram, Email, WhatsApp, or plugins. - -![Onboarding ready screen after setup](../res/usage/onboarding/onboarding-ready.png) - -Click **Start Chatting** to create a chat and begin using Agent Zero. - -> [!IMPORTANT] -> Do not reuse the fake key shown in this guide. Paste your own provider key, -> and do not share screenshots that reveal real keys or private account details. +version https://git-lfs.github.com/spec/v1 +oid sha256:cd8fa84191fd9cafe151594c81c6ef9f18bf14c0705e5f880ec7a5cca09b9fbc +size 3041 diff --git a/docs/guides/projects.md b/docs/guides/projects.md index c012826c7f15691fc06bb4bf950e2ba0bf95a336..d32e5260a22263d6b2d00dba825feda8b8899387 100644 --- a/docs/guides/projects.md +++ b/docs/guides/projects.md @@ -1,201 +1,3 @@ -# Projects - -Projects tell Agent Zero what world it is working in. - -Use a project when you want a chat to have its own purpose, instructions, files, -memory, secrets, and model choices. A project can be a client, a codebase, a -research topic, a recurring workflow, or any other focused workspace. - -![Projects list](../res/usage/webui/projects-list-created.png) - -## When To Use One - -Create a project when you want Agent Zero to remember context that should not -leak into every other chat. - -Good project examples: - -- A Git repository you want Agent Zero to work on. -- A client workspace with its own tone, files, and credentials. -- A research topic with its own sources and notes. -- A recurring report that always follows the same steps. -- A documentation workspace with a clear writing style. - -Stay in a normal chat when the task is quick, disposable, or unrelated to a -larger body of work. - -## Open Projects - -From the dashboard, click **Projects**. - -![Dashboard projects card](../res/usage/webui/dashboard.png) - -If you have no projects yet, the list starts empty and offers **Create -project**. - -![Empty projects list](../res/usage/webui/projects-empty.png) - -## Create A Project - -Click **Create project** and give it a clear title. The title is what you will -recognize later in the project picker. - -![Create project](../res/usage/webui/project-create-filled.png) - -For a simple project, the title is enough. If you want Agent Zero to clone a -repository into the project, paste the Git URL in **Git Repository** before you -continue. - -After creating the project, Agent Zero opens the edit screen. - -## Write Helpful Instructions - -The most important part of a project is the **Instructions** field. - -Description answers: "What is this project?" - -Instructions answer: "How should Agent Zero behave when this project is active?" - -![Project instructions](../res/usage/webui/project-instructions-filled.png) - -Good instructions are usually short and specific. Tell Agent Zero: - -- what the project is for, -- what style of answer you want, -- where files should be read or written, -- what quality rules matter, -- when it should ask before acting. - -Example: - -```markdown -You are working inside the Docs Example Workspace. - -Use this project for small documentation examples and user-facing guidance. - -When this project is active: -- Explain steps in plain language before technical detail. -- Prefer screenshots, checklists, and concrete examples. -- Keep generated files inside this project unless I ask otherwise. -- Ask before using credentials, private data, or external accounts. -- When editing docs, focus on what the user sees and what they should do next. -``` - -That is enough. A project prompt does not need to be a constitution. Start small, -then improve it when you notice what the agent should do differently. - -## Activate A Project - -Open or create a chat. In the top-right corner, click the project picker. It may -say **No project** if the chat is not attached to a project yet. - -![Project picker](../res/usage/webui/project-picker.png) - -Choose your project. - -![Project active in chat](../res/usage/webui/project-active-chat.png) - -When the project name appears in the top bar, the chat is now using that -project. Agent Zero will use the project instructions and work with the project -workspace for that chat. - -Each chat can use a different project. This lets you keep a client chat, a code -chat, and a research chat separate at the same time. - -Projects can also own Agent Profile overrides and availability. In **Manage -agents**, select a project before editing or turning a profile off; the Global -profile remains unchanged. See [Agent Profiles](agent-profiles.md). - -## What Changes After Activation - -When a project is active, Agent Zero can use: - -- the project instructions, -- files stored in the project workspace, -- project memory, -- project variables and secrets, -- project-specific model settings when configured. - -Try prompts like: - -```text -Read the project instructions and tell me how you will work in this workspace. -``` - -```text -Create a short README for this project based on its current files. -``` - -```text -Use this project as the home for our weekly research notes. -``` - -## Git Projects - -If you paste a Git repository URL while creating the project, Agent Zero clones -that repository into the project workspace. - -![Git project clone](../res/usage/projects/projects-gitprojects-clone.png) - -Use Git projects when you want Agent Zero to work on a real codebase with the -right local files, branch state, and project instructions. - -For private repositories, use a token when the UI asks for one. Do not paste -tokens into chat messages. - -## Variables And Secrets - -Projects can store values that only make sense inside that workspace. - -Use **variables** for non-sensitive settings, such as: - -```text -REPORT_FORMAT=markdown -DEFAULT_REGION=eu-west -``` - -Use **secrets** for credentials, such as API keys and passwords. Refer to them by -name in chat: - -```text -Use the project GITHUB_TOKEN to check the repository status. -``` - -Keep your own copy of important secrets. Backups may not include every secret. - -## Keep Projects Tidy - -A good project stays useful because it stays focused. - -- Use a clear title. -- Keep instructions short enough to read. -- Store files where the project expects them. -- Keep secrets scoped to the project that needs them. -- Update instructions when your workflow changes. -- Create a new project when the work belongs to a different client, codebase, or topic. - -## Common Problems - -**Agent Zero ignores the project.** -Check the top-right project picker. The project name must be visible in the -active chat. - -**The project instructions are wrong or stale.** -Open **Projects**, click the edit icon, update the instructions, and save. - -**A Git repository did not clone.** -Check the URL, authentication token, and network access. For private repos, -create a fresh token and try again. - -**Secrets are not being used.** -Make sure the secret is saved in the project and refer to it by exact name. - -**The project has become too broad.** -Split it. Projects work best when each one has a clear job. - -## Related - -- [Usage Guide](usage.md) -- [Browser Guide](browser.md) -- [A0 CLI Connector](a0-cli-connector.md) -- [DeepWiki for Agent Zero](https://deepwiki.com/agent0ai/agent-zero) +version https://git-lfs.github.com/spec/v1 +oid sha256:99c995ee148dc3419fbc1c90d1cbdf2c8eed8e4091d134ce182a50071327bade +size 6287 diff --git a/docs/guides/self-update.md b/docs/guides/self-update.md index e52b6a438f1907e00a6fc3c66af2eb01c948e36f..1cdfec4d92ff88527cd3a492e69298d710562d25 100644 --- a/docs/guides/self-update.md +++ b/docs/guides/self-update.md @@ -1,99 +1,3 @@ -# Self Update - -## Using Self Update in the Web UI - -For day-to-day upgrades inside a running instance: - -1. Open **Settings UI → Update** tab -2. Open **Self Update** -3. Wait for the update checker to see if you have the latest version or if there's an available update. - -The UI will tell you when a new A0 update is available for download. Backups are automatically managed internally during the update process. - -![Self Update modal showing the current v2.0 state](../res/usage/updating/self-update-v2-current.png) - ---- - -## Technical reference - -Agent Zero includes a Docker-oriented self-update flow for switching to a specific repository version tag on `main`, `testing`, or `development`. - -## How it works - -1. The Web UI writes a YAML request file outside `/a0` so the request survives upgrades and downgrades. -2. Agent Zero restarts. -3. The durable updater in `/exe` reads the YAML request before starting the UI. -4. It cleans the root `uv` cache when `uv` is available. -5. If requested, it creates a zip backup of `/a0/usr`. -6. It fetches the requested branch and update target from the official Agent Zero repository. -7. It updates `/a0` while preserving gitignored paths such as `/a0/usr`. -8. It starts Agent Zero again and waits for `/api/health` to become healthy. -9. If the UI does not become healthy within the allowed time, it restores the previous checkout and starts that version again. - -## Durable files - -The self-update flow stores its runtime files outside `/a0`: - -- Trigger file: `/exe/a0-self-update.yaml` -- Status file: `/exe/a0-self-update-status.yaml` -- Last attempt log: `/exe/a0-self-update.log` - -Because these files live in `/exe`, you can recover from an older downgraded `/a0` by creating a new update YAML manually. - -## Backup behavior - -The updater automatically creates a backup of `a0/usr`. - - -## Version selection - -The Web UI preloads repository version choices for the selected branch into a standard selector. - -Only versions from the current major release line are listed in the selector. If newer major lines are available on the selected branch, the UI shows an attention banner that links to the Docker update guide. - -The selector also includes `latest` when the selected branch is still on the current major line: - -- On `main`, `latest` resolves to the newest reachable release tag on `main`. It is displayed as `latest (vX.Y)`. -- On `testing` and `development`, `latest` resolves to the current branch head. It is displayed as `latest (vX.Y+N)` when the branch head is `N` commits past the newest reachable tag, or `latest (vX.Y)` when it is exactly on a tag. - -Agent Zero version tags follow this format: - -`v{major}.{minor}` - -Examples: - -- `v1.0` -- `v1.1` - -Tags below `v1.0` are ignored by the selector and rejected by the self-update request validator. - -## Major version limitation - -Self-update is intentionally limited to changes within the same major line. - -If a newer major line exists, the UI points you to the Docker setup guide because those upgrades require downloading a new Docker image. They can include operating system level changes or other breaking changes outside the repository checkout. - -## v1.20 to v2.0 - -Use the Docker image update path for v1.20 -> v2.0. Self Update can show that a -newer major release line exists, but it intentionally keeps the version selector -inside the current major line. - -![Self Update warning for a newer major release line](../res/usage/updating/self-update-v1-to-v2-warning.png) - -The important part is moving a backup zip into a fresh v2.0 container: - -1. In the old v1.20 Web UI, create a backup from **Settings -> Check for Updates -> Backup & Restore -> Create Backup**. -2. Pull `agent0ai/agent-zero:latest` in Docker Desktop or Docker CLI. For the v2.0 release, `latest` is the v2.0 image. -3. Start a new container from that image, or use the **latest** card in **Agent Zero Launcher**. -4. Restore the downloaded backup zip into the new v2.0 Instance. -5. Verify the new Instance before deleting the old v1.20 container. - -For command examples, see [Updating from v1.20 to v2.0](../setup/installation.md#updating-from-v120-to-v20). - -## Safety notes - -- Gitignored paths are preserved during update -- Obsolete tracked files are removed as part of the checkout replacement -- Rollback is automatic when the updated UI fails its health check -- The updater itself lives outside `/a0`, so it is not lost by downgrading to an older repository state +version https://git-lfs.github.com/spec/v1 +oid sha256:4e1b622bb04bb1d982f342e6fde493ec198f033ef493c1d18d4df8a424e77d89 +size 4425 diff --git a/docs/guides/skills.md b/docs/guides/skills.md index 55d401fb378692948a4f355b03183ff3754de351..6ce2318b9cc649c5619254c8e9d450fae59b38ed 100644 --- a/docs/guides/skills.md +++ b/docs/guides/skills.md @@ -1,75 +1,3 @@ -# Skills - -Skills are focused instructions Agent Zero can load when a task needs them. - -Most of the time, you do not need to think about skills. Ask for the work you -want, and Agent Zero can load a matching skill on demand. - -You can also pin a skill yourself from the chat input when you want it to stay -active for the current conversation. - -## Open The Skills Selector - -1. Open a chat. -2. Click the **+** button in the chat input area. -3. Click **Skills**. - -![Open Skills from the chat input](../res/usage/webui/chat-more-actions-skills.png) - -The selector opens with a searchable list of skills. - -![Skills selector](../res/usage/webui/skills-selector.png) - -## Add Or Remove A Skill - -Click a skill to add it. Active skills are shown at the top of the selector. - -![Active skill in the selector](../res/usage/webui/skills-selector-checked.png) - -To remove a skill, use the remove button in **Active skills** or uncheck it in -the list. - -Active skills are added to the **Protocol** part of the prompt. That means -Agent Zero sees them every turn while they are active. - -> [!TIP] -> Keep this list short. Pin the skills you really want present all the time, and -> let Agent Zero load the rest only when it needs them. - -## When To Pin A Skill - -Pin a skill when the current chat should keep following the same special -procedure. - -Good examples: - -- creating an Agent Profile; -- reviewing a plugin; -- following a writing format; -- working with a repeated data-cleaning recipe; -- keeping a project-specific checklist visible during a long chat. - -Do not pin a skill just because it might be useful someday. A lighter prompt is -usually easier for the agent to follow. - -## Skills, Profiles, And Projects - -| Control | What it changes | -| --- | --- | -| **Skills** | Adds a specific procedure to the current prompt protocol. | -| **Agent Profiles** | Changes the broader role and behavior of the chat. | -| **Projects** | Adds workspace, files, memory, secrets, and project instructions. | - -If Agent Zero starts following an old procedure you no longer want, open the -Skills selector and remove any active skill that does not belong in the chat. - -The Agent Editor can also set a profile-wide Skills visibility policy. That -policy controls discovery and new loading; it does not erase skill text already -stored in a chat's history. See [Agent Profiles](agent-profiles.md#choose-capability-access). - -## Creating Skills - -This page is about using skills in the Web UI. - -If you want to write or contribute a skill, see -[Contributing Skills](../developer/contributing-skills.md). +version https://git-lfs.github.com/spec/v1 +oid sha256:b6b4ee38f91ee309f6b6c18eedb155a7fe004fcbe7bd13322e2f514601e5ab89 +size 2552 diff --git a/docs/guides/troubleshooting.md b/docs/guides/troubleshooting.md index 05a3cf02f49e1105418bb1d9fd4b55ce79218e3b..68762c2ecaf3ceefeade88464edc880f3d8d146b 100644 --- a/docs/guides/troubleshooting.md +++ b/docs/guides/troubleshooting.md @@ -1,122 +1,3 @@ -# Troubleshooting and FAQ -This page addresses frequently asked questions (FAQ) and provides troubleshooting steps for common issues encountered while using Agent Zero. - -## Frequently Asked Questions -**1. How do I ask Agent Zero to work directly on my files or dirs?** -- Place the files/dirs in `/a0/usr`. Agent Zero will be able to perform tasks on them. - -**2. When I input something in the chat, nothing happens. What's wrong?** -- Check if you have set up API keys in the Settings page. If not, the application cannot call LLM providers. - -**3. I get "Invalid model ID." What does that mean?** -- Verify the **provider** and **model naming**. For example, `openai/gpt-5.3` is correct for OpenRouter, but **incorrect** for the native OpenAI provider, which goes without prefix. - -**4. Does ChatGPT Plus include API access?** -- No. ChatGPT Plus does not include API credits. You must provide an OpenAI API key in Settings. - -**5. Where is chat history stored?** -- Chat history lives at `/a0/usr/chats/` inside the container. - -**6. How do I integrate open-source models with Agent Zero?** -Refer to the [Choosing your LLMs](../setup/installation.md#installing-and-using-ollama-local-models) section for configuring local models (Ollama, LM Studio, etc.). - -> [!TIP] -> Some LLM providers offer free usage tiers, for example Groq, Mistral, SambaNova, or CometAPI. - -**7. How can I make Agent Zero retain memory between sessions?** -Use **Settings -> Backup & Restore** and avoid mapping the entire `/a0` directory. See [How to update Agent Zero](../setup/installation.md#how-to-update-agent-zero). - -**8. My browser tool fails or says Chromium is missing. What now?** - -In normal Docker installs, the Browser already includes what it needs. - -If you are running a local development checkout, Agent Zero can install the -browser the first time it is needed. To install it ahead of time, run this from -the project root after installing Python requirements: - -```bash -PLAYWRIGHT_BROWSERS_PATH=tmp/playwright patchright install chromium --no-shell -``` - -If **Bring Your Own Browser** mode fails: - -- keep A0 CLI connected to the chat; -- restart or reconnect A0 CLI after enabling remote debugging in a browser; -- run `/browser status` in A0 CLI; -- check that Browser settings still say **Bring Your Own Browser**; -- check **Page content access** if page text or screenshots are blocked. - -See the [Browser Guide](browser.md) for Browser settings and host-browser -behavior. If you need a different external browser tool, see -[MCP Setup](mcp-setup.md). - -**9. My secrets disappeared after a backup restore.** -Secrets are stored in `/a0/usr/secrets.env` and are not always included in backup archives. Copy them manually. - -**10. Where can I find more documentation or tutorials?** -- Join the Agent Zero [Skool](https://www.skool.com/agent-zero) or [Discord](https://discord.gg/B8KZKNsPpj) community. - -**11. How do I adjust API rate limits?** -Use the model rate limit fields in Settings, under the Main Model and Utility -Model sections, to set request, input, and output limits. - -**12. My `code_execution_tool` doesn't work, what's wrong?** -- Ensure Docker is installed and running. -- On macOS, grant Docker Desktop access to your project files. -- Verify that the Docker image is updated. - -**13. Can Agent Zero interact with external APIs or services (e.g., WhatsApp)?** -Yes. Start with [API Integration](api-integration.md) for one-off services or -[MCP Setup](mcp-setup.md) when the service already has MCP support. - -## Troubleshooting - -**Installation** -- **Docker Issues:** If Docker containers fail to start, consult the Docker documentation and verify your Docker installation and configuration. On macOS, ensure you've granted Docker access to your project files in Docker Desktop's settings as described in the [Installation guide](../setup/installation.md#step-1-install-docker-desktop). Verify that the Docker image is updated. -- **Web UI not reachable:** Ensure at least one host port is mapped to container port `80`. If you used `0:80`, check the assigned port in Docker Desktop. - -**Usage** - -- **Terminal commands not executing:** Ensure the Docker container is running and properly configured. Check SSH settings if applicable. Check if the Docker image is updated by removing it from Docker Desktop app, and subsequently pulling it again. -- **Agent Zero stuck on the update screen or not starting after an update:** If the browser stays on the updating screen for multiple minutes, reload the current browser window first. If the UI still does not come back, restart the Docker container. If it still does not recover, queue another self-update for the next startup and inspect the updater log. - -From the host, find the container name: - -```bash -docker ps -``` - -Open a shell inside the container: - -```bash -docker exec -it /bin/bash -``` - -Queue an update for the next startup attempt with the recovery script in `/exe`: - -```bash -/exe/trigger_self_update.sh -``` - -That default command writes `/exe/a0-self-update.yaml` with `main` and `latest`, so the next startup tries the newest release in the current installed major version. You can also specify the branch, version, and backup settings: - -```bash -/exe/trigger_self_update.sh ready latest -/exe/trigger_self_update.sh main v1.10 --backup-dir /root/update-backups --backup-name usr-recovery.zip -/exe/trigger_self_update.sh development latest --no-backup -``` - -You can run the same commands directly from the host without opening a shell: - -```bash -docker exec -it /exe/trigger_self_update.sh -docker exec -it /exe/trigger_self_update.sh ready latest -docker exec -it tail -n 200 /exe/a0-self-update.log -docker exec -it cat /exe/a0-self-update-status.yaml -``` - -The recovery command only schedules the update. Restart the container or let Agent Zero start again, then check `/exe/a0-self-update.log` and `/exe/a0-self-update-status.yaml` to see what happened. - -* **Error Messages:** Pay close attention to the error messages displayed in the Web UI or terminal. They often provide valuable clues for diagnosing the issue. Refer to the specific error message in online searches or community forums for potential solutions. - -* **Performance Issues:** If Agent Zero is slow or unresponsive, it might be due to resource limitations, network latency, or the complexity of your prompts and tasks, especially when using local models. +version https://git-lfs.github.com/spec/v1 +oid sha256:1648637513bf9d665eec76e7deb4e055f3b8af0457e547007003fec4d39fb330 +size 6413 diff --git a/docs/guides/usage.md b/docs/guides/usage.md index 45b0c786fd377c275475a85d1b0fb39307a7da69..3306a427147e9684f9e4bf62004cf3ba23f3a3fc 100644 --- a/docs/guides/usage.md +++ b/docs/guides/usage.md @@ -1,435 +1,3 @@ -# Usage Guide - -This guide is the practical tour of Agent Zero after installation. It explains -what you can do in the Web UI, what to try first, and where to go when you want -the deeper source-linked explanation. - -For architecture, backend flow, Web UI internals, plugin lifecycle, and API -details, use [DeepWiki for Agent Zero](https://deepwiki.com/agent0ai/agent-zero). - -![Agent Zero first task](../res/usage/first-task.png) - -## Basic Operations - -Agent Zero is built around a chat, a working Linux environment, and a Web UI that -lets you watch and steer the work. - -Common places to start: - -- **New Chat:** start a clean conversation. -- **Projects:** give a chat its own workspace, files, memory, secrets, and instructions. -- **Memory:** review what Agent Zero has learned or imported. -- **Tasks:** create scheduled, planned, or manual automations. -- **Files:** open the Agent Zero file browser. -- **Settings:** configure models, credentials, preferences, plugins, and backup. -- **Browser:** open the live Browser surface when you want to watch browsing or annotate a page. -- **Desktop:** open the live Linux desktop when you want GUI apps, a terminal window, or LibreOffice Cowork. - -![Dashboard actions](../res/usage/webui/dashboard.png) - -The chat input also has action buttons for attachments, pausing, nudging, compacting, -and opening helpful views such as context or history. - -![Action buttons](../res/usage/action-btns.png) - -Use **Restart** from the sidebar when you need the framework to reload after -settings or code changes. - -## Plugins And Plugin Hub - -Plugins add integrations, tools, panels, and automation helpers. - -Open **Plugins** from the dashboard or sidebar to see what is installed. - -![Plugins](../res/usage/plugins/plugins-list-01.png) - -Use the **Browse** tab or **Install** button to open the Plugin Hub. - -![Plugin Hub](../res/usage/plugins/plugin-hub-main-view.png) - -Before installing a plugin, read its description, README, permissions, and source -link. Treat plugins like any other code you run in your workspace: install the -ones you trust and remove what you do not use. - -When you want to make your own first plugin, start with something small and -visible. The [Create a Small Plugin](create-plugin.md) guide walks through a -local Web UI plugin that adds an unread dot to the chat list and then reviews it -with `a0-review-plugin`. - -## Skills, Agent Profiles, And Model Presets - -The small controls around the chat input let you shape the current conversation -without opening the full Settings screen. - -### Skills - -Skills are focused instructions Agent Zero can load when it needs them. You can -also pin a skill manually for the current chat. - -Click the **+** button in the chat input, then click **Skills**. - -![Open Skills from chat input](../res/usage/webui/chat-more-actions-skills.png) - -Use the selector to add or remove active skills. - -![Skills selector](../res/usage/webui/skills-selector-checked.png) - -Active skills are added to the **Protocol** part of the prompt, so keep the -list short and intentional. See the [Skills guide](skills.md). - -### Agent Profiles - -Agent Profiles change the role, tone, and prompt instructions for the selected -chat. - -![Agent Profile selector](../res/usage/webui/agent-profile-selector.png) - -Use the profile menu near the chat input to switch the current chat or edit a -profile. Select **Manage agents** to create, duplicate, reset, delete, or change -profile availability for Global or one project. - -![Manage agents with a project-specific availability choice](../res/usage/webui/agent-profile-manager.png) - -Use **Settings -> Agent Config** when you want to change the default profile for -new Global chats. - -See the [Agent Profiles guide](agent-profiles.md). - -### Model Presets - -Model Presets are named shortcuts for model choices. Use them for setups like -`Best`, `Balanced`, `Fast Cheap`, or a model name you can spot quickly. - -![Model preset selector](../res/usage/webui/model-preset-selector.png) - -Click **Edit presets** when you want to add or rename presets. - -![Model presets editor](../res/usage/webui/model-presets-editor.png) - -See the [Model Presets guide](model-presets.md). - -## File Attachments - -Attach files when the agent should read, summarize, transform, or organize them. - -![File attachments](../res/usage/attachments-1.png) - -You can attach one file or several files, then describe what should happen: - -```text -Read these PDFs and create a short comparison table. -``` - -```text -Move these files into a clean folder structure and explain what changed. -``` - -Attached files are visible in the chat input before you send the message, so you -can remove mistakes before Agent Zero starts working. - -## Tool Usage - -You usually do not need to name tools. Say what you want done and Agent Zero will -choose whether it needs the browser, code execution, files, knowledge, plugins, -or another available capability. - -Good prompts are specific about the desired result: - -```text -Research three deployment options for this app. Cite sources and finish with a recommendation. -``` - -```text -Open the attached CSV, find the main trend, and create a chart I can edit later. -``` - -```text -Inspect this repository and propose the safest first improvement before changing files. -``` - -When you do want internals, use -[DeepWiki for Agent Zero](https://deepwiki.com/agent0ai/agent-zero). - -### Browser Tool And Surface - -The Browser has two parts: - -- the `browser` tool, which the agent can call directly; -- the visible Browser surface in the Canvas, where you can watch and annotate pages. - -![Browser Canvas and tool history](../res/usage/browser/browser-canvas-wide.png) - -Ask naturally: - -```text -Use the Browser tool to compare these pages and take screenshots of the important parts. -``` - -```text -Open my local app in the Browser. I will annotate the page, then you can fix the issues. -``` - -For screenshots, history, annotations, Docker browser mode, host-browser mode -through A0 CLI, privacy controls, and Chrome extensions, see the -[Browser Guide](browser.md). - -External browser MCP tools are still useful for specialized setups. See -[MCP Setup](mcp-setup.md). - -### Desktop Surface - -The Desktop surface opens Agent Zero's own Linux desktop in the Canvas. -Use it when you want the agent to work visually with GUI apps, open a terminal, -or cowork with you in LibreOffice. - -![Desktop Canvas](../res/usage/webui/desktop-canvas.png) - -The **New** menu can create Markdown, Writer, Spreadsheet, and Presentation -files. Writer, Calc, and Impress run inside the Desktop, so you can edit by hand -while Agent Zero creates, updates, saves, and verifies the same files. - -For the screenshot walkthrough and prompt examples, see the -[Desktop Guide](desktop.md). - -### Agent-To-Agent Communication - -Agent Zero instances can communicate through A2A when you want multiple -instances to collaborate. - -Use A2A when you have a clear reason to split work across Agent Zero instances, -such as a specialist server, a remote machine, or a project-specific agent. See -[A2A Setup](a2a-setup.md). - -### Multi-Agent Cooperation - -Inside a single Agent Zero instance, the main agent can create subordinate agents -to investigate focused parts of a larger job. - -![Multi-agent cooperation](../res/usage/multi-agent.png) - -This is useful for research, code review, comparison work, and tasks where one -agent should gather information while another keeps the main plan moving. - -## Projects - -Projects tell Agent Zero what world it is working in. Use one when a chat needs -its own files, instructions, memory, secrets, or model settings. - -![Project active in chat](../res/usage/webui/project-active-chat.png) - -The simple flow: - -1. Open **Projects** from the dashboard. -2. Click **Create project**. -3. Give it a clear title. -4. Add a short description. -5. Write practical instructions. -6. Save it. -7. Open a chat and choose the project from the top-right project picker. - -![Project instructions](../res/usage/webui/project-instructions-filled.png) - -Good project instructions tell Agent Zero what should be different in that -workspace: - -```markdown -When this project is active: -- Explain steps in plain language before technical detail. -- Prefer screenshots, checklists, and concrete examples. -- Keep generated files inside this project unless I ask otherwise. -- Ask before using credentials, private data, or external accounts. -``` - -Use projects for client work, code repositories, research topics, recurring -reports, and any workflow where context matters. - -See the [Projects guide](projects.md) for the full screenshot walkthrough. - -## Tasks And Scheduling - -Tasks let Agent Zero run work later, repeatedly, or on demand. - -Use tasks for: - -- morning or weekly reports; -- monitoring a source and summarizing changes; -- recurring cleanup or export jobs; -- project-specific checks; -- manual batch jobs you want to run again. - -Open **Tasks** from the dashboard or sidebar. - -![Task scheduler](../res/usage/tasks/scheduler-1.png) - -When creating a task, focus on four things: - -- **Name:** what you will recognize later. -- **Type:** scheduled, planned, or ad-hoc. -- **Project:** optional, but recommended when the task needs specific context or secrets. -- **Prompt:** the actual work Agent Zero should perform. - -![Edit task](../res/usage/tasks/edit-task.png) - -Example: - -```text -Name: Weekly docs review -Type: Scheduled -Project: Documentation -Prompt: Check the docs project for stale screenshots, broken links, and confusing sections. Summarize what needs attention. -``` - -Project-scoped tasks inherit project instructions, variables, secrets, files, and -memory. That means you can improve task behavior later by improving the project -instead of repeating every rule in every task. - -## Secrets And Variables - -Use **Secrets** for sensitive values such as API keys, tokens, passwords, and -credentials. - -Use **Variables** for non-sensitive settings such as regions, URLs, usernames, -formats, or feature flags. - -Refer to them by name in chat: - -```text -Use the project GITHUB_TOKEN to check repository status. -``` - -Do not paste credentials into chat messages or public files. Keep your own copy -of important secrets because backups may not include every secret. - -## Remote Access Via Tunneling - -Tunnels let you reach your local Agent Zero instance from another device or -share it temporarily. - -Before creating a tunnel: - -- set UI authentication; -- understand that anyone with the tunnel URL can try to open your instance; -- stop the tunnel when you no longer need it. - -Open **Settings -> External Services -> Flare Tunnel** to create or stop a tunnel. - -## Voice Interface - -Agent Zero supports text-to-speech and speech-to-text through built-in voice plugins: - -- `_kokoro_tts` provides container-side Kokoro speech synthesis when enabled. -- `_whisper_stt` provides local Whisper transcription and adds the microphone control when enabled. -- Browser-native `speechSynthesis` remains the fallback output path when `_kokoro_tts` is disabled. - -Use the **Voice** section in Agent settings or the plugin settings in **Agent Plugins** to configure providers. Use the sidebar **Speech** preference when you want Agent Zero to read responses automatically. - -Use speech when you want to listen while doing something else, dictate a prompt, -or make the interface more accessible. - -![Text to speech controls](../res/usage/ui-tts-stop-speech1.png) - -Speech-to-text settings live in the Whisper STT plugin card and include model size, language code, voice message handling, silence threshold, and recording behavior. The microphone button appears in the chat input when `_whisper_stt` is enabled. - -![Speech to text settings](../res/usage/ui-settings-5-speech-to-text.png) - -> [!IMPORTANT] -> Whisper STT and Kokoro TTS operate locally within the Docker/container runtime when their plugins are enabled. -> Browser fallback TTS runs locally in the browser. No voice path requires OpenAI APIs. - -## Mathematical Expressions - -Agent Zero can render mathematical notation with KaTeX. - -![KaTeX display](../res/usage/ui-katex-2.png) - -Ask for the format you want: - -```text -Solve this step by step and show the final equations in KaTeX. -``` - -## File Browser - -The File Browser lets you inspect and manage files inside the Agent Zero -environment. - -![File Browser](../res/usage/file-browser.png) - -Use it to: - -- upload files; -- download generated work; -- create folders; -- rename or delete files; -- open editable text files; -- inspect the project or `/a0/usr` workspace. - -For file-based work, prefer `/a0/usr` or a project workspace. Avoid storing -important work only in temporary directories. - -## Memory Management - -Memory is where Agent Zero keeps useful remembered information from conversations -and imported knowledge. It is powerful, but it is not magic. Long-term AI memory -still needs curation; this is not fully solved even by the largest AI labs and -companies. - -Open **Memory** when you want to search, review, edit, copy, or remove stored -entries. - -![Memory dashboard](../res/usage/memory-dashboard.png) - -The controls let you choose a memory directory, filter by area, set a result -limit, search, adjust match threshold, and clear filtered results. - -![Memory dashboard controls](../res/usage/webui/memory-dashboard-controls.png) - -Use memory deliberately: - -- keep durable facts and useful patterns; -- remove old test data; -- edit memories that became inaccurate; -- use project memory for project-specific context; -- create a backup before large cleanup. - -If Agent Zero does something unexpected, repeats a wrong behavior, or seems to -remember the wrong thing, Memory is one of the first places to look. A stale or -incorrect memory can poison the processing instead of helping it. - -Click a memory row to inspect its full content and metadata. From the detail -view you can copy, edit, or delete the entry. - -![Memory editing](../res/usage/memory-editing.png) - -For a practical cleanup checklist, see the [Memory Guide](memory.md). - -## Backup And Restore - -Backups protect your chats, projects, knowledge, memory, settings, skills, and -workspace files. - -Create a backup before: - -- major updates; -- plugin experiments; -- bulk memory cleanup; -- moving to a new machine; -- deleting or reorganizing important project files. - -Open **Settings -> Backup & Restore** to create or restore a backup. - -Secrets are sensitive and may not always be included in backup archives. Keep a -separate secure copy of credentials you depend on. - -## Next Steps - -- [Quick Start](../quickstart.md) -- [Projects guide](projects.md) -- [Browser guide](browser.md) -- [A0 CLI Connector](a0-cli-connector.md) -- [Skills guide](skills.md) -- [Agent Profiles guide](agent-profiles.md) -- [Model Presets guide](model-presets.md) -- [MCP Setup](mcp-setup.md) -- [Troubleshooting](troubleshooting.md) -- [DeepWiki for Agent Zero](https://deepwiki.com/agent0ai/agent-zero) +version https://git-lfs.github.com/spec/v1 +oid sha256:a98eb85214ed2913cb952ecc9765afbc48e9059561c3f55117504ad842c3b22d +size 14790 diff --git a/docs/quickstart.md b/docs/quickstart.md index 4e5138f4fe0ef24340f21170ec8350dadac31200..a024983437790890a31ddebfd83b25fd905f8dcb 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -1,169 +1,3 @@ -# Quick Start - -This guide gets you from install to a first useful chat. Keep it simple: start -Agent Zero, add a model or API key, open the Web UI, and give it a concrete job. - -## Installation (recommended) - -Choose the path that matches your machine: - -- Use [A0 Launcher](guides/launcher.md) if you want a desktop app on a fresh - machine. It can set up the local runtime, download Agent Zero, open - Instances, or save a remote Instance URL. -- Use A0 Install if you want the terminal path. The script handles Docker - detection, image pull, and container setup. - -**macOS / Linux:** -```bash -curl -fsSL https://bash.agent-zero.ai | bash -``` - -**Windows (PowerShell):** -```powershell -irm https://ps.agent-zero.ai | iex -``` - -Follow the CLI prompts for port and authentication, complete onboarding, then open the Web UI URL from the terminal. - -> [!TIP] -> To update later, open **Settings UI -> Update tab -> Open Self Update** (see [How to Update](setup/installation.md#how-to-update-agent-zero)). Backups are automatically managed internally. - -> [!NOTE] -> For Launcher downloads, headless installer flags, direct Docker, manual Docker Desktop setup, volume mapping, and platform-specific detail, see the [Installation Guide](setup/installation.md). - -## Use Agent Zero on your real local files - -If you want Agent Zero to work on the actual files on your computer, this is the important part. - -Agent Zero stays in Docker for safety. The A0 CLI installs and runs on your host machine. It is not another CLI agent; it is the connector that lets your running Agent Zero instance work on the real files on your real computer. - -**macOS / Linux:** -```bash -curl -LsSf https://cli.agent-zero.ai/install.sh | sh -``` - -**Windows (PowerShell):** -```powershell -irm https://cli.agent-zero.ai/install.ps1 | iex -``` - -Run those on the host machine, not inside the Agent Zero container. - -Then launch: - -```bash -a0 -``` - -Once `a0` connects, open or create a chat there. The reasoning still belongs to Agent Zero; the CLI is the host bridge that lets it work on real local files on your machine. - -For the full setup flow, host picker screenshots, command palette guidance, Browser mode commands, manual fallback install paths, remote-host tips, and a copy-ready brief for another agent, see the [A0 CLI Connector guide](guides/a0-cli-connector.md). - -### Open the Web UI and complete onboarding - -Open your browser and navigate to `http://localhost:`. The Web UI will -open on the welcome screen. If models still need setup, send a message or use -the setup shortcuts to choose Cloud, AI account, or Local access, then select -your main and utility models. - -![Agent Zero Web UI](res/setup/6-docker-a0-running-new.png) - -For a screenshot walkthrough using OpenRouter, see the -[First-Run Onboarding guide](guides/onboarding.md). - -> [!NOTE] -> Agent Zero supports hosted providers, account-backed providers, and local -> models. Choose a strong main model for chat and a fast utility model for -> internal tasks. - -### Start your first chat - -Once configured, you will see the Agent Zero dashboard. - -![Agent Zero dashboard](res/usage/webui/dashboard.png) - -Click **New Chat** and start with a specific request. - -Good first prompts: - -```text -Create a short plan for organizing my project notes. -``` - -```text -Use the Browser to research three options for this tool and summarize the tradeoffs. -``` - -```text -Help me create a project for this repository and write good instructions for it. -``` - -> [!TIP] -> The Web UI provides a comprehensive chat actions dropdown with options for managing conversations, including creating new chats, resetting, saving/loading, and many more advanced features. Chats are saved in JSON format in the `/usr/chats` directory. -> -> ![Chat Actions Dropdown](res/quickstart/ui_chat_management.png) - ---- - -## Example Interaction - -Try a small request first so you can see how Agent Zero thinks, uses tools, and -reports progress. - -1. Type a concrete request in the chat input and press Enter. -2. Watch the streamed response and any tool calls. -3. Redirect the agent if it starts moving in the wrong direction. -4. Ask for the final result in the format you want. - -Here's an example of what you might see in the Web UI at step 3: - -![1](res/quickstart/image-24.png) - -## Next Steps -Now that you've run a simple task, you can experiment with more complex requests. Try asking Agent Zero to: - -- Create a project for a focused workspace. -- Use the built-in Browser to research, screenshot, or annotate a page. -- Open the Desktop when you want Linux GUI apps or LibreOffice Cowork. -- Review Memory when Agent Zero seems to keep the wrong assumption. -- Connect A0 CLI when Agent Zero should work on host-machine files. -- Use **+ -> Skills** when you want to pin or remove a skill in the current chat. -- Switch Agent Profiles from the menu near the chat input when you want a different working style. -- Use the first model dropdown when you want to choose or edit Model Presets. -- Attach files and ask for a summary, edit, or conversion. -- Create a scheduled task for recurring work. -- Explore plugins when you need installed integrations or custom UI features. - -### [Open A0 Browser Guide](guides/browser.md) - -Explains the built-in Browser, live Browser Canvas, screenshots, annotations, host-browser mode through A0 CLI, and Chrome extensions. - -### [Open A0 Desktop Guide](guides/desktop.md) - -Shows the right-side Canvas Linux desktop, the New menu for Markdown/Writer/Spreadsheet/Presentation files, and LibreOffice Cowork. - -### [Open A0 Memory Guide](guides/memory.md) - -Explains how to search, edit, delete, export, and curate memories before stale context starts steering the agent. - -### [Open A0 Skills Guide](guides/skills.md) - -Shows the chat input **+** menu, the Skills selector, and how active skills are added to prompt protocol. - -### [Open A0 Agent Profiles Guide](guides/agent-profiles.md) - -Shows how to switch profiles, create one in Easy mode, edit prompts in Advanced -mode, and set Tool, MCP, Skill, and project-availability policies. - -### [Open A0 Model Presets Guide](guides/model-presets.md) - -Explains presets as simple named shortcuts for model setups. - -### [Open A0 Usage Guide](guides/usage.md) - -Provides more in-depth information on chat controls, tools, projects, tasks, and backup/restore. - -## Video Tutorials -- [MCP Server Setup](https://youtu.be/pM5f4Vz3_IQ) -- [Projects & Workspaces](https://youtu.be/RrTDp_v9V1c) -- [Memory Management](https://youtu.be/sizjAq2-d9s) +version https://git-lfs.github.com/spec/v1 +oid sha256:09762165fe6bada168899401ab8d7537086a3bde4b157409b87ea83f9ee3273e +size 6465 diff --git a/docs/res/a0-vector-graphics/banner.svg b/docs/res/a0-vector-graphics/banner.svg index 5a98670be1b5ce24aa8f24613a8cb580404ac7fa..c710d9db7ac7941919246e6597a5741a5326acc6 100644 --- a/docs/res/a0-vector-graphics/banner.svg +++ b/docs/res/a0-vector-graphics/banner.svg @@ -1,51 +1,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:1f8f468d5d972ac9123118960f0f3251770f2bd4a4848037fac9e56517c6bb6f +size 6512 diff --git a/docs/res/a0-vector-graphics/dark.svg b/docs/res/a0-vector-graphics/dark.svg index 140246cd026ba86cebc25ff752ac39c61d194721..e45c2b6ce44387bbd767dd8a189a9520526a7236 100644 --- a/docs/res/a0-vector-graphics/dark.svg +++ b/docs/res/a0-vector-graphics/dark.svg @@ -1,20 +1,3 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file +version https://git-lfs.github.com/spec/v1 +oid sha256:28defd32480069d9157c5e2670cf8a82b5dfe0e82818c0ff9af6c4d8745ecaf7 +size 3251 diff --git a/docs/res/a0-vector-graphics/darkSymbol.svg b/docs/res/a0-vector-graphics/darkSymbol.svg index 893fc49b25e0a60a4aaf07f3908aa50d5b3e0225..794b97c7ba05fe41a045fc55a30b35388ce64d32 100644 --- a/docs/res/a0-vector-graphics/darkSymbol.svg +++ b/docs/res/a0-vector-graphics/darkSymbol.svg @@ -1,5 +1,3 @@ - - - - - \ No newline at end of file +version https://git-lfs.github.com/spec/v1 +oid sha256:59590ca4b7feeedf6c0502bc90db8a16244d461ab6194a253cad8b44d09e70fe +size 522 diff --git a/docs/res/a0-vector-graphics/horizontal_banner.svg b/docs/res/a0-vector-graphics/horizontal_banner.svg index ddf5a215f009c39f0fbd7d625d887272c14a269c..007c7b4606f8e522ba92a7fba7586afd9953926c 100644 --- a/docs/res/a0-vector-graphics/horizontal_banner.svg +++ b/docs/res/a0-vector-graphics/horizontal_banner.svg @@ -1,60 +1,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file +version https://git-lfs.github.com/spec/v1 +oid sha256:e6f0962c08f3c5541a159ae3ae379fd353ccca80bad8953265be7663998ecf23 +size 3615 diff --git a/docs/res/a0-vector-graphics/light.svg b/docs/res/a0-vector-graphics/light.svg index b8148ecf0d93d248854b3ab1aa8ec4a49d98155c..eface1922854131513b9884aadd6682380327628 100644 --- a/docs/res/a0-vector-graphics/light.svg +++ b/docs/res/a0-vector-graphics/light.svg @@ -1,20 +1,3 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file +version https://git-lfs.github.com/spec/v1 +oid sha256:22d1c07070ce944f12d577bb41408603361b61bf3f5826ef8465e3fffe4bd9d2 +size 3224 diff --git a/docs/res/a0-vector-graphics/lightSymbol.svg b/docs/res/a0-vector-graphics/lightSymbol.svg index c988a103eabf9914cb02574d40dc079c06b7857c..54f51d505a9f2e50082343072be4144cd747c15d 100644 --- a/docs/res/a0-vector-graphics/lightSymbol.svg +++ b/docs/res/a0-vector-graphics/lightSymbol.svg @@ -1,5 +1,3 @@ - - - - - \ No newline at end of file +version https://git-lfs.github.com/spec/v1 +oid sha256:09f9aa0e24004f50ea5364eee90511c73b588db0afc7ba0de3679acf6617456f +size 522 diff --git a/docs/res/banner.png b/docs/res/banner.png index 03ea6eb405fb9bd5e5d2d58dd81f82f2a0216740..c3d6e420e99d088e252fa587a841721ed1fdd8ad 100644 Binary files a/docs/res/banner.png and b/docs/res/banner.png differ diff --git a/docs/res/banner_high.png b/docs/res/banner_high.png index 45ca87b70afdcd1a5ec9bd0f5ed0077deb792ce8..4a9aebb414004f7a7c04a8213d8548f7f8aced1b 100644 Binary files a/docs/res/banner_high.png and b/docs/res/banner_high.png differ diff --git a/docs/res/dark.svg b/docs/res/dark.svg index 140246cd026ba86cebc25ff752ac39c61d194721..e45c2b6ce44387bbd767dd8a189a9520526a7236 100644 --- a/docs/res/dark.svg +++ b/docs/res/dark.svg @@ -1,20 +1,3 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file +version https://git-lfs.github.com/spec/v1 +oid sha256:28defd32480069d9157c5e2670cf8a82b5dfe0e82818c0ff9af6c4d8745ecaf7 +size 3251 diff --git a/docs/res/dev/devinst-1.png b/docs/res/dev/devinst-1.png index 09ed2cb6f4ef6e61e2b890a1c1e59565310506a2..4526ed4c597a1ea9d9c7463baef06c3ad0ad3af5 100644 Binary files a/docs/res/dev/devinst-1.png and b/docs/res/dev/devinst-1.png differ diff --git a/docs/res/dev/devinst-11.png b/docs/res/dev/devinst-11.png index 3f48e12c2b2aeaf7dfa49188295bdf2ee1097176..2c358304497cc12a7b3e60eacb4ed26a079732e5 100644 Binary files a/docs/res/dev/devinst-11.png and b/docs/res/dev/devinst-11.png differ diff --git a/docs/res/dev/devinst-12.png b/docs/res/dev/devinst-12.png index 47b4a3652339e34e6c627bcb5862f6ffd65abc9d..54f5498406a8535ffd6c287dffb79290caaacb68 100644 Binary files a/docs/res/dev/devinst-12.png and b/docs/res/dev/devinst-12.png differ diff --git a/docs/res/dev/devinst-13.png b/docs/res/dev/devinst-13.png index 6eb8fffef09987019c3dd50303cd898e62d55d88..5a226c8725aa3e8f34a0821225f96d8085651c1f 100644 Binary files a/docs/res/dev/devinst-13.png and b/docs/res/dev/devinst-13.png differ diff --git a/docs/res/dev/devinst-14.png b/docs/res/dev/devinst-14.png index c49c79dcca83cf3cec81e2a0bce6df4f109a17d7..384c349de27868d76ac5aed869d38c05d09d663a 100644 Binary files a/docs/res/dev/devinst-14.png and b/docs/res/dev/devinst-14.png differ diff --git a/docs/res/dev/devinst-3.png b/docs/res/dev/devinst-3.png index 71b8e361243af1a55d548f4ec0b195d93f6bd1ea..97508f27f2b6040edaa2da05e6e491efa026a844 100644 Binary files a/docs/res/dev/devinst-3.png and b/docs/res/dev/devinst-3.png differ diff --git a/docs/res/dev/devinst-4.png b/docs/res/dev/devinst-4.png index 619b9e22cf022ccd8e1dff589d868790f6e01548..9b99d2adb9601e1647eb86368ff7f3d809dcf3d9 100644 Binary files a/docs/res/dev/devinst-4.png and b/docs/res/dev/devinst-4.png differ diff --git a/docs/res/dev/devinst-5.png b/docs/res/dev/devinst-5.png index 9c4e356b6ad8158f78e382c299b668aa0d81d2d4..22f1bfbf3c574ecfdd5435b5736482559b628c9a 100644 Binary files a/docs/res/dev/devinst-5.png and b/docs/res/dev/devinst-5.png differ diff --git a/docs/res/dev/devinst-6.png b/docs/res/dev/devinst-6.png index f37d0eb9a114b098bfbc2b71c10056f7700ba0a7..453ea8bdff5060171a40d9f3439bc9063d5d7f0b 100644 Binary files a/docs/res/dev/devinst-6.png and b/docs/res/dev/devinst-6.png differ diff --git a/docs/res/dev/devinst-7.png b/docs/res/dev/devinst-7.png index 37f378256743b8b37122da4fa321b8411d7e647a..9a9f35d6cc64ae0d9ff98afb441ba5c0e88c7c19 100644 Binary files a/docs/res/dev/devinst-7.png and b/docs/res/dev/devinst-7.png differ diff --git a/docs/res/dev/devinst-8.png b/docs/res/dev/devinst-8.png index a3b7f10c6ac867633be1ecc850d0f152286f73f4..38bce7e32e85b940b4eb86b06f2a29633996af04 100644 Binary files a/docs/res/dev/devinst-8.png and b/docs/res/dev/devinst-8.png differ diff --git a/docs/res/dev/devinst-9.png b/docs/res/dev/devinst-9.png index d1c6dad7145bc176c722b7caf8154a84e688bada..d5b8166c8c2e10be15ebbd2ee4a97b94000b1f62 100644 Binary files a/docs/res/dev/devinst-9.png and b/docs/res/dev/devinst-9.png differ diff --git a/docs/res/favicon.png b/docs/res/favicon.png index 32a1c127ed7f641e82b4308dd4a73397ef604ab3..0ab6e0355c34c81d16ecbd09220e10b89160142d 100644 Binary files a/docs/res/favicon.png and b/docs/res/favicon.png differ diff --git a/docs/res/favicon_round.png b/docs/res/favicon_round.png index 03d0be1955ae72047268c12617c355fe87123af7..1299deda6b67dc199d351b41aba2b76654361026 100644 Binary files a/docs/res/favicon_round.png and b/docs/res/favicon_round.png differ diff --git a/docs/res/header.png b/docs/res/header.png index a2acc5befbb091fd7b1d76cf913b7cee067512f9..ba397b8fee3e1184309dc878587c41db65e9dbde 100644 Binary files a/docs/res/header.png and b/docs/res/header.png differ diff --git a/docs/res/install_guide.png b/docs/res/install_guide.png index e0da0262e73b2f9dfc23e12e3a0f0636f43a1265..e34ad1e5eedccff343e761476f7b2bd7f40835fa 100644 Binary files a/docs/res/install_guide.png and b/docs/res/install_guide.png differ diff --git a/docs/res/profiles.png b/docs/res/profiles.png index 55e2ef2f663bc325ef4c64da7e911dd04df9b111..43afd002fc297dfd471b1cd37421550f22f4baa0 100644 Binary files a/docs/res/profiles.png and b/docs/res/profiles.png differ diff --git a/docs/res/quickstart/image-24.png b/docs/res/quickstart/image-24.png index b804d503a3cbb4a03a2a64f7f63a9b94f8eab64c..8538c4daa6b052efa34d4940c34e314852a89a9b 100644 Binary files a/docs/res/quickstart/image-24.png and b/docs/res/quickstart/image-24.png differ diff --git a/docs/res/quickstart/ui_chat_management.png b/docs/res/quickstart/ui_chat_management.png index 0190a7a6e29806e53b211d134212a002cc39967d..e0484627c61daa008e344698f496175fb0521d2d 100644 Binary files a/docs/res/quickstart/ui_chat_management.png and b/docs/res/quickstart/ui_chat_management.png differ diff --git a/docs/res/quickstart/ui_newchat1.png b/docs/res/quickstart/ui_newchat1.png index 34a6eb8d0040cd61754b098376576e98cc4ee21b..94e5246e45e789c43751462d08699f7670893283 100644 Binary files a/docs/res/quickstart/ui_newchat1.png and b/docs/res/quickstart/ui_newchat1.png differ diff --git a/docs/res/settings-page-ui1.png b/docs/res/settings-page-ui1.png index a8b4242f515559dfbaa11fb90e32c270fcc621aa..7c2b3fa50ae2bbaf1ee6f37580f929bda21979a8 100644 Binary files a/docs/res/settings-page-ui1.png and b/docs/res/settings-page-ui1.png differ diff --git a/docs/res/setup/1-docker-image-search.png b/docs/res/setup/1-docker-image-search.png index 78924a946c00a36c9551bee90a5ac17dfffd75af..b4635c171ae31a4840c53fed0d46c97608b1ead6 100644 Binary files a/docs/res/setup/1-docker-image-search.png and b/docs/res/setup/1-docker-image-search.png differ diff --git a/docs/res/setup/2-docker-image-run-3.png b/docs/res/setup/2-docker-image-run-3.png index 21323751f475ef183770ad9ea24a505f3bfe9a9b..395c96c7e4d43138b9e6bd68a9d30c56a374a2e4 100644 Binary files a/docs/res/setup/2-docker-image-run-3.png and b/docs/res/setup/2-docker-image-run-3.png differ diff --git a/docs/res/setup/2-docker-image-run.png b/docs/res/setup/2-docker-image-run.png index 7ff784458db4c023229cd8559cdddf542a6f7358..0d5a3166e573ad0d1045217678284d313e1d9c5a 100644 Binary files a/docs/res/setup/2-docker-image-run.png and b/docs/res/setup/2-docker-image-run.png differ diff --git a/docs/res/setup/3-docker-port-mapping.png b/docs/res/setup/3-docker-port-mapping.png index c67caab985dce20cc8fa3309e1986481b624f17b..e6d5ba9d5103d86ff79ea70d6f57f87c3d78de01 100644 Binary files a/docs/res/setup/3-docker-port-mapping.png and b/docs/res/setup/3-docker-port-mapping.png differ diff --git a/docs/res/setup/4-docker-container-started.png b/docs/res/setup/4-docker-container-started.png index 0252e9dac91f073d1eb2f0a5ca437a7dd444c0a0..181fb1ea11f83b33c492db5f90edaa71d57db778 100644 Binary files a/docs/res/setup/4-docker-container-started.png and b/docs/res/setup/4-docker-container-started.png differ diff --git a/docs/res/setup/5-docker-click-to-open.png b/docs/res/setup/5-docker-click-to-open.png index 3e0ca37006224e1980eb966a3693123067f166b9..88c5183e7dfe319516a2396455d17fdacc28bd73 100644 Binary files a/docs/res/setup/5-docker-click-to-open.png and b/docs/res/setup/5-docker-click-to-open.png differ diff --git a/docs/res/setup/6-docker-a0-running-new.png b/docs/res/setup/6-docker-a0-running-new.png index 03d78d07f6fc1605e8bd24b2ab49e143d3fe704b..7e3fc65f37ec30628384ff61bd9d929d622f83b0 100644 Binary files a/docs/res/setup/6-docker-a0-running-new.png and b/docs/res/setup/6-docker-a0-running-new.png differ diff --git a/docs/res/setup/9-rfc-devpage-on-docker-instance-1.png b/docs/res/setup/9-rfc-devpage-on-docker-instance-1.png index 7e14eb877b6603f73a5855730fcbc0c2b160e721..0ff395282c5a196bbde88c58837197af48bca8c1 100644 Binary files a/docs/res/setup/9-rfc-devpage-on-docker-instance-1.png and b/docs/res/setup/9-rfc-devpage-on-docker-instance-1.png differ diff --git a/docs/res/setup/9-rfc-devpage-on-local-sbs-1.png b/docs/res/setup/9-rfc-devpage-on-local-sbs-1.png index dd2ee9ab4c731988e53b5362001242d789da192b..49e732912b440ba42327d57b262d90e8b22be45a 100644 Binary files a/docs/res/setup/9-rfc-devpage-on-local-sbs-1.png and b/docs/res/setup/9-rfc-devpage-on-local-sbs-1.png differ diff --git a/docs/res/setup/a2a/a2a-conn.png b/docs/res/setup/a2a/a2a-conn.png index d0ae234aef632ada11559d63d45308854004ade9..c9c43fffb105150c8e4551f2d5e7ecf44a197a85 100644 Binary files a/docs/res/setup/a2a/a2a-conn.png and b/docs/res/setup/a2a/a2a-conn.png differ diff --git a/docs/res/setup/a2a/a2a2.png b/docs/res/setup/a2a/a2a2.png index 82856c38e2192684bd8230fbadf841f66af9e1d2..0e3f250b22ed4aaba1650415361eb3d5d29225c6 100644 Binary files a/docs/res/setup/a2a/a2a2.png and b/docs/res/setup/a2a/a2a2.png differ diff --git a/docs/res/setup/docker-delete-image-1.png b/docs/res/setup/docker-delete-image-1.png index a8106c0697e45f36cb685eb5f0d89575a545f562..ccf5b6d8725e69a123c34f56d51459254a61d4f1 100644 Binary files a/docs/res/setup/docker-delete-image-1.png and b/docs/res/setup/docker-delete-image-1.png differ diff --git a/docs/res/setup/image-1.png b/docs/res/setup/image-1.png index e6ef01cc1adf04a40bac8d9d6d16fc7462279736..f093720c90241d35dfc38074b70aed8769962491 100644 Binary files a/docs/res/setup/image-1.png and b/docs/res/setup/image-1.png differ diff --git a/docs/res/setup/image-10.png b/docs/res/setup/image-10.png index 5ba5b0c39074c6732612a7104b95f65750f49bf5..c2f81892350e31d755d0866fa5a662d1320522d3 100644 Binary files a/docs/res/setup/image-10.png and b/docs/res/setup/image-10.png differ diff --git a/docs/res/setup/image-11.png b/docs/res/setup/image-11.png index fb59dee9dea53497ec6a3ed8461c360570e672bb..389a376c40c7bfb66d32652b61ecc9ed08b56f00 100644 Binary files a/docs/res/setup/image-11.png and b/docs/res/setup/image-11.png differ diff --git a/docs/res/setup/image-12.png b/docs/res/setup/image-12.png index 3d6d4144139f94e0e27d92a278cf437803485482..b480bc8c4aefa3b5db45e51b9f1883a78dacb741 100644 Binary files a/docs/res/setup/image-12.png and b/docs/res/setup/image-12.png differ diff --git a/docs/res/setup/image-13.png b/docs/res/setup/image-13.png index da111bf8adc0018cdb6bb28a75048fb372821249..3b4ff1aadc3010bd0c61572f9dc03ce5e0b6dad6 100644 Binary files a/docs/res/setup/image-13.png and b/docs/res/setup/image-13.png differ diff --git a/docs/res/setup/image-14-u.png b/docs/res/setup/image-14-u.png index 3c279a993310416bbc6051db539da257f7ff59e1..b834e4dcabf77f5d3172e5202e9a1dd631b5b265 100644 Binary files a/docs/res/setup/image-14-u.png and b/docs/res/setup/image-14-u.png differ diff --git a/docs/res/setup/image-14.png b/docs/res/setup/image-14.png index ed7d9c503dc9ae5148fd35db783f29e456b97212..0c20bf721059eac30a287ee1aa073aaed1c50182 100644 Binary files a/docs/res/setup/image-14.png and b/docs/res/setup/image-14.png differ diff --git a/docs/res/setup/image-15.png b/docs/res/setup/image-15.png index 75fdbf7f559774b444486a76b6ad4669589138cd..af6a16de718ef80276a6d0f827022d2399923ea2 100644 Binary files a/docs/res/setup/image-15.png and b/docs/res/setup/image-15.png differ diff --git a/docs/res/setup/image-16.png b/docs/res/setup/image-16.png index 29ca4646a84c7bc49bfd31f37ec7fa05cc9e3434..528239c3e626af31fc02698ae314dea1e6550e80 100644 Binary files a/docs/res/setup/image-16.png and b/docs/res/setup/image-16.png differ diff --git a/docs/res/setup/image-17.png b/docs/res/setup/image-17.png index 6a8379c20d53210638fb894415f254aa3d04c41e..e3e1808cf1a662ffa3881ff24818198e5f0d91e3 100644 Binary files a/docs/res/setup/image-17.png and b/docs/res/setup/image-17.png differ diff --git a/docs/res/setup/image-18.png b/docs/res/setup/image-18.png index 460cb483865473d445875eb23fbf2fd4a65f7947..cd7b0af74975c34b0232efb03a86f741acab044c 100644 Binary files a/docs/res/setup/image-18.png and b/docs/res/setup/image-18.png differ diff --git a/docs/res/setup/image-2.png b/docs/res/setup/image-2.png index 5e2609f571cc2ab1a1ef35acc58d86bdb8f88c2e..544cdd79e0deed5aa1dffbfded71779251febae0 100644 Binary files a/docs/res/setup/image-2.png and b/docs/res/setup/image-2.png differ diff --git a/docs/res/setup/image-20.png b/docs/res/setup/image-20.png index 4053618050d2f0656c79feee3b9ab4a597fc92ec..77c2ac6590e2bb62ceec868046a7afb2ebb6bfc8 100644 Binary files a/docs/res/setup/image-20.png and b/docs/res/setup/image-20.png differ diff --git a/docs/res/setup/image-21.png b/docs/res/setup/image-21.png index bbb33b0a1852e9e832809315f9ddaad4c2e9ae6e..c443797c20fe3ea71f537de84139e394e0ea0219 100644 Binary files a/docs/res/setup/image-21.png and b/docs/res/setup/image-21.png differ diff --git a/docs/res/setup/image-22-1.png b/docs/res/setup/image-22-1.png index a0b4e34a407344f3294107cb2d520b1f78db4b33..8b1c3dd7d19623a68a1ffd8a4a4140096cff8771 100644 Binary files a/docs/res/setup/image-22-1.png and b/docs/res/setup/image-22-1.png differ diff --git a/docs/res/setup/image-23-1.png b/docs/res/setup/image-23-1.png index aac45078bd5ef37d487c1f8928191933272f2388..00660924d2fee978707bf312c98160a65011b0c0 100644 Binary files a/docs/res/setup/image-23-1.png and b/docs/res/setup/image-23-1.png differ diff --git a/docs/res/setup/image-3.png b/docs/res/setup/image-3.png index dc0af02f500ac1b7c94fd27606266d8d90b59966..5926e6637830431328362b76787770a221aa8b48 100644 Binary files a/docs/res/setup/image-3.png and b/docs/res/setup/image-3.png differ diff --git a/docs/res/setup/image-4.png b/docs/res/setup/image-4.png index b2b44e5308b14e29576c8473ac5660658ed0e6ab..a2d07b060cae74a83415d95607ca42c5bbf836c6 100644 Binary files a/docs/res/setup/image-4.png and b/docs/res/setup/image-4.png differ diff --git a/docs/res/setup/image-5.png b/docs/res/setup/image-5.png index 232a33bbb36f540f2785a4cde4c4f4caada4d518..d72edd97171c7948a4ce0c2fd2c99e085391d2dd 100644 Binary files a/docs/res/setup/image-5.png and b/docs/res/setup/image-5.png differ diff --git a/docs/res/setup/image-6.png b/docs/res/setup/image-6.png index 7feda138487749d913442a00a1c8b17849e55f56..bf4e7b00a116e18978091823d964d2515c5132f8 100644 Binary files a/docs/res/setup/image-6.png and b/docs/res/setup/image-6.png differ diff --git a/docs/res/setup/image-7.png b/docs/res/setup/image-7.png index 5a915d278f9352d761fa2119826ead657836b09e..bd40a38ac07e61c5aad3682b30b79bfc6fcf440e 100644 Binary files a/docs/res/setup/image-7.png and b/docs/res/setup/image-7.png differ diff --git a/docs/res/setup/image-8.png b/docs/res/setup/image-8.png index 0296fc814666a2a675e130d9ecfe9dd7c626100f..08d3294b08298bb3b43ae0705134b0253abc8a07 100644 Binary files a/docs/res/setup/image-8.png and b/docs/res/setup/image-8.png differ diff --git a/docs/res/setup/image-9.png b/docs/res/setup/image-9.png index 9d42f21c0ea1f31427918b2e8e4f4b18800e3e8a..c74e4c54d2cf4b93146ec516c7fbace4bee0e7e2 100644 Binary files a/docs/res/setup/image-9.png and b/docs/res/setup/image-9.png differ diff --git a/docs/res/setup/image.png b/docs/res/setup/image.png index ee61eb89707a2d4d7056c461d5fa4d71f45f00f4..1356d5e0b73e1a3e98967bbbf99dd3121d0e61d1 100644 Binary files a/docs/res/setup/image.png and b/docs/res/setup/image.png differ diff --git a/docs/res/setup/macsocket.png b/docs/res/setup/macsocket.png index 2574848b44bb2bdd785edd81056b0ec72258c26f..8b5a6a282165d7baa3e08dc6532037297d19fe93 100644 Binary files a/docs/res/setup/macsocket.png and b/docs/res/setup/macsocket.png differ diff --git a/docs/res/setup/mcp/mcp-example-config.png b/docs/res/setup/mcp/mcp-example-config.png index 5dbe327eb28d94569a2983316abce6c88d3f711b..4e3fff0a0041aecea1cbed9394538ae41f8a3553 100644 Binary files a/docs/res/setup/mcp/mcp-example-config.png and b/docs/res/setup/mcp/mcp-example-config.png differ diff --git a/docs/res/setup/mcp/mcp-open-config.png b/docs/res/setup/mcp/mcp-open-config.png index dc63ce0daa52db3ca2e7e81778345211b3b3c0f6..0f2239b61f01b6cbe7c878643f9e9906247922a0 100644 Binary files a/docs/res/setup/mcp/mcp-open-config.png and b/docs/res/setup/mcp/mcp-open-config.png differ diff --git a/docs/res/setup/oses/apple.png b/docs/res/setup/oses/apple.png index b11a74a82bfc5db206947dc11a4614ed8e1f665d..6641175f0b971fe3dc3cba8084030771e7289d50 100644 Binary files a/docs/res/setup/oses/apple.png and b/docs/res/setup/oses/apple.png differ diff --git a/docs/res/setup/oses/linux.png b/docs/res/setup/oses/linux.png index cbeaf4547d21df2b636c48c5165f12e1f29b0553..ecd236a3e113373360f9e24c38b5e71c75946c5f 100644 Binary files a/docs/res/setup/oses/linux.png and b/docs/res/setup/oses/linux.png differ diff --git a/docs/res/setup/oses/windows.png b/docs/res/setup/oses/windows.png index 130b33c8f8e3701f6cf26cad6f9488e77ec8706e..a480a1b7b21acf3dda975b494fa13f5b0e7d58b9 100644 Binary files a/docs/res/setup/oses/windows.png and b/docs/res/setup/oses/windows.png differ diff --git a/docs/res/setup/settings/1-agentConfig.png b/docs/res/setup/settings/1-agentConfig.png index 5082c40c37fdd39a182bb0d024bb675d794907c1..56827a2640c475b9272c8c7748ddd8c2943f9346 100644 Binary files a/docs/res/setup/settings/1-agentConfig.png and b/docs/res/setup/settings/1-agentConfig.png differ diff --git a/docs/res/setup/settings/2-chat-model.png b/docs/res/setup/settings/2-chat-model.png index 52fa0fb1078c67e882601a38f76ad4efd94483c0..f2dfab4824248c3244b5067929d70f22f9a679ec 100644 Binary files a/docs/res/setup/settings/2-chat-model.png and b/docs/res/setup/settings/2-chat-model.png differ diff --git a/docs/res/setup/settings/3-auth.png b/docs/res/setup/settings/3-auth.png index 15d294c15ddf1a318c51a8e88a2fdae1d41e6644..f9c51cd191fe0dc491a3afb7f7954d35c91f0268 100644 Binary files a/docs/res/setup/settings/3-auth.png and b/docs/res/setup/settings/3-auth.png differ diff --git a/docs/res/setup/settings/4-local-models.png b/docs/res/setup/settings/4-local-models.png index 216ada1d88e485502122588dc1a1f0288b8455ef..72b0bc0b9008f113c224ab211dfc21c6bbe7186e 100644 Binary files a/docs/res/setup/settings/4-local-models.png and b/docs/res/setup/settings/4-local-models.png differ diff --git a/docs/res/setup/thumb_setup.png b/docs/res/setup/thumb_setup.png index e56d5c99a6c16e70f585da4416c49b9ac4a1e5fa..12d5c65910f76c93266fdce627aaf53735abe3e1 100644 Binary files a/docs/res/setup/thumb_setup.png and b/docs/res/setup/thumb_setup.png differ diff --git a/docs/res/setup/update-initialize.png b/docs/res/setup/update-initialize.png index 454753dc615717ee45162858d8d7a6aca1268ba7..b157e63ca44c70fb5fb9241c71817ca74ec06ff8 100644 Binary files a/docs/res/setup/update-initialize.png and b/docs/res/setup/update-initialize.png differ diff --git a/docs/res/splash.webp b/docs/res/splash.webp index 1cc914dd95acae962665e06bf92044602a3ca70c..1df109fc0c71640ab119cae12b9c739ac32ae85c 100644 Binary files a/docs/res/splash.webp and b/docs/res/splash.webp differ diff --git a/docs/res/splash_wide.png b/docs/res/splash_wide.png index 1f8654f9888407566126bf22026ad7a9c32d130c..d94c65887286ab8a2fe9f11951c3beaefbed6832 100644 Binary files a/docs/res/splash_wide.png and b/docs/res/splash_wide.png differ diff --git a/docs/res/thumbnail-install.webp b/docs/res/thumbnail-install.webp index 9e9ce953a6871199626b406269672eeeac4ac8be..7a6305ee37650c02f3dc67235cd1bb9d3ece0271 100644 Binary files a/docs/res/thumbnail-install.webp and b/docs/res/thumbnail-install.webp differ diff --git a/docs/res/time-travel.png b/docs/res/time-travel.png index 53a783036dc541203cbeb74bb80c2244daf0b37f..a529d8a43749fe38694203d880f216192de710a3 100644 Binary files a/docs/res/time-travel.png and b/docs/res/time-travel.png differ diff --git a/docs/res/ui_screen2.png b/docs/res/ui_screen2.png index 58c62582abd0e574ac14deaa37e09960bc11a597..f702fba9e2a7c9928ce00e921b268cd29f01c5d7 100644 Binary files a/docs/res/ui_screen2.png and b/docs/res/ui_screen2.png differ diff --git a/docs/res/usage/a0-cli/a0-cli-browser-host-mode.png b/docs/res/usage/a0-cli/a0-cli-browser-host-mode.png index b31b16a05ae5923ed12e9426528671b35b9bbcd4..4743f12f86a110296c91e08413925d0c4227aab1 100644 Binary files a/docs/res/usage/a0-cli/a0-cli-browser-host-mode.png and b/docs/res/usage/a0-cli/a0-cli-browser-host-mode.png differ diff --git a/docs/res/usage/a0-cli/a0-cli-browser-privacy.png b/docs/res/usage/a0-cli/a0-cli-browser-privacy.png index 1aa66741e92e9ca0f84cf64827adc3c854292a73..1516a8f3f993c808ecf13c36d8702784c9669576 100644 Binary files a/docs/res/usage/a0-cli/a0-cli-browser-privacy.png and b/docs/res/usage/a0-cli/a0-cli-browser-privacy.png differ diff --git a/docs/res/usage/a0-cli/a0-cli-browser-status.png b/docs/res/usage/a0-cli/a0-cli-browser-status.png index e55a0c46d7de2397507c446dd9e79d0c2d6c7013..a245fb40c7037db797c6400bc717dcbbda9c6686 100644 Binary files a/docs/res/usage/a0-cli/a0-cli-browser-status.png and b/docs/res/usage/a0-cli/a0-cli-browser-status.png differ diff --git a/docs/res/usage/a0-cli/a0-cli-command-browser.png b/docs/res/usage/a0-cli/a0-cli-command-browser.png index 55b3657304f9dd75f4653eff88c00ded8842033f..746ff45ea4dfbf294c529247f5f717668a962770 100644 Binary files a/docs/res/usage/a0-cli/a0-cli-command-browser.png and b/docs/res/usage/a0-cli/a0-cli-command-browser.png differ diff --git a/docs/res/usage/a0-cli/a0-cli-command-palette.png b/docs/res/usage/a0-cli/a0-cli-command-palette.png index e3b0cd986653af0d7596c3401876afadacedcb75..ea1e9b43aee5df85133db3c05d652693e495337e 100644 Binary files a/docs/res/usage/a0-cli/a0-cli-command-palette.png and b/docs/res/usage/a0-cli/a0-cli-command-palette.png differ diff --git a/docs/res/usage/a0-cli/a0-cli-host-picker.png b/docs/res/usage/a0-cli/a0-cli-host-picker.png index e23d47564dc6292d66e14da621e3894fe24d1e86..2e7a3be0739142e97e014b8b965c91bd5eafa7df 100644 Binary files a/docs/res/usage/a0-cli/a0-cli-host-picker.png and b/docs/res/usage/a0-cli/a0-cli-host-picker.png differ diff --git a/docs/res/usage/a0-cli/a0-cli-permissions.png b/docs/res/usage/a0-cli/a0-cli-permissions.png index 9fe04b6c53e2114a06edc159a87b2cd56cb6fd9f..b6fe50f619d643fda31ffb46ba21356acda57bfe 100644 Binary files a/docs/res/usage/a0-cli/a0-cli-permissions.png and b/docs/res/usage/a0-cli/a0-cli-permissions.png differ diff --git a/docs/res/usage/a0-cli/a0-cli-profile-created.png b/docs/res/usage/a0-cli/a0-cli-profile-created.png index 927b8425929992f738481905aadd8bd47cbec1c3..c92a34010b01e7d576c1bdcf2697c368a9a4897e 100644 Binary files a/docs/res/usage/a0-cli/a0-cli-profile-created.png and b/docs/res/usage/a0-cli/a0-cli-profile-created.png differ diff --git a/docs/res/usage/a0-cli/a0-cli-profile-menu.png b/docs/res/usage/a0-cli/a0-cli-profile-menu.png index 482ff90c5c650ac80836331585b5617e2fbc6047..83a0da4c8d744345ceaf41898e368581d55d460c 100644 Binary files a/docs/res/usage/a0-cli/a0-cli-profile-menu.png and b/docs/res/usage/a0-cli/a0-cli-profile-menu.png differ diff --git a/docs/res/usage/a0-cli/a0-cli-start.png b/docs/res/usage/a0-cli/a0-cli-start.png index a875e3ef07e52de3ac710e94f77dfe097f96e2c0..a4c8a72b536a2e745c83d7c189376c64784c5eaa 100644 Binary files a/docs/res/usage/a0-cli/a0-cli-start.png and b/docs/res/usage/a0-cli/a0-cli-start.png differ diff --git a/docs/res/usage/action-btns.png b/docs/res/usage/action-btns.png index 42679e02ed4f394cf6565180d06578a627012bcf..1eb64c46520b0438f3f67dcda8a63e10121b7902 100644 Binary files a/docs/res/usage/action-btns.png and b/docs/res/usage/action-btns.png differ diff --git a/docs/res/usage/api-int/api-int-1.png b/docs/res/usage/api-int/api-int-1.png index 35d868d25e63b47baddcde06b6e23368d6f07b24..6be5c9a534fe15942dd083ee23c86e531fe71888 100644 Binary files a/docs/res/usage/api-int/api-int-1.png and b/docs/res/usage/api-int/api-int-1.png differ diff --git a/docs/res/usage/api-int/api-int-2image-gen-api2.png b/docs/res/usage/api-int/api-int-2image-gen-api2.png index e80b8ddb894d37a95b8d26cf848d051b0c30333b..3a55af93ea7d2f443fd20fc22ed7b33b967fd31b 100644 Binary files a/docs/res/usage/api-int/api-int-2image-gen-api2.png and b/docs/res/usage/api-int/api-int-2image-gen-api2.png differ diff --git a/docs/res/usage/api-int/api-int-3-api-key-missing-secrets.png b/docs/res/usage/api-int/api-int-3-api-key-missing-secrets.png index e56e8cfb6955881ea77eccef99c8854bbd60f182..a3a816ebf794388465ef5c76f5658ee19d264c95 100644 Binary files a/docs/res/usage/api-int/api-int-3-api-key-missing-secrets.png and b/docs/res/usage/api-int/api-int-3-api-key-missing-secrets.png differ diff --git a/docs/res/usage/api-int/api-int-4-secrets-setting.png b/docs/res/usage/api-int/api-int-4-secrets-setting.png index 551576849f855a6319a344471406f48a911438ad..335b006de80528942b4b177ea975c0e33ece5e3d 100644 Binary files a/docs/res/usage/api-int/api-int-4-secrets-setting.png and b/docs/res/usage/api-int/api-int-4-secrets-setting.png differ diff --git a/docs/res/usage/api-int/api-int-5-finish.png b/docs/res/usage/api-int/api-int-5-finish.png index d673e7301cc0fb95cc0d0e2e95af5c4785ff23ee..77559db299b007b8b6b1359a6bf9c911746003a3 100644 Binary files a/docs/res/usage/api-int/api-int-5-finish.png and b/docs/res/usage/api-int/api-int-5-finish.png differ diff --git a/docs/res/usage/attachments-1.png b/docs/res/usage/attachments-1.png index 02c348dbe4239c7cbd91e162cd98a477e36797f1..b6f51f6e4253b9bd802669d0361d8ebbb0387045 100644 Binary files a/docs/res/usage/attachments-1.png and b/docs/res/usage/attachments-1.png differ diff --git a/docs/res/usage/attachments-2.png b/docs/res/usage/attachments-2.png index 744e3406c20d667506eb4fab4ff94b649df1e2e4..f1e865fa0cbe8211c1f017b4819c6dd2565c2af0 100644 Binary files a/docs/res/usage/attachments-2.png and b/docs/res/usage/attachments-2.png differ diff --git a/docs/res/usage/browser/browser-annotation-comment.png b/docs/res/usage/browser/browser-annotation-comment.png index 6a12031b762210cac7efb0b367efad7084818679..f1e27567748cdf73ece3a53063b345dd3d8b9ee3 100644 Binary files a/docs/res/usage/browser/browser-annotation-comment.png and b/docs/res/usage/browser/browser-annotation-comment.png differ diff --git a/docs/res/usage/browser/browser-canvas-example.png b/docs/res/usage/browser/browser-canvas-example.png index 4724cb534c23ebcc97e4fc9083c198eedb32bb54..ab0b9f809abd8b7ccb8ff636470d44ac28b6b194 100644 Binary files a/docs/res/usage/browser/browser-canvas-example.png and b/docs/res/usage/browser/browser-canvas-example.png differ diff --git a/docs/res/usage/browser/browser-canvas-wide.png b/docs/res/usage/browser/browser-canvas-wide.png index 637333b58959ba572a32628cf8df3afa616af0c4..356340bf433440b1953ed163ea6d8cdf9dab8ea0 100644 Binary files a/docs/res/usage/browser/browser-canvas-wide.png and b/docs/res/usage/browser/browser-canvas-wide.png differ diff --git a/docs/res/usage/browser/browser-plugin-settings.png b/docs/res/usage/browser/browser-plugin-settings.png index e306a3a70d1e9e18473aa470b5c631c9c1f5004c..a05eead7ca0d68e63fb6626037c27e141ba427e8 100644 Binary files a/docs/res/usage/browser/browser-plugin-settings.png and b/docs/res/usage/browser/browser-plugin-settings.png differ diff --git a/docs/res/usage/browser/browser-tool-history-expanded.png b/docs/res/usage/browser/browser-tool-history-expanded.png index 4597ee3717e03b7e264e8caedb08205440109ab2..dda841e83865939b6a96d225816a9f3ef017d662 100644 Binary files a/docs/res/usage/browser/browser-tool-history-expanded.png and b/docs/res/usage/browser/browser-tool-history-expanded.png differ diff --git a/docs/res/usage/browser/browser-toolbar-settings.png b/docs/res/usage/browser/browser-toolbar-settings.png index 102b3ecff47eadf57d2c6e1325ca9666efa97282..d1de1d4ded5d04ee08ede9dd8003ecd91823a881 100644 Binary files a/docs/res/usage/browser/browser-toolbar-settings.png and b/docs/res/usage/browser/browser-toolbar-settings.png differ diff --git a/docs/res/usage/browser/host-browser-remote-debugging-allow.png b/docs/res/usage/browser/host-browser-remote-debugging-allow.png index 1cd20052d3cb2ff9f12d6d6a05cf1cd009e6e08c..f68ed75d77794c65d1ce4b7e38c3bbad1ed30d83 100644 Binary files a/docs/res/usage/browser/host-browser-remote-debugging-allow.png and b/docs/res/usage/browser/host-browser-remote-debugging-allow.png differ diff --git a/docs/res/usage/browser/host-browser-remote-debugging-setting.png b/docs/res/usage/browser/host-browser-remote-debugging-setting.png index 4df071fb6595fe891f614fa3399b0f87706ab002..5ddcedcd2c250581f1d6a20f5f474268e6bbfa26 100644 Binary files a/docs/res/usage/browser/host-browser-remote-debugging-setting.png and b/docs/res/usage/browser/host-browser-remote-debugging-setting.png differ diff --git a/docs/res/usage/file-browser.png b/docs/res/usage/file-browser.png index 82cc9cba6eee39ee9edd8fe1355e9aef56d1886e..d00489f294a13dd7caf6b28f2b49301bedffda03 100644 Binary files a/docs/res/usage/file-browser.png and b/docs/res/usage/file-browser.png differ diff --git a/docs/res/usage/file-edit.png b/docs/res/usage/file-edit.png index f3706b4f40bdf51cb34a5dd4f1c4c6ffe05f6d7c..416f7066484a658be329382bf4b8034b521bce52 100644 Binary files a/docs/res/usage/file-edit.png and b/docs/res/usage/file-edit.png differ diff --git a/docs/res/usage/first-task.png b/docs/res/usage/first-task.png index 5720acff752ef38850e8b7fdaee15a1e27aee33a..01c9e362dab303454e43f7f25801ee08083fca8b 100644 Binary files a/docs/res/usage/first-task.png and b/docs/res/usage/first-task.png differ diff --git a/docs/res/usage/launcher/launcher-installs.png b/docs/res/usage/launcher/launcher-installs.png index 01f90fe789dd35e26d8f0414415ab48913f3e3ba..a608e396c0d9d1770f4c2bb2f3d5a496e49acc28 100644 Binary files a/docs/res/usage/launcher/launcher-installs.png and b/docs/res/usage/launcher/launcher-installs.png differ diff --git a/docs/res/usage/launcher/launcher-runtime-setup.png b/docs/res/usage/launcher/launcher-runtime-setup.png index fc1029becb38fb2a3bfe2704c344fad138186250..c6fa6e7abf62140f95dce4a3de96e137e4065b13 100644 Binary files a/docs/res/usage/launcher/launcher-runtime-setup.png and b/docs/res/usage/launcher/launcher-runtime-setup.png differ diff --git a/docs/res/usage/memory-dashboard.png b/docs/res/usage/memory-dashboard.png index 6c9506c357aa765520795157b55c5658d0401479..701264ed914cc50cc890b9e7caf892728e7161b7 100644 Binary files a/docs/res/usage/memory-dashboard.png and b/docs/res/usage/memory-dashboard.png differ diff --git a/docs/res/usage/memory-editing.png b/docs/res/usage/memory-editing.png index 469fb7dc050bb07c7a0923045cf1e1da3f632c38..ae3a655d736487375a27cd7de3b3a7878388f5e7 100644 Binary files a/docs/res/usage/memory-editing.png and b/docs/res/usage/memory-editing.png differ diff --git a/docs/res/usage/multi-agent.png b/docs/res/usage/multi-agent.png index 9286f96f7aab4dcd9ff44fd6f8f7be0496446969..eb50e4e6c39b6551a23c4986c4232861430185bb 100644 Binary files a/docs/res/usage/multi-agent.png and b/docs/res/usage/multi-agent.png differ diff --git a/docs/res/usage/nudge.png b/docs/res/usage/nudge.png index 8746667bd084520d02b754bcf9f42c1334a1818e..ae15ba3180ff928bbf31eccb622f47c380217ae8 100644 Binary files a/docs/res/usage/nudge.png and b/docs/res/usage/nudge.png differ diff --git a/docs/res/usage/onboarding/onboarding-account-provider.png b/docs/res/usage/onboarding/onboarding-account-provider.png index 803b1ea46845d2c1d9a3f95d387b32b93d09e0c2..d4da83c5a19679585a7f821c17a24ca6ad1c17ff 100644 Binary files a/docs/res/usage/onboarding/onboarding-account-provider.png and b/docs/res/usage/onboarding/onboarding-account-provider.png differ diff --git a/docs/res/usage/onboarding/onboarding-agent-zero-api-key-model.png b/docs/res/usage/onboarding/onboarding-agent-zero-api-key-model.png index 28aeebef74310038e4a75e3bc2a6729a0990bfa0..713c338caf2654a857e505f1f3fea7b1b03c8c88 100644 Binary files a/docs/res/usage/onboarding/onboarding-agent-zero-api-key-model.png and b/docs/res/usage/onboarding/onboarding-agent-zero-api-key-model.png differ diff --git a/docs/res/usage/onboarding/onboarding-agent-zero-api-model-dropdown.png b/docs/res/usage/onboarding/onboarding-agent-zero-api-model-dropdown.png index 28aeebef74310038e4a75e3bc2a6729a0990bfa0..713c338caf2654a857e505f1f3fea7b1b03c8c88 100644 Binary files a/docs/res/usage/onboarding/onboarding-agent-zero-api-model-dropdown.png and b/docs/res/usage/onboarding/onboarding-agent-zero-api-model-dropdown.png differ diff --git a/docs/res/usage/onboarding/onboarding-cloud-provider.png b/docs/res/usage/onboarding/onboarding-cloud-provider.png index dcdbcc4815c2a3ec04ee7d8c271791f5078fbf2f..322b0093ce1be0d79dc670971bd6bfa85a864b6c 100644 Binary files a/docs/res/usage/onboarding/onboarding-cloud-provider.png and b/docs/res/usage/onboarding/onboarding-cloud-provider.png differ diff --git a/docs/res/usage/onboarding/onboarding-local-ollama-main.png b/docs/res/usage/onboarding/onboarding-local-ollama-main.png index 3c7891c44daca51dba95f9dbfabeb5ced950da00..af74853a020cbfdafb24877f0e4fb76a1263d61d 100644 Binary files a/docs/res/usage/onboarding/onboarding-local-ollama-main.png and b/docs/res/usage/onboarding/onboarding-local-ollama-main.png differ diff --git a/docs/res/usage/onboarding/onboarding-model-gate.png b/docs/res/usage/onboarding/onboarding-model-gate.png index 45793915122d0560cc01fb23538e9850abb033b9..781b489df40fd1e4393b16c70acf8e1b70a72ab2 100644 Binary files a/docs/res/usage/onboarding/onboarding-model-gate.png and b/docs/res/usage/onboarding/onboarding-model-gate.png differ diff --git a/docs/res/usage/onboarding/onboarding-ready.png b/docs/res/usage/onboarding/onboarding-ready.png index c11a6ce382110aadaa2ba128b1e69c5a51e7cc30..44dbcf2d8d6004613cbf389a878ab7eb82d62fe7 100644 Binary files a/docs/res/usage/onboarding/onboarding-ready.png and b/docs/res/usage/onboarding/onboarding-ready.png differ diff --git a/docs/res/usage/onboarding/onboarding-start.png b/docs/res/usage/onboarding/onboarding-start.png index eb618ed4da8feb72f0a8b2db4bf7a63e31725678..d217c866dd09bf43e5ffb40f971652767cca4005 100644 Binary files a/docs/res/usage/onboarding/onboarding-start.png and b/docs/res/usage/onboarding/onboarding-start.png differ diff --git a/docs/res/usage/onboarding/onboarding-utility-same-model.png b/docs/res/usage/onboarding/onboarding-utility-same-model.png index f0c7048d9f19b2779cc21a93893678fe59fcfe8b..7e2627c218bde9ec693ec60ba303dc7a1258d233 100644 Binary files a/docs/res/usage/onboarding/onboarding-utility-same-model.png and b/docs/res/usage/onboarding/onboarding-utility-same-model.png differ diff --git a/docs/res/usage/projects/projects-activate-project.png b/docs/res/usage/projects/projects-activate-project.png index 722145a4bb578847c5580d21fe5b177b69f872ab..f9dbb4162d7af53d747eafe5eaf3b1f41100f759 100644 Binary files a/docs/res/usage/projects/projects-activate-project.png and b/docs/res/usage/projects/projects-activate-project.png differ diff --git a/docs/res/usage/projects/projects-creation.png b/docs/res/usage/projects/projects-creation.png index 41630d87cc43960d8abc45f134b031ac34aaad74..b0417ed45ab026c21e67495c161060aca4e524e8 100644 Binary files a/docs/res/usage/projects/projects-creation.png and b/docs/res/usage/projects/projects-creation.png differ diff --git a/docs/res/usage/projects/projects-desc-and-instructions.png b/docs/res/usage/projects/projects-desc-and-instructions.png index c74cecbe78f4202449b567cb7185aaec72d38910..f2366a9af11f0109e2b5a7435ad56ba3e5ab30c4 100644 Binary files a/docs/res/usage/projects/projects-desc-and-instructions.png and b/docs/res/usage/projects/projects-desc-and-instructions.png differ diff --git a/docs/res/usage/projects/projects-first-ops.png b/docs/res/usage/projects/projects-first-ops.png index 228ec15dd83630bef5ed2a1931ca61e4746c11dd..f1bdac953b240d8c207a4e2fd8c1125281a1dee7 100644 Binary files a/docs/res/usage/projects/projects-first-ops.png and b/docs/res/usage/projects/projects-first-ops.png differ diff --git a/docs/res/usage/projects/projects-git-projects-tree.png b/docs/res/usage/projects/projects-git-projects-tree.png index 55fd6391bf744ec6608020014586a65d5ffb80ab..bcc97eaa3f6873dc018fb0f26206b10328313d39 100644 Binary files a/docs/res/usage/projects/projects-git-projects-tree.png and b/docs/res/usage/projects/projects-git-projects-tree.png differ diff --git a/docs/res/usage/projects/projects-gitprojects-clone.png b/docs/res/usage/projects/projects-gitprojects-clone.png index f0bad18faebcf9ed0769573d611a2c72aea19669..adbf668504889f233a316e695f2d4fde1917c3d5 100644 Binary files a/docs/res/usage/projects/projects-gitprojects-clone.png and b/docs/res/usage/projects/projects-gitprojects-clone.png differ diff --git a/docs/res/usage/restart.png b/docs/res/usage/restart.png index 383974d713292fcb119700eeaff5812e4a5241eb..b1cc0438be5325ebf3b0b9c57deb7a2c41e5ec97 100644 Binary files a/docs/res/usage/restart.png and b/docs/res/usage/restart.png differ diff --git a/docs/res/usage/tasks/edit-task.png b/docs/res/usage/tasks/edit-task.png index 30439354144102fef12b466dfbf99bb80ab1c0c3..f8177c5e9188e5a0d8163f4b096583456f802395 100644 Binary files a/docs/res/usage/tasks/edit-task.png and b/docs/res/usage/tasks/edit-task.png differ diff --git a/docs/res/usage/tasks/scheduler-1.png b/docs/res/usage/tasks/scheduler-1.png index 2ca582d5645647e06ab5676034cfa1d185f2d68e..9d81aff1fba1f5d108fc94c419da10d629c19c5d 100644 Binary files a/docs/res/usage/tasks/scheduler-1.png and b/docs/res/usage/tasks/scheduler-1.png differ diff --git a/docs/res/usage/ui-context1.png b/docs/res/usage/ui-context1.png index 3aa276f688f8776bce3fe88b481fecdfac8e3e0b..2a8ef92847bf1113f470f72c7230d1ade4ce88eb 100644 Binary files a/docs/res/usage/ui-context1.png and b/docs/res/usage/ui-context1.png differ diff --git a/docs/res/usage/ui-history1.png b/docs/res/usage/ui-history1.png index 62e42af620c8bbb1dfe12f213db8d4b57bc64728..3b820086b8eaa5398ea362d0670caae414256a0c 100644 Binary files a/docs/res/usage/ui-history1.png and b/docs/res/usage/ui-history1.png differ diff --git a/docs/res/usage/ui-katex-2.png b/docs/res/usage/ui-katex-2.png index 1adda894cb2156ea6bd67e57543e745a3addf9a1..52e44af788e1ca36c854035647aee2dd679cca60 100644 Binary files a/docs/res/usage/ui-katex-2.png and b/docs/res/usage/ui-katex-2.png differ diff --git a/docs/res/usage/ui-settings-5-speech-to-text.png b/docs/res/usage/ui-settings-5-speech-to-text.png index 91c5c6faf61471af9ce2a84965b1da00959cd031..1a65cc9d5e5aaf852f91091e032af27ca6e4f969 100644 Binary files a/docs/res/usage/ui-settings-5-speech-to-text.png and b/docs/res/usage/ui-settings-5-speech-to-text.png differ diff --git a/docs/res/usage/ui-tts-stop-speech1.png b/docs/res/usage/ui-tts-stop-speech1.png index 1a8e973276295e25da1f6f618187b02937dbc9f4..4374c6f47bf8eead027856a0aab2b49e4b6c0ff5 100644 Binary files a/docs/res/usage/ui-tts-stop-speech1.png and b/docs/res/usage/ui-tts-stop-speech1.png differ diff --git a/docs/res/usage/updating/self-update-v1-to-v2-warning.png b/docs/res/usage/updating/self-update-v1-to-v2-warning.png index 1454ea2f8445cbbf8f4c6d9ec01fc294ce9b5086..a6006de56160bdbc841a8845bf0701834396ecc1 100644 Binary files a/docs/res/usage/updating/self-update-v1-to-v2-warning.png and b/docs/res/usage/updating/self-update-v1-to-v2-warning.png differ diff --git a/docs/res/usage/updating/self-update-v2-current.png b/docs/res/usage/updating/self-update-v2-current.png index f593adf5d324cccb0c5e5436d536f2226550a918..f6e6e980aedccf81135e065d9e1b9973759e4060 100644 Binary files a/docs/res/usage/updating/self-update-v2-current.png and b/docs/res/usage/updating/self-update-v2-current.png differ diff --git a/docs/res/usage/webui/agent-editor-advanced-prompts.png b/docs/res/usage/webui/agent-editor-advanced-prompts.png index 313eaa7961229a7d73658a94daa86f3dc476a8f3..41fa774842c8e71731f7fccf98c49fb43d615855 100644 Binary files a/docs/res/usage/webui/agent-editor-advanced-prompts.png and b/docs/res/usage/webui/agent-editor-advanced-prompts.png differ diff --git a/docs/res/usage/webui/agent-editor-advanced-tools.png b/docs/res/usage/webui/agent-editor-advanced-tools.png index 0c642b41c999006d98dfba8ade8dea7bdaf52765..49a9cf7e0ddb27d5de75f1bfce4bcd8f7db47cb0 100644 Binary files a/docs/res/usage/webui/agent-editor-advanced-tools.png and b/docs/res/usage/webui/agent-editor-advanced-tools.png differ diff --git a/docs/res/usage/webui/agent-editor-easy-permissions.png b/docs/res/usage/webui/agent-editor-easy-permissions.png index 67a37428d695e034bc0a45e32948416bb48a133e..6814502e6ae2cf8f8c3fd8e232e0a3f3c13bc0ae 100644 Binary files a/docs/res/usage/webui/agent-editor-easy-permissions.png and b/docs/res/usage/webui/agent-editor-easy-permissions.png differ diff --git a/docs/res/usage/webui/agent-editor-easy.png b/docs/res/usage/webui/agent-editor-easy.png index 9fa919459018a001c3fdd4788285f32f7b4dc062..e3214f98231153343c4c63f9534b36d3ca06521e 100644 Binary files a/docs/res/usage/webui/agent-editor-easy.png and b/docs/res/usage/webui/agent-editor-easy.png differ diff --git a/docs/res/usage/webui/agent-editor-review.png b/docs/res/usage/webui/agent-editor-review.png index 86602b0bd80f69da8301a02384627f172666b547..672749f7b8abfa08196ff7e3a91ba39e5823277b 100644 Binary files a/docs/res/usage/webui/agent-editor-review.png and b/docs/res/usage/webui/agent-editor-review.png differ diff --git a/docs/res/usage/webui/agent-profile-manager.png b/docs/res/usage/webui/agent-profile-manager.png index d740acea39a9f6b1d4287a572a8c6612235df3b0..b8cc36227716eda646b33e3ccd740ca165ebb49a 100644 Binary files a/docs/res/usage/webui/agent-profile-manager.png and b/docs/res/usage/webui/agent-profile-manager.png differ diff --git a/docs/res/usage/webui/agent-profile-selector.png b/docs/res/usage/webui/agent-profile-selector.png index 4268c7095f34e298afab8115932c14d8c504e112..950381c50d9f8a950dc61226743446a16744baf2 100644 Binary files a/docs/res/usage/webui/agent-profile-selector.png and b/docs/res/usage/webui/agent-profile-selector.png differ diff --git a/docs/res/usage/webui/chat-more-actions-skills.png b/docs/res/usage/webui/chat-more-actions-skills.png index e4b22388c702b25b26ba0dc093068c9a6b489928..f93e71480a6da297572ec78a41a6d9f26004efff 100644 Binary files a/docs/res/usage/webui/chat-more-actions-skills.png and b/docs/res/usage/webui/chat-more-actions-skills.png differ diff --git a/docs/res/usage/webui/dashboard.png b/docs/res/usage/webui/dashboard.png index 56461cb9dc616673419c2b063e3fb54c19623880..5a43c4fcdc73ccd5c4fa5fa1399d66a42648a15e 100644 Binary files a/docs/res/usage/webui/dashboard.png and b/docs/res/usage/webui/dashboard.png differ diff --git a/docs/res/usage/webui/desktop-canvas.png b/docs/res/usage/webui/desktop-canvas.png index 28a5bdfc0d9b54c769071bf22c420f8c96cf31e9..e5cdc6a3dba9a9df7d1de8b3dd06faaeca9593cd 100644 Binary files a/docs/res/usage/webui/desktop-canvas.png and b/docs/res/usage/webui/desktop-canvas.png differ diff --git a/docs/res/usage/webui/desktop-new-menu.png b/docs/res/usage/webui/desktop-new-menu.png index 94311b1fadca87589830a47b84b4ab4078931dd7..326d0153f68c0c491f740dfcc9d1d34febab62e3 100644 Binary files a/docs/res/usage/webui/desktop-new-menu.png and b/docs/res/usage/webui/desktop-new-menu.png differ diff --git a/docs/res/usage/webui/desktop-writer.png b/docs/res/usage/webui/desktop-writer.png index 41ea4a71e5692a5f4ac7560fa33270f92856c078..acea0228b43d7379f9dc5b788dd271119049735b 100644 Binary files a/docs/res/usage/webui/desktop-writer.png and b/docs/res/usage/webui/desktop-writer.png differ diff --git a/docs/res/usage/webui/memory-dashboard-controls.png b/docs/res/usage/webui/memory-dashboard-controls.png index f82e3cb636e6754fc7300c2bbcf64af4945dd450..e349ad347a444ebf7e6fb1669e41b73b5cead3ef 100644 Binary files a/docs/res/usage/webui/memory-dashboard-controls.png and b/docs/res/usage/webui/memory-dashboard-controls.png differ diff --git a/docs/res/usage/webui/model-preset-selector.png b/docs/res/usage/webui/model-preset-selector.png index 7dcdda5bbd6ac5e4d20276be826155f2f9d58096..ffb48737ed4e3c889d79549147efec6a9c2c8bee 100644 Binary files a/docs/res/usage/webui/model-preset-selector.png and b/docs/res/usage/webui/model-preset-selector.png differ diff --git a/docs/res/usage/webui/model-presets-add.png b/docs/res/usage/webui/model-presets-add.png index ed01e9b91d0bd045e3f0be761a0ffe4d338cade0..9ceb51b0796d8a6664b42ca4404c16534a765c63 100644 Binary files a/docs/res/usage/webui/model-presets-add.png and b/docs/res/usage/webui/model-presets-add.png differ diff --git a/docs/res/usage/webui/model-presets-editor.png b/docs/res/usage/webui/model-presets-editor.png index 9c4d6aef417a315ca68769403c86fa0af4cd431f..f38983db47b5ca9a8080b2197c179ae1dbc65b97 100644 Binary files a/docs/res/usage/webui/model-presets-editor.png and b/docs/res/usage/webui/model-presets-editor.png differ diff --git a/docs/res/usage/webui/project-active-chat.png b/docs/res/usage/webui/project-active-chat.png index e6bba3e839f4a6edcb3add21f049c0a00140bbdd..91b3f27ffe80c8cce0f052cdcfe797bbaee603bc 100644 Binary files a/docs/res/usage/webui/project-active-chat.png and b/docs/res/usage/webui/project-active-chat.png differ diff --git a/docs/res/usage/webui/project-create-filled.png b/docs/res/usage/webui/project-create-filled.png index a6848bea9c0089bb4cdd1681a39457cedea13fee..4e927401205235983bcaa3cbef82ba615689a390 100644 Binary files a/docs/res/usage/webui/project-create-filled.png and b/docs/res/usage/webui/project-create-filled.png differ