Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
68c54e7
feat(web-shell): declutter workspace sidebar and add loopback open ac…
wenshao Aug 31, 2026
4d24284
Merge remote-tracking branch 'origin/main' into feat/webshell-workspa…
wenshao Aug 31, 2026
5459500
fix(web-shell): keep session dates in the hover popover with yyyy-MM-…
wenshao Aug 31, 2026
dbe608f
fix(web-shell): show HH:mm:ss for same-day sessions in the hover popover
wenshao Aug 31, 2026
ad677a3
fix(cli): register local-path-open in the serve process.env guard
wenshao Aug 31, 2026
0731457
Merge remote-tracking branch 'origin/main' into feat/webshell-workspa…
wenshao Aug 31, 2026
c98701a
fix(web-shell): address review findings on accessibility and platform…
wenshao Aug 31, 2026
4936045
Merge remote-tracking branch 'origin/main' into feat/webshell-workspa…
wenshao Aug 31, 2026
9338a61
fix(cli,web-shell): address review round 2 — linux terminal gates, wo…
wenshao Aug 31, 2026
650d2f3
docs(developers): sync daemon capability counts with the registry
wenshao Sep 1, 2026
ab48b21
fix(cli): make the spawn hang guards testable without fake timers
wenshao Sep 1, 2026
0120f70
Merge remote-tracking branch 'origin/main' into feat/webshell-workspa…
wenshao Sep 1, 2026
bea3818
fix(cli,web-shell): address re-review — wt hang fallback guard, menu-…
wenshao Sep 1, 2026
f25d0d3
Merge remote-tracking branch 'origin/main' into feat/webshell-workspa…
wenshao Sep 1, 2026
b2fe0ab
fix(serve): mirror runtime-only capability tags in the bootstrap enve…
wenshao Sep 1, 2026
7e7e250
fix(web-shell): drop duplicate language declarations in ChatEditor test
wenshao Sep 1, 2026
e5398dc
Merge branch 'main' into feat/webshell-workspace-hover-details
wenshao Sep 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/developers/daemon/00-index.md
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ Use these anchors when moving from the docs into the latest `main` code:
| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
| HTTP routes | The route catalog lives in `qwen-serve-protocol.md`; this daemon set only references it and explains implementation ownership. | [`../qwen-serve-protocol.md`](../qwen-serve-protocol.md), [`20`](./20-quickstart-operations.md) |
| Event schema | `EVENT_SCHEMA_VERSION = 1`; 53 known event types; id-less subscriber synthetic frames; `_meta.serverTimestamp` stamped by `EventBus.publish()` (with `formatSseFrame()` fallback for synthetic frames). | [`09`](./09-event-schema.md), [`10`](./10-event-bus.md) |
| Capabilities | `SERVE_PROTOCOL_VERSION = 'v1'`; 147 registered tags; 41 conditional tags. | [`11`](./11-capabilities-versioning.md) |
| Capabilities | `SERVE_PROTOCOL_VERSION = 'v1'`; 149 registered tags; 43 conditional tags. | [`11`](./11-capabilities-versioning.md) |
| Session shell | `POST /session/:id/shell` exists behind `--enable-session-shell`, bearer or trusted-loopback authority, and session-bound `X-Qwen-Client-Id`; capability tag is conditional. | [`11`](./11-capabilities-versioning.md), [`17`](./17-configuration.md), [`20`](./20-quickstart-operations.md) |
| Rate limiting | Optional per-tier HTTP rate limit is exposed by CLI flags/env and conditional capability tag. | [`11`](./11-capabilities-versioning.md), [`17`](./17-configuration.md) |

