| Permission scope -> per-session |
Shipped: #4232 + #4335 |
POST /session/:id/permission/:requestId route + MultiClientPermissionMediator owns per-session pending state. Legacy POST /permission/:requestId kept for back-compat. |
/capabilities.protocolVersions |
Shipped: #4191 |
getServeProtocolVersions() is in the capabilities envelope. |
| Replay ring configurable |
Shipped: #4237 |
--event-ring-size <n> plus slow_client_warning hysteresis backpressure. |
| Cross-client mutation event echo (partial) |
Shipped: #4484 |
Closed 5 of 8 audit gaps. Follow-up cleanup shipped in #4510. |
| Daemon-stamped client identity (partial) |
Shipped: #4231 |
X-Qwen-Client-Id stamping + audit. Pair tokens + per-client revocation remain open below. |
POST /session/:id/{load,resume} stable surface (T2.1) |
Shipped: #4222 + #4897 |
Base routes shipped in #4222. #4897 restored cross-session file history snapshots and added the stable session_resume capability tag; legacy unstable_session_resume remains only as a compatibility alias while docs/older clients catch up. |
| File history snapshot persistence (T2.1 prereq) |
Shipped: #4897 |
Main now persists file history snapshots for cross-session /rewind / resume hardening. This replaced the stalled #4253 prerequisite and unblocked stable resume advertising. |
| Session close + display metadata |
Shipped: #4240 |
DELETE /session/:id and PATCH /session/:id/metadata for displayName. This is not arbitrary IM-style KV. |
POST /session/:id/recap |
Shipped: #4504 |
Dedicated route + SDK helper merged. /recap slash passthrough is not needed. |
--allow-origin <pattern> CORS allowlist |
Shipped: #4527 |
Boot refuses --allow-origin '*' without a bearer token. Origin: null always rejected. |
| Prompt absolute deadline + SSE writer idle timeout |
Shipped: #4530 |
--prompt-deadline-ms + --writer-idle-timeout-ms flags with env fallbacks. Per-prompt body deadlineMs field. Both off by default. |
| Cross-client sync follow-up cleanup |
Shipped: #4510 |
Epoch-reset resync, approval-mode serialization, catch-up indicator. |
| In-session model switch bus (A1) |
Shipped: #4546 |
/model slash command and plan-mode switch publish model_switched over extNotification side-channel. Covers the "in-session ACP setModel bus emit" part of T2.7-followups. |
| Runtime MCP server add/remove |
Shipped: #4552 |
POST /workspace/mcp/servers (add) + DELETE /workspace/mcp/servers/:name (remove). ACP hot-reload for MCPClient lifecycle, cross-client workspace_mcp_servers_changed event echo. |
| ACP Streamable HTTP transport |
Shipped: #4472 |
ACP Streamable HTTP transport at /acp per RFD #721. |
| Non-blocking POST /prompt |
Shipped: #4585 |
POST /session/:id/prompt returns 202 with promptId for non-blocking semantics. |
| Session tasks snapshot |
Shipped: #4578 |
Dedicated tasks snapshot endpoint. Upgrades background tasks from slash-command-only to structured API. |
| Server-side shell execution |
Shipped: #4576 |
! (bang) prefix for server-side shell command execution via daemon. |
| Context-usage API |
Shipped: #4573 |
Context-usage API endpoint + daemon-react-sdk refactor + dialog UX. |
POST /session/:id/btw side questions |
Shipped: #4610 |
Dedicated endpoint for side questions within an active session. |
| Request-level logging for serve routes |
Shipped: #4606 |
Structured per-request logging for all serve routes. |
| Daemon file logger |
Shipped: #4559 |
File-based logging for daemon process. |
| Web-shell memory commands ACP mode |
Shipped: #4819 (re-target of #4811) |
/remember, /forget, /dream enabled in ACP mode via supportedModes declaration + argumentHint for command palette. |
Web-shell /tasks command |
Shipped: #4578 |
Session tasks snapshot endpoint + web-shell local handler (handleTasksSlashCommand). |
Per-request ACP _meta |
Covered by POST /session/:id/prompt |
Prompt requests already accept and forward ACP _meta. A separate session-level KV store is optional unless a concrete channel adapter needs daemon-owned metadata. |
| Manual compaction |
Covered by /prompt -> /compress |
/compress supports ACP. A dedicated route is optional structured API polish, not a missing base capability. #4516 was closed on that basis. |
| Session stats |
Covered by /prompt -> /stats |
/stats, /stats model, /stats tools support ACP. #4515 was closed because structured JSON/SDK helpers are optional convenience. |
| Session export |
Covered by /prompt -> /export |
/export md/html/json/jsonl supports ACP. #4515 was closed because download/SDK helpers are optional convenience. |
| Project summary |
Covered by /prompt -> /summary |
/summary supports ACP and saves .qwen/PROJECT_SUMMARY.md. Dedicated GET /summary is not needed unless a structured endpoint is explicitly requested. |
/rewind HTTP endpoints |
Shipped: #4820 |
GET /session/:id/rewind/snapshots + POST /session/:id/rewind. Conversation + file rewind over HTTP with session_rewound SSE event, SDK helpers, SessionBusyError / InvalidRewindTargetError typed errors. |
Web-shell /directory command ACP mode |
Shipped: #4826 |
/directory show + /directory add enabled in ACP mode. Refactored from addItem to MessageActionReturn, partial-success warning messageType, gemini.addDirectoryContext() try-catch, argumentHint for command palette. |
| Hooks diagnostic HTTP/ACP surface |
Shipped: #4822 |
GET /workspace/hooks + GET /session/:id/hooks endpoints, SDK helpers, capability tags, ACP mode for /hooks command. |
| Extensions diagnostic HTTP/ACP surface |
Shipped: #4832 |
GET /workspace/extensions endpoint, SDK workspaceExtensions() helper, workspace_extensions capability tag, ACP extMethod, /extensions list in ACP/non-interactive mode. |
| Load-test harness (T3.4 partial) |
Shipped: #4862 |
Mock-ACP connection stress test (5 scenarios), shared perf harness refactoring (_daemon-benchmark-helpers.ts, _daemon-perf-report.ts), vitest.loadtest.config.ts. Gated by QWEN_LOADTEST_ENABLED=1. |
| MCP transport pool (T3.7) |
Shipped: #4336 + #4490 |
McpTransportPool with SHA-256 config fingerprint dedup, per-entry refcounting, drain timers, SessionMcpView per-session tool/prompt filtering, WorkspaceMcpBudget workspace-scoped budget. Merged to main via daemon batch #4490; mcp_workspace_pool is advertised when the pool is active. |
POST /session/:id/branch (T3.1) |
Shipped: #4812 |
Session fork HTTP route with resume semantics, promptQueue serialization, session_branched SSE event, SDK branchSession() helper, BranchWhilePromptActiveError → 409, title-length enforcement. |
/settings, /hooks, /extensions HTTP surface (T3.9) |
Shipped: #4816 + #4822 + #4832 |
/settings slash command + workspace_settings capability tag. /hooks + /extensions diagnostic endpoints. All three sub-items complete. |
/auth command ACP mode |
Covered: #4827 + #4490 |
Already declares supportedModes: ['interactive', 'non_interactive', 'acp']. Auth device-flow _qwen/* methods for REST parity shipped in #4827 and reached main via #4490. |
/goal command ACP mode |
Covered: #4273 + #4314 |
Already declares supportedModes: ['interactive', 'non_interactive', 'acp']. Goal stream events + non-interactive goals shipped. |
| Per-tier HTTP rate limiting (T3.4) |
Shipped: #4861 |
--rate-limit opt-in flag with token bucket (continuous drip). Three tiers: prompt (10/min), mutation (30/min), read (120/min). Health/heartbeat/SSE/ACP exempt. Fail-open at 10k bucket cap. rate_limit conditional capability tag. onError callback for observability. Typed setRateLimiter/getRateLimiter accessors. Shutdown setDraining + dispose. |
/language, /doctor, /diff |
Covered by /prompt |
These declare ACP/non-interactive support, so they should not be listed as "not on the wire". |
Purpose
Track the remaining real gaps in the
qwen serveHTTP/SSE surface after accounting for the existing slash-command passthrough path.A remote client can already invoke ACP-compatible slash commands by sending them through:
POST /session/:id/prompt {"prompt":[{"type":"text","text":"/stats"}]}So this issue tracks only work that needs a dedicated HTTP/SSE/SDK surface or cannot be represented by
POST /session/:id/prompt. Commands that already work through/promptare not treated as missing capabilities unless there is a concrete downstream need for typed JSON, download semantics, SDK helpers, or event echoes.Baseline refreshed:
main(fa684552b, 2026-06-12). Cross-checked against commandsupportedModes,GET /session/:id/supported-commands, current docs, and the current merged PR set.Rating scale
Already shipped / already covered
POST /session/:id/permission/:requestIdroute +MultiClientPermissionMediatorowns per-session pending state. LegacyPOST /permission/:requestIdkept for back-compat./capabilities.protocolVersionsgetServeProtocolVersions()is in the capabilities envelope.--event-ring-size <n>plusslow_client_warninghysteresis backpressure.X-Qwen-Client-Idstamping + audit. Pair tokens + per-client revocation remain open below.POST /session/:id/{load,resume}stable surface (T2.1)session_resumecapability tag; legacyunstable_session_resumeremains only as a compatibility alias while docs/older clients catch up./rewind/ resume hardening. This replaced the stalled #4253 prerequisite and unblocked stableresumeadvertising.DELETE /session/:idandPATCH /session/:id/metadatafordisplayName. This is not arbitrary IM-style KV.POST /session/:id/recap/recapslash passthrough is not needed.--allow-origin <pattern>CORS allowlist--allow-origin '*'without a bearer token.Origin: nullalways rejected.--prompt-deadline-ms+--writer-idle-timeout-msflags with env fallbacks. Per-prompt bodydeadlineMsfield. Both off by default./modelslash command and plan-mode switch publishmodel_switchedoverextNotificationside-channel. Covers the "in-session ACP setModel bus emit" part of T2.7-followups.POST /workspace/mcp/servers(add) +DELETE /workspace/mcp/servers/:name(remove). ACP hot-reload for MCPClient lifecycle, cross-clientworkspace_mcp_servers_changedevent echo./acpper RFD #721.POST /session/:id/promptreturns 202 withpromptIdfor non-blocking semantics.!(bang) prefix for server-side shell command execution via daemon.POST /session/:id/btwside questions/remember,/forget,/dreamenabled in ACP mode viasupportedModesdeclaration +argumentHintfor command palette./taskscommandhandleTasksSlashCommand)._metaPOST /session/:id/prompt_meta. A separate session-level KV store is optional unless a concrete channel adapter needs daemon-owned metadata./prompt->/compress/compresssupports ACP. A dedicated route is optional structured API polish, not a missing base capability. #4516 was closed on that basis./prompt->/stats/stats,/stats model,/stats toolssupport ACP. #4515 was closed because structured JSON/SDK helpers are optional convenience./prompt->/export/export md/html/json/jsonlsupports ACP. #4515 was closed because download/SDK helpers are optional convenience./prompt->/summary/summarysupports ACP and saves.qwen/PROJECT_SUMMARY.md. DedicatedGET /summaryis not needed unless a structured endpoint is explicitly requested./rewindHTTP endpointsGET /session/:id/rewind/snapshots+POST /session/:id/rewind. Conversation + file rewind over HTTP withsession_rewoundSSE event, SDK helpers,SessionBusyError/InvalidRewindTargetErrortyped errors./directorycommand ACP mode/directory show+/directory addenabled in ACP mode. Refactored fromaddItemtoMessageActionReturn, partial-successwarningmessageType,gemini.addDirectoryContext()try-catch,argumentHintfor command palette.GET /workspace/hooks+GET /session/:id/hooksendpoints, SDK helpers, capability tags, ACP mode for/hookscommand.GET /workspace/extensionsendpoint, SDKworkspaceExtensions()helper,workspace_extensionscapability tag, ACP extMethod,/extensions listin ACP/non-interactive mode._daemon-benchmark-helpers.ts,_daemon-perf-report.ts),vitest.loadtest.config.ts. Gated byQWEN_LOADTEST_ENABLED=1.McpTransportPoolwith SHA-256 config fingerprint dedup, per-entry refcounting, drain timers,SessionMcpViewper-session tool/prompt filtering,WorkspaceMcpBudgetworkspace-scoped budget. Merged tomainvia daemon batch #4490;mcp_workspace_poolis advertised when the pool is active.POST /session/:id/branch(T3.1)resumesemantics,promptQueueserialization,session_branchedSSE event, SDKbranchSession()helper,BranchWhilePromptActiveError→ 409, title-length enforcement./settings,/hooks,/extensionsHTTP surface (T3.9)/settingsslash command +workspace_settingscapability tag./hooks+/extensionsdiagnostic endpoints. All three sub-items complete./authcommand ACP modesupportedModes: ['interactive', 'non_interactive', 'acp']. Auth device-flow_qwen/*methods for REST parity shipped in #4827 and reachedmainvia #4490./goalcommand ACP modesupportedModes: ['interactive', 'non_interactive', 'acp']. Goal stream events + non-interactive goals shipped.--rate-limitopt-in flag with token bucket (continuous drip). Three tiers: prompt (10/min), mutation (30/min), read (120/min). Health/heartbeat/SSE/ACP exempt. Fail-open at 10k bucket cap.rate_limitconditional capability tag.onErrorcallback for observability. TypedsetRateLimiter/getRateLimiteraccessors. ShutdownsetDraining+dispose./language,/doctor,/diff/promptClosed as optional after re-triage
GET /session/:id/stats+GET /session/:id/export/promptslash passthrough. Reopen only if a client needs typed JSON or browser-download-friendly export.POST /session/:id/compress+POST/GET /session/:id/_meta/compressalready works through/prompt. Session-level_metais conditional product work: per-request ACP_metaalready exists, and daemon-owned session KV should wait for a concrete channel-adapter need and a decision on whether/how it affects subsequent prompts./restoreover HTTP/session/:id/rewind(#4820). Remote rollback is already covered over HTTP; the remaining/restore-specific behavior is interactive pending tool-call replay, which should stay TUI-only unless a concrete remote client needs daemon-side tool replay semantics.In flight - do not duplicate
No active duplicate-avoidance rows right now. #4897 replaced the stalled #4253 file-history snapshot prerequisite for T2.1.
Tier 1 - actual must-do gaps
No Tier 1 rows after the 2026-05-31 re-triage. Previously listed S-sized rows are either shipped, already covered by slash-command passthrough, or conditional product work.
Tier 2 - should-do gaps
T2.1loadSession/resumeover HTTP graduated fromunstable_⭐⭐⭐⭐⭐M-Lsession_resumecapability tag and closed the file-history snapshot persistence blocker.unstable_session_resumeremains as a backwards-compatible alias, not an active gap.Tier 3 - real but deferred / product-decision gaps
T3.1POST /session/:id/branch(fork a session)⭐⭐⭐Mresumesemantics,promptQueueserialization,session_branchedSSE event, SDKbranchSession()helper.T3.2/restoreover HTTP⭐⭐⭐M-L/session/:id/rewind(#4820). Remote rollback is already covered; the only remaining/restore-specific behavior is interactive pending tool-call replay, which is not worth exposing over HTTP without a concrete remote-client need.--max-body-sizeflagT3.4Rate limiting + observability + load-test harness⭐⭐L--rate-limitopt-in) + load-test harness #4862 (mock-ACP connection stress test, 5 scenarios). Observability: #4606 (request-level logging) + #4559 (daemon file logger).T3.7MCP server children refcounted by(workspace, config-hash)⭐⭐Mmainvia #4490 after #4336 / daemon batch work:McpTransportPoolwith SHA-256 fingerprint dedup, per-entry refcounting (refs: Set<sessionId>), drain timers,SessionMcpViewper-session projection,WorkspaceMcpBudget, andmcp_workspace_poolcapability advertising./_meta)_metaalready exists, and a session KV route needs a product decision on whether/how it is injected into later prompts.T3.9/extensions,/settings,/hooksHTTP surface⭐M/settings: #4816./hooks: #4822./extensions: #4832.T3.10Web-shell slash command gap:/permissions⭐⭐S/permissionsrule CRUD maps topermissions.allow/ask/denyarrays in settings.json — once #4816 ships, web-shell can read/write these viaGET/POST /workspace/settings. Dedicated sub-commands (/permissions list/add/remove) deferred unless a concrete need for rule validation + source annotation arises beyond what settings API provides./directoryshipped: #4826./auth+/goalalready declare ACP support.Explicitly not tracked here
These are either TUI-local UX, already ACP-compatible slash commands, or optional convenience endpoints rather than missing daemon capabilities.
/summary,/stats,/export,/compress,/language,/doctor,/diffPOST /session/:id/promptas ACP-compatible slash commands. Add dedicated routes only if a client explicitly needs typed JSON, download semantics, SDK helpers, or SSE event echoes./restoreover HTTP/session/:id/rewindfor remote rollback. The TUI-only/restoreflow also replays a pending tool call, and daemon-side tool replay should not be added without a concrete remote client and explicit permission/event semantics.POST/GET /session/:id/_metaPOST /session/:id/promptalready supports per-request ACP_meta; daemon-owned session KV is optional product work./vim,/editor,/theme,/statusline,/terminal-setup,/ide,/lsp,/memory,/mcp,/agents,/tools,/approval-modeslash UX/arena/trustdialog; trust concept in ACP is managed at operator level, not end-user.Recommended next pulls after current open PRs
How to use this issue
/promptslash passthrough, first decide whether the client truly needs a structured HTTP/SDK surface. If not, document the passthrough usage instead of adding a route.🤖 Generated with Qwen Code