{"id":51877796,"url":"https://github.com/bang404/openagent","last_synced_at":"2026-07-25T08:00:24.455Z","repository":{"id":358500345,"uuid":"1241630160","full_name":"BANG404/openagent","owner":"BANG404","description":"Desktop AI agent client — multi-agent delegation, long-term memory, MCP, and Skills. Built with Tauri + SvelteKit + Rust.","archived":false,"fork":false,"pushed_at":"2026-07-23T15:13:15.000Z","size":92889,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-07-23T17:07:31.442Z","etag":null,"topics":["ai-agent","anthropic","claude","desktop-app","langfuse","llm","mcp","openai-compatible","rust","sqlite","svelte","sveltekit","tauri","typescript"],"latest_commit_sha":null,"homepage":"https://bang404.github.io/openagent/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/BANG404.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-17T16:17:03.000Z","updated_at":"2026-07-23T15:15:40.000Z","dependencies_parsed_at":null,"dependency_job_id":"b320191f-06fa-41f8-8e1a-d55f188807ab","html_url":"https://github.com/BANG404/openagent","commit_stats":null,"previous_names":["bang404/openagent"],"tags_count":54,"template":false,"template_full_name":null,"purl":"pkg:github/BANG404/openagent","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BANG404%2Fopenagent","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BANG404%2Fopenagent/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BANG404%2Fopenagent/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BANG404%2Fopenagent/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/BANG404","download_url":"https://codeload.github.com/BANG404/openagent/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BANG404%2Fopenagent/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35871569,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-07-25T02:00:06.922Z","response_time":64,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-agent","anthropic","claude","desktop-app","langfuse","llm","mcp","openai-compatible","rust","sqlite","svelte","sveltekit","tauri","typescript"],"created_at":"2026-07-25T08:00:20.372Z","updated_at":"2026-07-25T08:00:24.448Z","avatar_url":"https://github.com/BANG404.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/openagent_banner.png\" alt=\"OpenAgent banner\" width=\"100%\" /\u003e\n\u003c/p\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \n\n  **A modern desktop AI agent client — built with Tauri, SvelteKit, and Rust.**\n\n  \u003cp\u003e\n    \u003cimg alt=\"Tauri\" src=\"https://img.shields.io/badge/Tauri-2.0-FFC131?style=flat-square\u0026logo=tauri\u0026logoColor=white\"\u003e\n    \u003cimg alt=\"SvelteKit\" src=\"https://img.shields.io/badge/SvelteKit-5-FF3E00?style=flat-square\u0026logo=svelte\u0026logoColor=white\"\u003e\n    \u003cimg alt=\"Rust\" src=\"https://img.shields.io/badge/Rust-2021-000000?style=flat-square\u0026logo=rust\u0026logoColor=white\"\u003e\n    \u003cimg alt=\"TypeScript\" src=\"https://img.shields.io/badge/TypeScript-5.6-3178C6?style=flat-square\u0026logo=typescript\u0026logoColor=white\"\u003e\n    \u003cimg alt=\"Tailwind CSS\" src=\"https://img.shields.io/badge/Tailwind-4-06B6D4?style=flat-square\u0026logo=tailwindcss\u0026logoColor=white\"\u003e\n    \u003cimg alt=\"Bun\" src=\"https://img.shields.io/badge/Bun-1.x-000000?style=flat-square\u0026logo=bun\u0026logoColor=white\"\u003e\n    \u003cimg alt=\"Platforms\" src=\"https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-lightgrey?style=flat-square\"\u003e\n  \u003c/p\u003e\n\n  \u003cp\u003e\n    English · \u003ca href=\"README.zh-CN.md\"\u003e简体中文\u003c/a\u003e\n  \u003c/p\u003e\n\u003c/div\u003e\n\n---\n\n## Table of contents\n\n- [Table of contents](#table-of-contents)\n- [What's new in 0.24](#whats-new-in-024)\n- [Highlights](#highlights)\n  - [Agent runtime](#agent-runtime)\n  - [Interactive output](#interactive-output)\n  - [Tools and integrations](#tools-and-integrations)\n  - [Desktop experience](#desktop-experience)\n- [Quick Start](#quick-start)\n  - [Install a release build](#install-a-release-build)\n  - [Prerequisites](#prerequisites)\n  - [Clone \\\u0026 install](#clone--install)\n  - [Run in dev mode](#run-in-dev-mode)\n  - [Build a distributable](#build-a-distributable)\n- [Configure your first provider](#configure-your-first-provider)\n  - [Enable web search (optional)](#enable-web-search-optional)\n  - [Choose a tool approval mode](#choose-a-tool-approval-mode)\n- [Example: write a Skill](#example-write-a-skill)\n- [Reusable roles and progressive Skill discovery](#reusable-roles-and-progressive-skill-discovery)\n  - [Reusable delegated roles](#reusable-delegated-roles)\n  - [Progressive Skill discovery](#progressive-skill-discovery)\n- [Interactive prompts with `ask_user`](#interactive-prompts-with-ask_user)\n- [AGUI — Inline Interactive Components](#agui--inline-interactive-components)\n- [HTML Preview via Tool Call (`render_html`)](#html-preview-via-tool-call-render_html)\n- [Memory file format](#memory-file-format)\n- [Agent memory controls](#agent-memory-controls)\n- [Architecture at a glance](#architecture-at-a-glance)\n- [Project structure](#project-structure)\n- [Repository activity](#repository-activity)\n  - [Star history](#star-history)\n- [Contributors](#contributors)\n- [Roadmap](#roadmap)\n- [Contributing](#contributing)\n- [Observability (optional)](#observability-optional)\n  - [Tool-call structured output integration test](#tool-call-structured-output-integration-test)\n- [Further reading](#further-reading)\n- [License](#license)\n\n---\n\n## What's new in 0.24\n\n- **One window per workspace** — Open multiple projects at once while each window keeps its own active workspace; selecting an already-open workspace focuses its existing window.\n- **Reusable delegated roles** — Save specialized agent workflows globally or per project, search them by responsibility, and dispatch them into live child conversations.\n- **Smarter Skill discovery** — Group Skills with `metadata.category`; uncategorized Skills can be classified by a Flash task so large catalogs use progressive disclosure instead of filling every prompt.\n- **Durable multimodal branches** — Image, PDF, and text attachments have rich previews, survive reloads and checkpoints, and remain available when editing a message to create a new branch.\n- **Faster long conversations** — Conversation search and pagination, virtualized completed history, stable streaming rows, queued follow-up messages, and cancellable compaction keep large histories responsive.\n- **Richer tool output** — Validated Mermaid rendering, image/video AGUI media, source-line previews, and managed background terminal sessions make long-running and visual work easier to follow.\n\nFor the complete release history and fixes, see [`CHANGELOG.md`](CHANGELOG.md).\n\n---\n\n## Highlights\n\n### Agent runtime\n\n- **Multi-Agent \u0026 Flash Agents Architecture** — A primary streaming **Chat Agent** for main conversations, and a suite of dedicated async **Flash Agents** (including **Memory Agent** for long-term memory synthesis, **Title Agent** for dynamic conversation renaming, and **Hook Agent** for background scheduled tasks).\n- **Sub-Agent Delegation** — The Chat Agent can call `spawn_agent` to delegate tasks to nested sub-agents; progress streams in real-time into a sub-conversation shown nested under the parent in the sidebar.\n- **Reusable Agent Roles** — Create global or project-scoped role workflows, discover them with hybrid search, and dispatch them as specialized child agents. Roles can be created automatically on first use or managed from the **Roles** panel.\n- **Goal \u0026 Graph Loops (Autonomous Execution)** — Type `/goal` in the chat to run a self-correcting loop directly aiming at the objective. Type `/graph` to first plan a structured DAG task graph (`create_goal_graph_config`) and execute nodes asynchronously with parallel processing, feeding live graph status updates to the frontend.\n- **Hybrid Long-Term Memory** — SQLite + FTS5 + 384-dim embeddings (fastembed `AllMiniLML6V2`) blended with time decay for cross-session recall. Before retrieval, an optional Flash task rewrites the latest message into a focused semantic query, so stored memories are matched to intent rather than just wording.\n- **Interactive User Prompts (`ask_user`)** — The agent can pause mid-task and surface a structured form to the user — `text`, `select`, `checkbox_group`, `confirm`, `date`, and more. The agent blocks until the user responds, then continues with the collected values. No more one-shot guessing on ambiguous instructions.\n\n### Interactive output\n\n- **AGUI — Inline Interactive Components** — The agent can embed file and URL capsules, ECharts visualisations, source-line previews, and image/video media directly in its prose — all rendered live by the streamdown engine.\n- **HTML Preview via Tool Call (`render_html`)** — The agent executes a dedicated `render_html` tool to display sandboxed native HTML previews (mockup pages, layouts, visual components) directly in the conversation stream, with fixed-height or expanded display modes and PNG export.\n- **Validated Mermaid Rendering** — A dedicated render tool validates Mermaid source before presenting the diagram, while keeping the source available and supporting fullscreen inspection.\n\n### Tools and integrations\n\n- **MCP-Native** — Connect external MCP servers over HTTP or stdio; tools are injected into the agent at call time.\n- **First-class Dev Tools** — Built-in file, search, fetch, and terminal tools. Managed terminal sessions support interactive or long-running background processes; `fetch` retrieves pages locally with Spider, extracts readable text, and supports pagination.\n- **Tool Approval \u0026 Workspace Sandbox** — Choose per-call review, model-assisted approval, no approval, or a workspace-oriented sandbox for file and terminal tools.\n- **Skills System** — Drop a `SKILL.md` into `~/.agents/skills/` or `\u003cworkspace\u003e/.agents/skills/`. Category-based progressive discovery keeps large global and project catalogs compact, with optional Flash classification for uncategorized Skills.\n- **Checkpoints \u0026 File-Change Rollback** — Every turn is a checkpoint with reverse diffs; undo a single file or rewind the whole agent.\n- **Pluggable LLMs \u0026 Multimodal** — Support multi-model selection and durable image, PDF, and text attachments with drag/paste, rich previews, checkpoint restoration, and branch editing across Anthropic, OpenAI, and compatible providers.\n\n### Desktop experience\n\n- **Context Compaction \u0026 Tree Conversations** — Automatically or manually compact long conversations into tree structures to save tokens, preserving history lineage via search-based message recall.\n- **Responsive Conversation History** — Search and paginate the sidebar, queue follow-up messages during a run, and navigate virtualized transcripts without loading the entire history into the DOM.\n- **Scheduled Chat Hooks** — Define recurring or one-off tasks triggered in the background. Hooks are fully persistent, auto-restored on startup, and supported by system tray notifications.\n- **Project Drafts \u0026 Global/Local Scopes** — Keep drafts, memory, and skills scoped globally (in `~/.config/openagent`) or locally to your active workspace (in `.agents/`).\n- **DESIGN.md \u0026 MDX Editor** — Dedicated edit panel for `DESIGN.md` in your workspace, plus a rich markdown editor (MdxMarkdownEditor) integrated into memory and skill management.\n- **Multi-Workspace Desktop Integration** — Open each workspace in a dedicated window, focus existing workspace windows instead of duplicating them, launch on startup, minimize to the system tray, and reveal workspace locations in the native file manager.\n- **Observability** — Optional Langfuse tracing via OpenTelemetry (`gen_ai.*` attributes).\n- **Polished UI** — Apple-style design language, streaming markdown, Mermaid \u0026 ECharts rendering, light/dark themes, i18n (zh / en).\n\n---\n\n## Quick Start\n\n### Install a release build\n\nDownload the latest installer or app bundle from [GitHub Releases](https://github.com/BANG404/openagent/releases). OpenAgent publishes separate **beta** and **stable** update channels; you can also check for updates manually from Settings.\n\nTo build from source instead, continue below.\n\n### Prerequisites\n\n| Tool   | Version | Notes                                          |\n| ------ | ------- | ---------------------------------------------- |\n| Bun    | latest  | Package manager — used instead of npm / yarn   |\n| Rust   | 1.70+   | Required for the Tauri backend                 |\n| Node   | 18+     | Used by the SvelteKit toolchain                |\n\n\u003e On Windows the Tauri prerequisites also include WebView2 and the MSVC build tools. See the [official Tauri prerequisites](https://tauri.app/start/prerequisites/) for platform-specific setup.\n\n### Clone \u0026 install\n\n```bash\ngit clone https://github.com/BANG404/openagent.git\ncd openagent\nbun install\n```\n\n### Run in dev mode\n\n```bash\n# Full Tauri desktop app (frontend + Rust backend)\nbun tauri dev\n\n# OR — frontend only (port 14221, no Rust)\nbun run dev\n```\n\n### Build a distributable\n\n```bash\nbun tauri build\n```\n\nThe built installers / app bundle land in `src-tauri/target/release/bundle/`.\n\n---\n\n## Configure your first provider\n\nOn first launch OpenAgent creates `~/.config/openagent/config.toml`. Open **Settings → Providers** and add a provider, or edit the file directly. Until an available model is configured, the composer keeps sending disabled and provides a **Configure models** shortcut to Settings.\n\n```toml\n[[providers]]\nid = \"anthropic-main\"\nname = \"Anthropic\"\nprovider = \"anthropic\"\napi_key = \"sk-ant-...\"\nbase_url = \"https://api.anthropic.com\"\nenabled = true\n\n[defaults]\nchat_model   = { provider_id = \"anthropic-main\", model = \"claude-sonnet-4-6\" }\nflash_model  = { provider_id = \"anthropic-main\", model = \"claude-haiku-4-5\" }\n```\n\nOpenAI-compatible endpoints (DeepSeek, OpenRouter, local Ollama, etc.) work the same — just point `base_url` at the right host and set `provider = \"openai\"`. You may enter a host, a `/v1` API root, or a full `/chat/completions` URL; OpenAgent normalizes it to the API root.\n\n### Enable web search (optional)\n\nOpen **Settings → Web Search** and configure the provider you want to use. The `web_search` tool is available only after the selected provider has the required value: a Brave or Tavily API key, or a SearXNG base URL. The independent `fetch` tool always retrieves a page directly with Spider, returns readable text, and paginates long results according to the configured fetch page size. Omit `page` for the first page and use subsequent 1-based page numbers for the rest. Saving Settings refreshes the tool list immediately.\n\n### Choose a tool approval mode\n\nOpen **Settings → General → Approval Mode** to control how agent tool calls run. When a call needs your approval, OpenAgent pauses the conversation, shows the exact tool name and arguments, and resumes after you approve or deny it.\n\n| Mode | Behavior |\n| --- | --- |\n| **Manual** | Ask you to approve every tool call. |\n| **Automatic** | A Flash task assesses the impact; important or uncertain calls still come to you for review. |\n| **Off** | Run all tool calls without the approval flow. |\n| **Sandbox** (default) | Apply the workspace policy only to file-management and terminal tools: workspace-local work proceeds, while attempts to escape the workspace are denied. Other built-in and MCP tools keep their normal behavior. |\n\n---\n\n## Example: write a Skill\n\nCreate `~/.agents/skills/python-review/SKILL.md`:\n\n```markdown\n---\nname: python-review\ndescription: Review Python diffs for type-hint coverage, error handling, and PEP 8 compliance.\n---\n\nWhen asked to review Python code:\n1. Check that public functions have type hints.\n2. Flag bare `except:` clauses and silent failures.\n3. Suggest more idiomatic stdlib alternatives where appropriate.\n```\n\nThat's it — OpenAgent picks it up on the next message and lists it in the agent's system prompt. The agent reads the full body on demand via `read_file`.\nOpenAgent also installs the bundled `find-skills` Skill into this global directory when it is missing.\n\n---\n\n## Reusable roles and progressive Skill discovery\n\n### Reusable delegated roles\n\nOpen **Roles** in the sidebar to create and manage specialized workflows such as a code reviewer, release manager, or research assistant. A role contains a stable name plus the responsibilities, boundaries, workflow, and delivery standards appended to the delegated agent's system prompt.\n\n- **Global roles** are reusable in every workspace.\n- **Project roles** are visible only in the current workspace.\n- The main agent can create a role on first dispatch, find saved roles by name or responsibility, and reuse them in child conversations. The Roles panel shows usage count and last-used time.\n\n### Progressive Skill discovery\n\nFor a large Skill catalog, add a category under the frontmatter `metadata` map:\n\n```yaml\n---\nname: python-review\ndescription: Review Python diffs for correctness and maintainability.\nmetadata:\n  category: code-quality\n---\n```\n\nOpenAgent initially exposes compact category summaries and loads the matching Skill descriptions on demand. Skills without a category can be grouped by the optional **Settings → Flash Tasks → Skill Category Task**; when it is disabled, uncategorized Skills continue to be listed with their full name, description, and path.\n\n---\n\n\u003ca id=\"interactive-prompts-with-ask_user\"\u003e\u003c/a\u003e\n\n## Interactive prompts with `ask_user`\n\nWhen the agent needs a decision before continuing — ambiguous instruction, technology choice, destructive operation, missing parameter — it calls `ask_user` to surface a structured form in the chat panel. The agent blocks until you respond; everything in the form is typed, so you can select from dropdowns, tick checkboxes, confirm a boolean, or pick a date without typing a sentence.\n\nSupported field types:\n\n| Type | Use case |\n| --- | --- |\n| `text` | Short free-form input |\n| `textarea` | Multi-line text |\n| `select` | Single choice from a list |\n| `checkbox` | Single on/off toggle |\n| `checkbox_group` | Multiple choices from a list |\n| `date` | Date picker |\n| `confirm` | Yes / No decision |\n\nThe agent is guided to ask once, ask clearly, and prefer structured fields over open text boxes.\n\n---\n\n\u003ca id=\"agui--inline-interactive-components\"\u003e\u003c/a\u003e\n\n## AGUI — Inline Interactive Components\n\nBeyond markdown, the agent can embed interactive components directly in its responses. The frontend's streamdown renderer picks them up and renders them as rich, clickable elements — no copy-pasting paths or URLs needed.\n\nSyntax: `ComponentName(prop: value, prop2: \"string\")`\n\n| Component | Example | Renders as |\n| --- | --- | --- |\n| `File` | `File(path: \"src/tools.rs\", lines: \"120-140\")` | Clickable chip that opens the file at the given lines |\n| `Url` | `Url(href: \"https://docs.rs/rig\", title: \"rig docs\")` | Capsule that opens the link in the browser |\n| `Chart` | `Chart(type: \"bar\", labels: [\"A\",\"B\"], data: [10,20])` | ECharts bar / line / pie chart |\n| `Image` | `Image(src: \"assets/result.png\", caption: \"Result\")` | Workspace-local or HTTP(S) image with an optional caption |\n| `Video` | `Video(src: \"assets/demo.mp4\", controls: true)` | Workspace-local or HTTP(S) video with playback controls |\n\nMulti-series charts use `series: [{name, data}, ...]`.\n\n---\n\n\u003ca id=\"html-preview-via-tool-call-render_html\"\u003e\u003c/a\u003e\n\n## HTML Preview via Tool Call (`render_html`)\n\nInstead of writing inline component tags, the agent can execute a dedicated `render_html` tool to display sandboxed HTML previews (such as mockup pages, layouts, or visual components) directly in the conversation stream. The rendered frame uses the HTML as provided without injecting app theme styles, supports a fixed-height window or expanded content height, and includes best-effort PNG download.\n\n---\n\n## Memory file format\n\nMemory files have **two zones**. The Memory Agent only writes below the marker comment:\n\n```markdown\n## [User] Personal habits\n\u003c!-- You edit freely here; the agent never touches this section --\u003e\n\n## [Agent] Recent context summary\n\u003c!-- Memory Agent only operates below this comment --\u003e\n```\n\n- Global memory → `~/.config/openagent/memory.md` (every conversation)\n- Local memory  → `\u003cworkspace\u003e/.agents/memory.md` (workspace-scoped)\n\n## Agent memory controls\n\nOpen **Settings → Flash Tasks → Memory Task** to configure the long-term-memory workflow. Both options are enabled by default:\n\n- **Agent memory retrieval** uses the Flash model to turn the current message into a focused query, retrieves relevant structured memory, and adds the results to the chat agent's system prompt. Turn it off when you want retrieval to use the message directly.\n- **Personalized new-conversation greeting** runs only when the Memory Agent adds or removes memory. It generates and persists one short, natural greeting; memory may shape its tone or lightly suggest one relevant topic, but is never displayed as a user profile.\n\nDisabling the Memory Agent stops its post-conversation extraction task; the two switches above control their respective follow-up behaviors independently.\n\n---\n\n## Architecture at a glance\n\n```\n┌──────────────────────────────┐        Tauri IPC         ┌──────────────────────────────┐\n│   SvelteKit Webview (src/)   │  ◄──────────────────►   │  Rust Core (src-tauri/)       │\n│ ── routes/+page.svelte       │  invoke / event          │ ── commands/                  │\n│ ── lib/components/...        │  chat-chunk              │ ── tools.rs · terminal.rs     │\n│ ── lib/chatStream.ts         │  chat-tool-call          │ ── conversation_memory.rs     │\n│ ── lib/streamdown/...        │  chat-done               │ ── skills.rs · mcp.rs         │\n└──────────────────────────────┘                          │ ── checkpoint.rs · state.rs   │\n                                                          │ ── openagent-runtime crate    │\n                                                          └──────────────────────────────┘\n                                                                       │\n                                          ┌────────────────────────────┼────────────────────────────┐\n                                          ▼                            ▼                            ▼\n                                ┌──────────────────┐         ┌──────────────────┐         ┌──────────────────┐\n                                │  SQLite + FTS5   │         │   LLM Providers   │         │   MCP Servers     │\n                                │  + fastembed     │         │  Claude · OpenAI  │         │  HTTP · stdio     │\n                                └──────────────────┘         └──────────────────┘         └──────────────────┘\n```\n\nSee [`AGENTS.md`](AGENTS.md) for the current contributor and architecture guide.\n\n---\n\n## Project structure\n\n```\n.\n├── src/                      # SvelteKit frontend (Svelte 5 · TypeScript)\n│   ├── routes/               # Page components\n│   └── lib/                  # Components, stores, streamdown, types\n├── src-tauri/                # Tauri / Rust backend\n│   ├── crates/\n│   │   └── openagent-runtime/ # Tauri-independent input routing contract\n│   ├── src/\n│   │   ├── lib.rs            # App setup, plugin registration\n│   │   ├── commands/         # Typed IPC commands grouped by domain\n│   │   ├── config.rs         # Config schema parsing and management\n│   │   ├── state.rs          # Global application state definition\n│   │   ├── context.rs        # System prompt assembly\n│   │   ├── context_compaction.rs # Context compaction logic for tree-based history\n│   │   ├── conversation_memory.rs # SQLite + fastembed hybrid retrieval\n│   │   ├── checkpoint.rs     # Per-turn checkpoints + reverse diffs\n│   │   ├── skills.rs         # SKILL.md discovery\n│   │   ├── mcp.rs            # MCP transports + tool injection\n│   │   ├── tools.rs          # Built-in dev tools (read/write file, web search, fetch, etc.)\n│   │   ├── terminal.rs       # Shell command execution and session management\n│   │   ├── sub_agent.rs      # Reusable role and child-agent execution\n│   │   └── tracing_setup.rs  # OpenTelemetry and Langfuse observability initialization\n│   └── icons/                # App icons (all platforms)\n└── docs/                     # Design specs and architecture notes\n```\n\n---\n\n## Repository activity\n\n![Alt](https://repobeats.axiom.co/api/embed/6192dc6d5dec9295a44312fb2bba5b0d362280e2.svg \"Repobeats analytics image\")\n\n### Star history\n\n\u003ca href=\"https://star-history.com/#BANG404/openagent\u0026Date\"\u003e\n  \u003cimg alt=\"Star History\" src=\"https://api.star-history.com/svg?repos=BANG404/openagent\u0026type=Date\" width=\"600\" /\u003e\n\u003c/a\u003e\n\n---\n\n## Contributors\n\nThanks goes to these wonderful people:\n\n\u003ca href=\"https://github.com/BANG404/openagent/graphs/contributors\"\u003e\n  \u003cimg src=\"https://contrib.rocks/image?repo=BANG404/openagent\" alt=\"Contributors\" /\u003e\n\u003c/a\u003e\n\n---\n\n## Roadmap\n\n- [ ] First-class screenshots \u0026 demo GIFs in this README\n- [x] Pre-built installers via GitHub Releases (beta / stable channels)\n- [ ] In-app skill marketplace\n- [x] Dedicated windows for multiple workspaces\n\nSee [open issues](https://github.com/BANG404/openagent/issues) for the full backlog and feel free to file new ones.\n\n---\n\n## Contributing\n\nContributions are very welcome — feature ideas, bug fixes, and docs improvements alike.\n\n1. Fork the repo and create a branch from `master`.\n2. Follow the [Conventional Commits](https://www.conventionalcommits.org/) style — see existing log for the scopes we use (`feat(toast):`, `fix(mermaid):`, `refactor(ui):`, etc.).\n3. Run `bun run check`, `bun run lint:actions`, and `cargo check --manifest-path src-tauri/Cargo.toml` before opening a PR.\n4. Open a PR — describe **why**, not just **what**.\n\nProject conventions live in [`AGENTS.md`](AGENTS.md); the UI/UX spec lives in [`docs/design.md`](docs/design.md).\n\n---\n\n## Observability (optional)\n\nDrop a `.env` in the project root to enable Langfuse tracing:\n\n```env\nLANGFUSE_PUBLIC_KEY=pk-...\nLANGFUSE_SECRET_KEY=sk-...\nLANGFUSE_HOST=https://cloud.langfuse.com\n```\n\nWhen keys are present, Chat \u0026 Memory agent calls are instrumented with `gen_ai.*` OpenTelemetry attributes and exported via batch processor.\n\n### Tool-call structured output integration test\n\nThe Rust test suite includes an opt-in integration test that verifies the configured model can produce structured results for title, memory, hook, and context-compaction tasks by calling the task-specific capture tool. Put the test provider settings in the repository root `.env`:\n\n```env\nOPENAGENT_STRUCTURED_OUTPUT_TESTS=1\nOPENAGENT_STRUCTURED_OUTPUT_MODEL=your-model\nOPENAGENT_STRUCTURED_OUTPUT_API_KEY=your-api-key\nOPENAGENT_STRUCTURED_OUTPUT_BASE_URL=https://your-provider.example/v1\n\n# Optional Langfuse tracing\nLANGFUSE_PUBLIC_KEY=pk-...\nLANGFUSE_SECRET_KEY=sk-...\nLANGFUSE_HOST=https://cloud.langfuse.com\n```\n\nThen run:\n\n```bash\ncd src-tauri\ncargo test env_configured_provider_supports_all_structured_output_tasks -- --nocapture\n```\n\nSee [`.env.example`](.env.example) for a copyable template. The test defaults to the OpenAI-compatible provider, so `OPENAGENT_STRUCTURED_OUTPUT_MODEL`, `OPENAGENT_STRUCTURED_OUTPUT_API_KEY`, and `OPENAGENT_STRUCTURED_OUTPUT_BASE_URL` are enough for third-party OpenAI-compatible chat endpoints.\n\nFor Anthropic, set `OPENAGENT_STRUCTURED_OUTPUT_PROVIDER=anthropic` and provide `ANTHROPIC_API_KEY`.\n\n---\n\n## Further reading\n\n- [`AGENTS.md`](AGENTS.md) — Contributor and architecture reference\n- [`CHANGELOG.md`](CHANGELOG.md) — Full release history\n- [`docs/release.md`](docs/release.md) — Versioning, beta/stable channels, and publishing workflow\n- [`docs/design.md`](docs/design.md) — Apple-style design spec\n- [Tauri docs](https://tauri.app/) · [SvelteKit docs](https://kit.svelte.dev/) · [rig (Rust LLM)](https://github.com/0xPlaygrounds/rig)\n\n---\n\n## License\n\nOpenAgent is dual-licensed:\n\n- **Open-source option:** [GNU GPL v3.0 or later](LICENSE) (`GPL-3.0-or-later`).\n  If you distribute OpenAgent or a derivative work under this option, the GPL\n  requires the corresponding source and GPL freedoms to be provided under its\n  terms; it does not allow a derivative work to be distributed as proprietary.\n- **Commercial option:** a separate [commercial license](COMMERCIAL_LICENSE.md)\n  is available for organizations that need to distribute a proprietary\n  derivative work or otherwise need rights outside the GPL.\n\nCommercial licensing is provided only through a separate written agreement.\nThe OpenAgent name and branding remain subject to\n[TRADEMARKS.md](TRADEMARKS.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbang404%2Fopenagent","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbang404%2Fopenagent","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbang404%2Fopenagent/lists"}