Expand Down
2 changes: 2 additions & 0 deletions docs/developers/qwen-serve-protocol.md
Original file line number Diff line number Diff line change
Expand Up @@ -558,6 +558,8 @@ operator diagnostic snapshot documented below.
| `workspace_runtime_removal` | removable dynamic or persistence-restored secondary runtimes can be drained and removed through the management route. |
| `native_directory_picker` | the daemon host can open a native OS directory picker (`osascript` on macOS, PowerShell on Windows, `zenity` on a Linux host with a display). Headless hosts omit the tag so clients hide the Browse affordance instead of surfacing a guaranteed picker failure. |
| `workspace_runtime` | every active workspace bridge provides an authoritative runtime lifecycle snapshot; mixed or legacy injected bridges omit the tag. |
| `workspace_local_open` | the daemon host can open a workspace directory in the host's OS file manager (`open` on macOS, `explorer.exe` on Windows, `xdg-open` on a Linux host with a display). Headless hosts omit the tag so clients hide the Open-locally affordance instead of surfacing a guaranteed launch failure. The opened path is always the resolved registered workspace cwd, via `POST /workspaces/:workspace/open`; the route accepts an optional JSON body `{ "target": "terminal" }` (absent/other = folder) and answers `{ kind: 'workspace-local-open', opened: true, target }` with `target` set to `folder` or `terminal`. |
| `workspace_local_terminal` | the daemon host can open a terminal window in a workspace directory (`open -a Terminal` on macOS, `wt.exe` with `cmd.exe` fallback on Windows, `gnome-terminal`/`konsole`/`xterm` on a Linux host with a display). Headless hosts omit the tag so clients hide the Open-in-terminal affordance instead of surfacing a guaranteed launch failure. Served by `POST /workspaces/:workspace/open` with body `{ "target": "terminal" }`. |
| `workspace_qualified_acp` | ACP HTTP and multi-workspace runtimes are active, so the plural ACP endpoint can select a secondary runtime. |
| `workspace_qualified_voice` | multi-workspace runtimes and the shared ACP/Voice WebSocket listener are active, so every workspace-qualified Voice modality is reachable for a secondary runtime. |
| `workspace_qualified_memory` | ACP HTTP and multi-workspace runtimes are active, so workspace-qualified managed-memory routes can select a per-workspace task lane for remember, forget, and dream operations. |
Expand Down
17 changes: 17 additions & 0 deletions integration-tests/cli/qwen-serve-routes.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,10 @@ import {
type ChatRecord,
} from '@qwen-code/qwen-code-core';
import { isNativeDirectoryPickerAvailable } from '../../packages/cli/src/serve/native-directory-picker.js';
import {
isLocalPathOpenAvailable,
isLocalTerminalAvailable,
} from '../../packages/cli/src/serve/local-path-open.js';

const __dirname = path.dirname(fileURLToPath(import.meta.url));
// Match the rest of the integration suite: prefer the bundled CLI
Expand All @@ -67,6 +71,10 @@ let client: DaemonClient;
// assertion time minutes later diverged when the host's GUI session state
// drifted mid-run (red macOS E2E runs after #9406, tracked in #10453).
let nativeDirectoryPickerAtBoot = false;
// Same boot-time probe pinning as above, for the workspace_local_open tag.
let localPathOpenAtBoot = false;
// Same boot-time probe pinning as above, for the workspace_local_terminal tag.
let localTerminalOpenAtBoot = false;

function writePersistedTranscript(
sessionId: string,
Expand Down Expand Up @@ -119,6 +127,8 @@ function chatRecord(
beforeAll(async () => {
homeDir = mkdtempSync(path.join(tmpdir(), 'qwen-serve-routes-home-'));
nativeDirectoryPickerAtBoot = isNativeDirectoryPickerAvailable();
localPathOpenAtBoot = isLocalPathOpenAvailable();
localTerminalOpenAtBoot = isLocalTerminalAvailable();
daemon = spawn(
process.execPath,
[
Expand Down Expand Up @@ -377,6 +387,7 @@ describe('qwen serve — capabilities envelope', () => {
'session_metadata',
'session_organization',
'session_export',
'standalone_sessions_v1',
'session_transcript',
'session_transcript_pagination',
'mcp_guardrails',
Expand All @@ -398,6 +409,7 @@ describe('qwen serve — capabilities envelope', () => {
'workspace_permissions',
'workspace_voice',
'workspace_trust',
'workspace_trust_hot_reload',
'workspace_init',
'workspace_github_setup',
'workspace_github_prs',
Expand All @@ -423,11 +435,15 @@ describe('qwen serve — capabilities envelope', () => {
'channel_control',
'channel_management',
'workspace_channel_observed_contacts',
'dynamic_workspace_registration',
'persistent_workspace_registration',
'workspace_display_name',
'scratch_workspace_registration',
'workspace_runtime_removal',
...(nativeDirectoryPickerAtBoot ? ['native_directory_picker'] : []),
'workspace_runtime',
...(localPathOpenAtBoot ? ['workspace_local_open'] : []),
...(localTerminalOpenAtBoot ? ['workspace_local_terminal'] : []),
'workspace_qualified_rest_core',
'extension_management_v2',
'extension_state',
Expand All @@ -439,6 +455,7 @@ describe('qwen serve — capabilities envelope', () => {
'workspace_session_live_state',
'workspace_session_metadata',
'voice_transcribe',
'web_terminal',
]);
});
});
Expand Down
Loading
Loading