隔离的用户宿主
用户宿主在整个生命周期内绑定一个用户空间和产品域。Personal Agent 使用这个宿主,不借用项目工作区。现有 Coding 宿主保留原有配置、工具和连接生命周期。
启用方式与隔离声明
Section titled “启用方式与隔离声明”用户宿主默认采用 logical_memory:按宿主绑定的产品域隔离 Personal 与 Coding 的记忆 API、上下文注入、历史、索引和插件存储。不承诺同一操作系统身份下进程与 Shell 的文件保密性。有效的用户空间和产品域绑定仍是前提;客户端不能自行选择其他域的记忆。
内部 SDK 嵌入可明确设置 UserHostIsolationMode: "verified_host"。该强隔离模式必须由可信 UserHostIsolationVerifier 验证;缺失或验证失败时,在创建私有状态前返回 user_host_isolation_required。未知模式会拒绝。独立目录和调用方自我声明不构成证明,逻辑模式不会标记为已验证宿主。
普通用户宿主的 initialize 返回 user_host_isolation: { memory: "logical", host: "unverified" };成功验证的嵌入返回 host: "verified"。此新增能力声明与不可变的 user_space_id、product_domain 分开。普通 Coding 的初始化和权限保持原契约。
app-server 与 remote host 接受 --user-space、--product-domain,默认使用逻辑记忆隔离。用户宿主不能继承项目身份或借用 Coding 的桌面执行桥。模型访问、远程配对、通知凭据与部署仍需分别设置。
显式组合与桌面路由
Section titled “显式组合与桌面路由”通过 --composition-profile personal,或 SDK 的 CompositionProfile: "personal" 显式选择内置 Personal 组合。用户空间绑定不会偷偷选择 profile。已配置的服务绑定和排除项仍然有效;移除提供者不会启用原生实现补位。
桌面运行时调用可以提供 userSpaceId、productDomain 和 compositionProfile。源界面保留自己的 graph_generation。派发前,主进程核验源身份,初始化所选目标宿主,并依据目标实际返回的清单核对插件 ID 与指纹。调用和取消始终绑定握手捕获的目标图及连接。目标变化、绑定失败或提供者移除均明确报错,不会换个宿主重放。目标还会独立检查运行状态、已声明服务及资源授权。界面注册属于源图,纯运行时目标不会收到伪造的桌面激活报告。
输入与上下文回执
Section titled “输入与上下文回执”wuu.client-input-receipts 是通过普通组合模块列表或补丁选择的可选宿主观察能力。内置 Personal bundle 默认选择它;绑定用户空间的 Coding 宿主也可以显式选择。用户空间和产品域本身不会启用它。需要持久化认证输入回执的自定义显式模块列表应包含此模块。
观察能力使用选中的 session.domain provider。禁用后不再接纳新回执、恢复待处理回执或在历史中投影回执,但不会删除已有记录。已接纳的工作仍用捕获的组合完成结算。回执访问继续要求精确匹配宿主用户空间、产品域、会话归属及常规资源授权。
accepted 和 in_history 不表示已读。只有已接纳输入的精确 client ID 和历史序号出现在组装后的 agent 模型上下文中,宿主才在下游模型适配器之前记录 read_at。它表示上下文包含该输入,不证明模型理解了内容或用户看过内容。普通 UI 和会话 API 不能通过插件响应、UI 事件或传入的回执字段声明此观察结果;这些 API 中的回执身份、修订号及来源仍由宿主管理。已安装扩展和替代状态 provider 仍是受信任代码;回执不是防止受信任 provider 篡改的证明。
本地桌面开发可运行 make dev-personal,它是 make dev 的别名。
Personal 与普通用户宿主采用相同的默认逻辑内存隔离,无需 personal_dev
构建标签或跳过隔离检查的参数。若要使用已有数据,请按
开发指南 设置绝对路径的 WUU_HOME。
绑定由宿主提供,并通过 initialize 的 user_space_id 和 product_domain 返回。客户端调用 Personal 服务前应核验绑定。扩展清单变化不会改变绑定。
使用内置本地存储提供者时,用户数据按以下路径组织。这描述的是该实现,不要求替代提供者以本地文件为权威:
user-spaces/<user-space>/<domain>/state:Session、私有插件存储、记忆和托管附件user-spaces/<user-space>/<domain>/files:允许访问的工作文件和用户明确提交的附件工作副本
用户宿主加载明确的绝对路径配置或用户配置,不继承项目指令、Coding 全局技能、项目 MCP、hooks 或外部执行环境。桌面明确将自己的 Personal 用户空间绑定到用户的全局 MCP 服务和所选凭据提供方;项目和插件自带的服务不共享。其他用户空间默认没有共享 MCP 权限。Personal 文件及进程工具不能访问受保护的私有状态路径。已安装扩展仍属于可信代码;这不是不可信扩展沙箱。
每个 Personal 用户空间只向用户呈现一个 twin 持久主对话。导航、重连与重启沿用同一主 Session ID,不自动轮换或拼接其他 Session 的历史。隐藏事项执行保留各自的 Session ID 与需求版本。主 Session 缺失时明确报告恢复错误,不静默重建。历史身份和事项数据仍保留,当前问题和结果统一回到主对话。
常驻执行和连接生命周期
Section titled “常驻执行和连接生命周期”内部 SDK 为每个用户运行时创建一个 UserHost 执行权威,在客户端连接前完成 Session 路由绑定。多个已认证连接共用这个权威;关闭连接或发送协议 shutdown 仅断开该客户端。已接受的工作可以在没有客户端连接时继续。
连接内 RPC ID 和取消操作彼此隔离。业务请求 ID 保持不变,以便重连重试恢复同一持久回执。EOF 撤销仍在运行的前台提交权限,即使回调派生了脱离取消的上下文也不能延长权限;已经接受的执行不会因此撤销。
慢客户端使用有界队列,超限后断开,不阻塞其他连接或后台完成。宿主最多支持 16 个同时连接的客户端传输。应用所有者需先取消或关闭传输、等待 Serve 返回,再调用 SDK Runtime.Close。关闭执行权威会结束其后台执行,与关闭窗口不同。
用户宿主传输仅开放 initialize、plugin/client/request、plugin/client/cancel、用户问题决策接口、设备绑定的推送注册和连接关闭。通用 Coding thread、workspace、storage、配置及包修改接口不可用。桌面扩展管理仍使用正常宿主上下文。Coding 账号历史导出器发现用户宿主绑定后停止,不导出 Personal 数据,也不把其清单当作 Coding 删除记录。
非交互远程宿主不提供通用 ask_user 交互。
持久化的所有者通过 session.attention 按当前通知和安静时段设置决定是否提醒。原始执行结束事件不能授权 Personal 推送。Runtime.SubscribeUserAttention 是独立于手机连接的宿主级观察器;有界、无正文的启动缓冲在重放前重新检查当前归属、代际和策略。它提供尽力通知,不是持久化的提供方送达回执。关闭或停用所有者会阻止迟到提醒。
通知聚合默认关闭。设置窗口(最长 15 分钟)后,分别按负责助理合并待提醒事件,以第一条准入事件的固定截止时间发送。每条对话结果仍即时保留。宿主最多保留 128 组内存队列及最新消息定位;退出可能丢失这些尽力通知。发送及远程重放前重新检查最新条目的当前策略;最新定位失效时保守地取消整组提醒。手机收到一条通用的助理通知,不是逐项精确摘要。改为零会影响新的准入事件;已有窗口通常保留原截止时间。
Personal 历史搜索使用可见对话投影,分页前应用可选的 RFC3339 时间范围:包含 time_min,不包含 time_max。搜索可见的用户和助理文字,不搜索隐藏推理或执行工具记录。结果序号定位到原主对话消息;旧记录缺少时间时保持未知。Coding 原有执行历史检索不变。
有界的无人值守授权
Section titled “有界的无人值守授权”无人值守工作使用显式选中的 execution.authorization@1 提供方,不能依赖保存的
所有者身份或“可信插件”标记。已认证的准入产生有限期、可撤销的授权,绑定选中的任务
权威、当前需求、动作、资源、模型和权限上限。具体执行进一步收窄到持久化的请求和
Session。Personal 只保存不透明引用与到期时间;授权失效后必须重新获得授权。
选中的提供方缺失或拒绝时,不会启用后备提供方。
内置原生提供方只支持本地安装权威,授权必须来自可信本地嵌入入口。已配对手机 或远程所有者连接本身不代表持续有效的账号凭据,因此不能据此签发原生无人值守授权。 外部提供方可以使用宿主证明的 issuer、tenant 和 subject 支持已认证账号,但必须自行 掌握并检查账号的持续有效性与撤销状态。账号停用、退出登录及设备撤销之间的关系以该 提供方实际实现为准,宿主不会相互推断。关闭 GUI 连接与撤销已经准入的授权是两回事。
每次效果执行都必须在审批后、持久化派发声明前,重新通过选中的授权及资源策略验证。 撤销阻止新的准入,不会撤回已经准入的效果。等待用户决定、重试或重启后,不能复用之前 的肯定结论。验证结果不确定时拒绝派发。
前台输入和附件
Section titled “前台输入和附件”客户端在宿主管理的 user_input 信封内提交准确的用户输入。插件方法参数只携带附件引用,不能提供文件路径或替换字节。准入会绑定插件、原始文本、业务请求 ID、附件顺序、文件名、媒体类型和 SHA-256 摘要,并且只能授权绑定的发送。后台回调不能伪造用户权限。
宿主每次最多接受 16 个附件,解码后总计 20 MiB。Personal 文本最多 64,000 个 UTF-8 字节。原生客户端保留较小的传输限制。只有选择附件时才允许空文本。
历史只暴露附件元数据,不暴露本地路径或内联文件字节。host.session.attachment.read 从有归属的持久记录中读取有界 base64 分片;偏移量以 base64 字符计数。Personal 提供按 Agent 和事项限定的适配器。客户端展示预览或下载前核验元数据和最终摘要。原生及桌面渲染不会自动加载模型提供的远程图片或任意本地 URL。
twin 紧接 Wuu 原有导航的 Automations。打开后继续主对话;右栏无分类 tab,连续展示正在进行、最近活动与最近输出。打开详情只更新右栏,不切换主对话。定时安排复用现有 Automation 绑定,改期更新同一安排和绑定。Personal 通知与安静时段配置位于 Wuu 公用设置。
在 Personal 主对话中,用户可对已保存的助理消息表态,主助理可对已保存的用户原始消息表态。每个参与方在一条消息上只有一个当前 Unicode 表情;选择新表情会替换旧表情,移除则清空。隐藏、截断、只读、后台、其他用户空间及尚未持久化的流式消息不能作为目标。Coding 保持不变。
表态是按规范 Session ID 和消息序号保存的插件元数据,不新增对话消息。重新连接或重启后仍保留,历史读取会返回当前状态。客户端通过 agents.react 提交 session_id、message_seq、emoji(移除时为 null)、expected_revision 和有界 request_id。写入仅接受经过认证的客户端能力调用,不接受插件服务调用。主助理使用 react_to_message,由宿主绑定的调用会话确定参与方和目标对话;后台执行器不能使用。旧版本写入失败,重试仍保留的请求回执只返回当前状态,不恢复旧表态。每条消息保留 32 个请求回执;更早的旧请求仍受版本检查约束。
agents.reactions 每次最多刷新 100 个消息序号。历史还返回 reaction_eligible 和 reactions: { owner?, agent?, revision }。保存成功后通过宿主按插件代际隔离的客户端刷新服务发送无正文的 reactions 通知。客户端重新读取持久状态并忽略旧版本;重连和周期刷新补偿丢失的通知。通知失败不会回滚已保存的表态。
用户表态不会启动或恢复回复、派发事项、回答审批、发送推送,也不要求文字回应。下一次主助理自然执行时,插件提供最多 24 个近期变动目标的有界快照,包括当前表态或移除状态以及简短来源摘录。连续变化合并为当前状态。先持久保存有界目标索引,再写入权威消息状态,避免重启丢失成功写入的定位;尚未完成的索引不会伪造表态。新快照取代此前表态上下文。表态只是表达,不是同意、新指令,也不会自动保存成长期偏好。空闲助理不会仅为读取表情启动一次执行。
主助理的指引允许在不需要实质回答时,对简单确认、感谢或进展分享仅用表情回应,但不要求每条消息都表态。提问、求助、需要解释或有实际意义的行动及状态反馈,仍需实质回应。仅用表情确认后,不应重复补一句“收到”;也不能用表情暗示尚未执行或核验的工作已经成功。这是模型行为指引,不是关键词分类器,也不保证模型每次都作出正确选择。
业务契约和外部服务
Section titled “业务契约和外部服务”主助理与隐藏事项执行共用带来源归属和版本化纠正的 Personal Memory 服务。用户可通过对话查询、更正与遗忘,不设置独立的桌面记忆管理页。遗忘会清除记忆记录正文,阻止它参与后续综合;不表示源对话、用户文件和备份也已删除。Coding 记忆保持独立。
事项完成需核验持久化的成功执行证据。主对话的结果投递单独记录为等待、已提交、已送达或失败;事项完成本身不表示主对话里已经出现结果回复。这些检查能证明归属和状态转换,不能证明外部结果本身正确。停止事项会持久化定向取消意图,涵盖后代工作和排队结果,不停止其他事项。停止主对话当前回复需要明确的 turn_id,迟到请求及重试不能转向新的回复,已受理的真实用户输入继续保留在队列中。执行宿主暂不可用时恢复仍可能等待。待回答问题有独立持久投递,用户回答更新原事项,不需要打开执行会话。
发送仍在受理途中且没有回执时,取消保持待核对,不能标记为已停止。恢复时检查原请求并使用当前队列或运行回复的身份取消;恢复事项记录不等于恢复旧进程。事项等待用户回答时,并发提交结果不能绕过问题完成事项。停止已完成或已失败的事项只取消尚未交付的回复,保留已保存的结果;已送达的结果保持不变。
事项生成的主聊问题、结果和失败回复禁用工具。明确重试投递先核对原持久回执:已完成的回复直接恢复,结果不确定则阻止再次尝试。重试只针对主对话回复,不重新运行执行器。自动派发恢复保留原请求身份;明确恢复事项会建立新的要求版本和执行尝试。这些保证不等于外部副作用恰好执行一次,也不授权重复不可逆操作。
Personal 审批与规则
Section titled “Personal 审批与规则”Personal 会审核本地文件修改、原生命令及进程输入,以及支持的连接器账号操作。卡片先说明要做什么、有什么影响;修改内容、命令和账号详情可以展开查看。允许这次只处理当前展示的动作。以后自动处理先展示规则范围;保存规则与批准本次动作是两次独立写入。响应丢失时,先刷新核对保存状态再操作。
新的 Personal 空间默认开启自动审核,已有用户的明确选择保留。审核使用当前 Personal 模型,不调用工具,依据原始真实用户请求与准确动作判断。来源不足、审核不可用或结果不确定时转人工确认;明确拒绝不会执行。Coding 设置独立。审批不能授予账号访问权限,也不能解除受保护路径、执行沙箱或所选授权提供方的限制。
规则属于当前用户和 Personal 空间。文件规则只允许对展示的准确路径执行指定修改操作,后续内容可以不同。命令规则匹配完整调用、实际解析的命令、工作目录、环境及权限,不采用命令前缀放行。连接器规则限定准确账号、操作、收件人和内容。在设置中可以改为“每次先问我”、暂停或删除规则;先问规则优先。执行开始前再次核对规则,新增规则不会批量批准其他正在等待的卡片。
批准必须来自当前所属用户连接,并匹配动作摘要和版本。原始请求变化、取消、撤销规则及文件或命令状态变化都会阻止旧批准继续执行。主聊审批不设固定过期时间;原生后台事项请求等待 30 分钟后过期。启动交互进程不等于批准后续输入。Personal 现有的受保护路径策略仍禁止脱离会话运行的后台进程。新的命令调用是新动作,同一调用重试返回已有回执。已认领但结果未知的动作不自动重放。撤销只阻止尚未开始的操作,不回滚已完成效果。
文件审批覆盖 Personal 文件根目录内的本地 write_file 和 edit_file。现有文件必须是普通单链接文件(当前支持 Unix);符号链接、应用内部状态及已变化的文件前提均拒绝。预览包含长度有限的纯文本原文,较大或二进制原文明确显示无法预览。文件及权限回调需要所捕获代际的“仅本地”保证,授权提供方须支持带执行边界的 acquire-authorization / release-authorization 契约。
这些规则不覆盖任意不透明 MCP/插件副作用、apply_patch、远端执行、独立外部引擎的权限提示或 OAuth/凭据授权。受信任扩展仍使用自身声明的能力。独立 Calendar 提供方保留不可变预览确认协议;连接器日历操作使用上述账号审批流程。合成提供方测试不等于真实 OAuth 或账号结果验证。
底层集成请参阅应用服务器协议(英文)、插件开发和原生客户端配置(英文)。
迁移旧版审批账本
Section titled “迁移旧版审批账本”已有的 personal-review.sqlite 不会被静默替换为空的所选账本。启动若报
personal_review_legacy_migration_required,先停止该用户空间的所有桌面、本地和远程
Personal 宿主,保留备份,再使用与原宿主相同的 WUU_HOME、配置及组合配置覆盖运行本地维护命令:
wuu state migrate-personal-review --user-space local --composition-profile personal# 核对所选提供方、source_digest、记录数量及迁移标记状态。wuu state migrate-personal-review --user-space local --composition-profile personal \ --apply --expect-source-digest DIGEST_FROM_INSPECTION如果原宿主指定配置文件,两次调用都加上 --config /absolute/path/config.json。
仅当原宿主也依赖配置中的 profile 时才省略 --composition-profile。默认只检查
(等同于 --dry-run),不导入审批记录、不创建迁移标记。检查与应用都要求已验证的本地所有者、
当前所选资源策略及独占的停机宿主锁。共享或多宿主存储不接受本地停机证明;应使用所选提供方
具备独占写入证明的离线维护流程。
应用会用预期摘要校验同一份冻结的逻辑源快照,包含 SQLite WAL 中已提交的数据,随后将设置、
动作及审计复制到空的所选提供方,并在同一事务提交与源路径绑定的迁移标记。它不删除或修改
源文件、不覆盖所选记录、不重做结果未知的动作,也不授予执行权限。JSON 结果报告
migration-required、migrated 或 already-migrated。传输或清理失败时保留源文件,先重新检查
再决定重试:匹配的已提交标记可以确认未知的导入结果,无需再次导入。源数据变化或目标已有
不兼容记录时必须由操作者明确核对,不能强制覆盖。
替换提供方的维护边界
Section titled “替换提供方的维护边界”普通插件调用不能签发或转发宿主的维护证明。原生 Session 提供方可以验证已经准入的
维护请求,再为精确选中的文档存储调用绑定新证明。外部 Session 提供方可以在自己的
权威内实现维护,但经 service.call 向另一个外部文档提供方转发此准入证明,目前
尚不支持,会拒绝操作。完整的跨提供方维护链仍需要由宿主中介、绑定声明依赖的权限
收窄契约;同时选中这两个提供方不会产生管理员绕过通道。
导入父状态的子组合还存在直接授权策略路由限制:子图桥接的提供方 ID 不等于原授权的 提供方 ID,因此直接子图策略调用会拒绝操作。产品会话和效果处理器保留父级权威;这并不 代表任意直接子图调用都已支持。详见组合边界。
主动分享/导入复用现有主聊天发送与回执路径。浏览器扩展仅在用户点击时读取当前页, 不读浏览历史;导入 URL 不自动抓取。Android 分享进入 Personal 草稿;iOS 使用单独启用、 短时有效的 App Group 收件箱,仍须回到主聊天主动发送。原生编译、签名、entitlements 和真机验证是独立验收阶段。
共享 MCP 账号
Section titled “共享 MCP 账号”Personal 独立账号连接器及 Calendar OAuth 适配器已移除。在 Coding 中添加全局 MCP 服务,然后在 Personal 输入框选择已连接的服务。原生 Wuu 与支持对话插件的外部引擎使用同一组已启用的共享服务,包括新建后台会话。消息中明确选择服务后,外部引擎只获得所选服务,并重新校验授权。后台任务仍需有效的执行授权和工具策略;共享账号不授予新任务权限,也不绕过权限检查。Personal 本地文件审批不负责 MCP 写操作。
使用同一凭据提供方的宿主通过原子存储的刷新记录协调 OAuth。刷新取消、响应丢失或进程中断后不重试旧令牌;结果不确定时重新连接账号。升级时应重启旧 app-server,因为旧进程不参与这套协调。断开或替换账号后,原授权绑定失效。全局服务被禁用或移除后,Personal 拒绝新的工具调用;已经通过检查的请求可能仍在远端完成。