agentscope-ai/QwenPaw
58.5
Adequate · 3 October 2026
683.1k
lines of production code
Python
with TypeScript
1
measurement over time
What this system is
This system is a cross-platform AI agent console and backend, featuring a desktop interface for managing sessions and files, alongside a core agent engine (qwenpaw) that handles chat, tool execution, and external integrations like Telegram. Recent activity focuses on stabilizing the user experience through improved session state management, audio input handling, and file workspace reliability, while simultaneously expanding test coverage and refining the underlying agent logic. The platform also supports rich content rendering, such as LaTeX math, and includes administrative features for model cataloging and policy compliance.
Narrated so far: 2026-09-20 – 2026-09-23; 4 days pending; history before 2026-09-20 not narrated yet; history after 2026-09-23 not narrated yet.
How it got here
Week 38 of 2026 (14 Sep – 20 Sep) — not summarised yet
- Improved session project directory picker usability and layout — The session project directory picker now allows users to apply a browsed directory or workspace project directly without needing to explicitly click 'Add' first, and the first applied directory becomes the primary selection. The UI layout has been adjusted so the desktop panel uses available viewport height up to a comfortable maximum (580px), ensuring room for five rows even with a full list, and inline editors no longer have a fixed height limit. Additionally, the 'Recent Projects' section has been relabeled to 'Workspace Projects' and includes a help tooltip for clarification. (console/src/features/project-directory)
- Tool cards now correctly handle interrupted or ended turns — Tool cards in the chat interface now distinguish between a tool that failed and one that was interrupted by the user or the system. When a response turn ends while a tool call is still pending (for example, if the user stops the generation), the card now immediately closes the call and displays an "interrupted" status with the partial output, rather than spinning indefinitely in a "calling" state. This change also updates the error display logic to show a specific interrupted message when applicable, improving clarity for users managing long-running or cancelled tool executions. (console)
- Added tests for audio fallback error classification — Added unit tests to verify that the agent correctly identifies and handles specific audio-related error messages, including unknown input\_audio variants and modal errors, ensuring proper fallback behavior. (tests)
- Improved handling of unknown audio input rejections — The agent now correctly identifies and handles audio payload rejections caused by unknown or unexpected audio variants/fields (e.g., 'unknown variant', 'unexpected field') in addition to existing bad request errors. This prevents unhandled exceptions when providers reject audio inputs with these specific error messages, ensuring smoother fallback behavior. The version has been bumped to 2.2.2b4. (src/qwenpaw)
Week 39 of 2026 (21 Sep – 27 Sep) — not summarised yet
- Fixes stale file content in tabs after reactivation or reopening — The FilesWorkspace component now revalidates file content when a tab is activated or reopened, ensuring that the editor displays the latest version from the server rather than a potentially stale cached copy. This change introduces a revalidation mechanism that checks for updates on text and CSV files, handles race conditions where older responses might arrive later, and correctly manages pending diffs so that local edits are preserved while still syncing with the current server state. (console/src/features/files-workspace)
- Unified session model and thinking controls with pending-state handling — The console now manages model selection and thinking depth (effort or budget) as unified session settings. Users can choose a model and adjust thinking levels for a new session before it is allocated; these choices are stored in pending state and automatically applied to the first request once the chat is created. The interface displays the model's catalog name rather than its internal routing ID, and provides a reset button to revert to agent defaults. Thinking controls support both effort-based levels (low, medium, high, etc.) and budget-based token limits, with visual indicators reflecting the current depth. The system ensures that pending selections persist through the allocation phase and are cleared once the server acknowledges the chosen model. ((repo-wide))
- Add LaTeX math rendering and update agentscope dependency — The console application now supports rendering LaTeX math expressions in content by adding the \rehype-katex\ and \remark-math\ dependencies, along with their required underlying libraries. Additionally, the \@number-flow/react\ library has been added to the console frontend, and the Python backend's \agentscope\ dependency has been updated from version 2.0.7.post1 to 2.0.8. ((dependencies))
- Enhanced session list details and KaTeX math rendering — The session list now displays richer details in an info card, including the conversation's relative update time, its group (e.g., Scheduled task conversations, Conversations with subagents, or Uncategorized), and the channel. Users can also copy the conversation ID directly from the session's actions menu. Additionally, Markdown content in the console (such as in the update modal and file previews) now renders LaTeX math formulas using KaTeX. (console)
- Added unit tests for agent subsystems — Added comprehensive unit tests covering the ACP client session update handling, the visual compression recall tool, the skill registry's builtin sync and runtime resolution layers, ACP permission payload parsing, model factory media helpers, model provider isolation, session stream header management, and the local/cloud chat-model router. (tests)
- Chat names are no longer truncated and the doom-loop gate now requires tool-call evidence — Chat names are now stored and displayed in full (up to 500 characters) instead of being truncated to 50 characters, ensuring that the complete first message or user-provided title is preserved in the chat list. Additionally, the doom-loop escalation logic has been tightened to require evidence of new tool calls before escalating, preventing false positives from repeated non-tool interactions. (src/qwenpaw)
- Added unit tests for response compression middleware — Added a new test suite for the ResponseCompressionMiddleware to verify that large JSON and text responses are compressed with gzip, while specific response types (such as SSE, streaming, video, and attachments) are excluded. The tests also validate that the middleware correctly respects client Accept-Encoding headers, handles cases where clients decline compression, avoids double-compressing already encoded responses, and properly forwards streaming chunks. (tests/unit)
- Improved API reliability and streamlined model onboarding in the console — The console's API client now includes automatic retries (2 attempts with a 1-second delay) and a 120-second timeout for skill listing requests, improving resilience on slow networks. Model onboarding has been streamlined: the model selector now guides users to connect a provider and select a model directly from the dropdown, and the Settings page displays a clearer 'Connect your first model' prompt instead of a generic button. Additionally, thinking controls now display a 'Default' state for unresolved settings, and the UI has been updated with a new visual theme for sliders and provider cards. (console)
- Update python-telegram-bot dependency to version 20.8 — The python-telegram-bot library has been updated to require version 20.8 or higher in the project dependencies. ((dependencies))
- Added tests for history store integrity, shell execution, Telegram rich messages, and model catalog — This update adds comprehensive test coverage for several product areas. For the history store, new tests verify that integrity checks are single-flight and cached per process, but are re-run when the database file is replaced or if a check fails (triggering quarantine). For shell execution, tests confirm that Windows process creation flags are correctly applied. For Telegram, tests validate the new Rich Messages feature for Markdown tables, including detection logic, byte limits, fallback to legacy HTML when the Rich API is unavailable, and thread support. Finally, a snapshot test for the model catalog is updated to reflect the addition of one new model. (tests)
- Fixes for history database performance, Windows shell isolation, and Telegram message formatting — This update resolves several stability and usability issues. The history database now avoids repeated, expensive integrity scans on every request by caching the check result process-wide, significantly improving performance for long-running servers. On Windows, shell commands are now isolated from the host console by setting the CREATE\_NO\_WINDOW flag, preventing unwanted console windows from appearing. For Telegram users, the channel now attempts to send Markdown tables using Telegram's native Rich Messages API for better formatting, falling back to the previous chunked HTML method if the API is unavailable. Additionally, a new middleware compresses large JSON responses to reduce bandwidth usage. (src/qwenpaw)
- Validate sharded model catalog integrity during desktop packaging — The desktop packaging scripts now run a dedicated verification step that checks the bundled model catalog's index and every referenced provider shard for path safety and SHA-256 checksum integrity before the build completes. This ensures that the model catalog files included in the final bundle are exactly as expected and have not been tampered with or corrupted, replacing the previous simple existence check with a robust content validation. (scripts)
- Fixes for OMP role skill metadata and approval actor forwarding — The OMP roles skill now includes the required frontmatter (name, description, and metadata) so it is correctly recognized and triggered by the system. Additionally, the approval service patch now forwards the actor parameter to the underlying approval resolution logic, ensuring that the actor context is preserved during approval decisions. (plugins/bundle)
- Fix display of sent files in serialized chat history — The ResponseArtifactList component now correctly renders files sent by the assistant when the chat history is loaded from a serialized state. Previously, the component only handled output as a direct array of blocks; it now detects when the output is a JSON string, parses it, and extracts the file artifacts, ensuring users can see previously sent files in their conversation history. (console/src/features/files-workspace)
- Improved test reliability and coverage for cross-platform and invitation logic — Tests are updated to run reliably on Windows by skipping POSIX-only assertions (such as file mode bits, symlinks, and FIFOs) and using platform-appropriate locking mechanisms (msvcrt vs fcntl). A new test suite for invitation redemption failure reasons ensures that distinct error states (not found, revoked, already used, expired, registration closed) map to specific HTTP status codes and audit details. (tests)
- Fix session poisoning from empty text blocks and clarify invitation failure reasons — The agent now prevents sessions from being poisoned by empty assistant text blocks (which caused Volcengine Ark to reject requests with 400 errors) by dropping them at persistence time and sanitizing loaded contexts. Additionally, the hub's invitation redemption process now distinguishes specific failure reasons (such as expired, revoked, or already used codes) and returns appropriate HTTP status codes (403, 404, 409, 410) instead of generic errors. (src/qwenpaw)
- Add Usage Policy page and open-source notice to Downloads — The website now includes a dedicated Usage Policy page (accessible at /usage-policy) with a link in the footer, allowing users to review guidelines for responsible AI use. Additionally, the Downloads page displays an open-source notice clarifying that builds are from the QwenPaw open-source project under the Apache License 2.0, with the notice localized in English, Portuguese, and Chinese. (website)
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Baseline
- First survey — no prior run to compare against. CAI 59.
Lenses
- Code Health 63
- Architecture 57
- Maturity 74
- Readiness 70
- Security 68
- Domain Modelling 70
- Accessibility 54
- Performance 70
Changes since last survey
- 300 commits — 142 feature/other, 158 fixes
By area
- src/qwenpaw — 104 commits
- console/src — 102 commits
- .github/workflows — 14 commits
- tests/unit — 14 commits
- website/public — 12 commits
- (root) — 9 commits
- plugins/apps — 8 commits
- e2e/tests — 6 commits
- tests/integration — 6 commits
- console/src-tauri — 5 commits
- plugins/bundle — 3 commits
- scripts/pack-tauri — 3 commits
- website/src — 3 commits
- console/package-lock.json — 2 commits
- deploy/Dockerfile — 1 commit
- docs/design — 1 commit
- docs/pawapp-sdk-app-contract-proposal.md — 1 commit
- e2e/pages — 1 commit
- packages/qwenpawmail-mcp — 1 commit
- plugins/memory — 1 commit
Notable commits
- fix: Fix/tool card stuck calling after stop (#7345)
- fix: fix(ACP): Improves the experience of delegating work to external ACP runners (#7783)
- fix: fix(acp): prevent Windows ACP agent stalls during workspace bootstrap (#7401)
- fix: fix(acp): select permission options by protocol kind (#7732)
- fix: fix(agent): fold consumed thinking under context pressure (#7521)
- fix: fix(agents): drop empty assistant text blocks (#7409)
- fix: fix(agents): handle PDF blocks for text-only models (#7621)
- fix: fix(agents): handle unknown input_audio rejections (#7886)
- fix: fix(agents): strip tool-result PDF document blocks for OpenAI chat-completions requests regardless of multimodal support (#7636)
- fix: fix(api): return 422 for non-finite validation inputs (#7677)
- fix: fix(backup): keep jobs alive after SSE disconnect (#7283)
- fix: fix(backup): preserve Unix permission bits during restore for SECRET_DIR and .master_key (#7658)
- fix: fix(browser): chrome extension tab group (#7457)
- fix: fix(browser): move managed Chromium install off startup critical path (#7539)
- fix: fix(channels): make contract checks portable and complete (#7267)
- fix: fix(channels): support Base64 data URLs in outbound media (#7647)
- fix: fix(chat): exclude reasoning from generated titles (#7187)
- fix: fix(chat): improve mobile composer controls (#7334)
- fix: fix(chat): restore compact copy action icons (#8021)
- fix: fix(chat): sync resolved sessions during streaming (#7523)
- …and 280 more
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
agentscope-ai/QwenPaw was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 3 October 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 80e412da9b5505bcac5eec6add271d09fa144c60 — the exact code this score is about.
- Scored under rubric-2026.10.1 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-7c295ce42055.