工作区注册与运行边界
管理多个工作区的生命周期、信任和容量,并识别 daemon 共享的权限边界。
一个 daemon 可以管理多个不重叠的注册工作区,每个有自己的 cwd、环境覆盖、服务、ACP bridge、渠道 worker 和工作区资源。listener、认证、HTTP 限流、全局会话容量、指标、关闭与进程故障范围仍共享。
显式与动态注册
qwen serve \
--workspace /absolute/path/project-a \
--workspace /absolute/path/project-b路径必须为绝对路径,首个为 primary。请求省略 cwd 时使用 primary,指定路径规范化后若不属于注册集合,返回 workspace_mismatch。
运行时可 POST /workspaces 注册动态 secondary;persist: true 写入用户级注册存储,供下次启动恢复。primary 和显式启动的静态工作区必须重启才能移除。动态及持久恢复的 secondary 可移除,正常移除拒绝忙碌运行时,强制移除请求终止资源并在持久提交后完成逻辑移除。
同一路径重新添加前先完成逻辑移除。提交点之后的清理有时间边界、尽力完成,失败写日志,不会把已移除运行时重新加入。
信任与子进程
生产启动尝试预热可信 primary 的 ACP,失败后首次使用可再尝试;可信 secondary 首次运行型命令或会话时才启动自己的子进程。未信任 secondary 不启动 ACP。
未信任工作区仍可展示诊断、有限文件读取、持久会话目录,以及具备 capability 时的受限 transcript 读取;不能据此执行任务、恢复会话、修改或完整导出。Web Shell 将其标为 untrusted/read-only。需要执行时先建立信任并重启 daemon。
工作区信任是执行门禁,不是 ACL。共享 bearer 的客户端能访问该 daemon 对所有注册工作区开放的路由。需要独立 token、配额、审计或系统权限的用户应分开 daemon;同一 UID 的 Shell 能力也不受工作区环境覆盖隔离保护。
注册容量
默认最多注册 256 个工作区,包含 primary、secondary 和用户创建的 scratch,内部 Conversations runtime 不计入。可通过启动环境降低:
QWEN_SERVE_MAX_WORKSPACES=25 qwen serve --workspace /absolute/path/project合法范围是十进制整数 1–256,非法值导致启动失败。项目 .env 或 settings.env 不能改变它;嵌入式 ServeOptions.maxRegisteredWorkspaces 优先于启动环境。
达到容量时动态注册返回 409 workspace_limit_reached,capabilities 和 daemon/status 在 limits.maxRegisteredWorkspaces 公布有效值。渠道控制另最多 25 个拥有 worker 的工作区,恢复过程中保留的 owner 也占容量;超限返回 channel_control_workspace_limit_reached。
持久存储和降级
注册文件 schemaVersion 仍为 1,最多 255 个 secondary 原始记录、8 MiB。旧别名等原始记录也占位,直到明确忘记。有效启动集合超出配置容量时,启动失败但不改文件。
降低容量前,先以原容量启动并移除足够注册,再减少显式 workspace 参数。降级旧二进制前备份存储,并用新版本将其缩至不超过 24 个 secondary、256 KiB;旧版本否则可能拒绝存储、只用显式工作区,且不能成功改写旧存储。
项目记忆分区
daemon 默认 memory-project-scope 为 workspace,按注册目录分区;git-root 是兼容旧记忆的选择。这个启动值对全部运行时冻结,项目环境不能单独覆盖。默认改变不会自动迁移旧的 Git 根记忆,独立 TUI 仍默认 git-root。
存储键会把非字母数字字符替换为连字符,因此 feature_1 与 feature-1 等目录仍可能碰撞,不能把工作区命名视为绝对记忆隔离。CLI 值区分大小写,环境 QWEN_CODE_MEMORY_PROJECT_SCOPE 会 trim 并转小写;无效非空环境值告警并保留旧 git-root 行为。