Skip to content

AI 安全模型 ​

AI 与远程桌面结合后可以读取系统状态并协助操作,因此必须建立严格的信任边界。LCXL Remote Desk 把 AI 作为正式控制入口,并用一组必须始终满足的安全规则加以约束。

服务端是唯一可信源 ​

所有授权逻辑均由中心信令服务在服务端校验。请求编号、目标、操作者、适用范围、调用来源、最终风险等级和审批编号等受信字段,都由服务端写入并核对;浏览器、移动端或 MCP 客户端不能自行声明这些字段。整个信任关系建立在连接认证之上,未经认证的转发连接不会被提升为已授权连接。

能力协议面向设备 ​

能力协议描述对设备能做什么,与调用者无关。读权限点由输入派生(OperationInput::capability()),从而杜绝能力、证据采集与审计三者之间的漂移。

中心授权与本地上限 ​

开源信令服务端的中心授权默认采用每次操作均需确认,每台设备仍保留独立的本地执行上限,且本地上限默认保持只给建议。最终采用两者中更严格的设置,因此设备只能收紧中心授权,不能将其放宽。即使提高本地上限,也不会启用无人值守执行:每条命令仍必须经过服务端,并由用户明确确认。

AI 诊断面板与终端 AI 助手 共用同一套确认流程。Assistant 始终只给建议,不会自行执行命令。用户点击“执行”后,确切命令会发送到被控端,由服务端重新判定风险并生成预览;用户再次确认后才会真正执行。该流程还受设备的本地执行上限控制。如果设备保持“只给建议”,执行请求会被拒绝,并提示设备所有者先调整上限。调整后,诊断和终端 AI 助手 都会采用相同设置。

AI助手的范围授权 ​

AI助手显示范围授权申请时,所有者必须逐项批准或拒绝;批准只能减少资源、操作和外发目标,缩短有效期或减少次数。服务端重新检查申请版本、能力契约与当前就绪状态,不能把所有者移除的范围自动补回。精确操作仍绑定服务端冻结的输入;批准只记录授权,不等于派发或执行成功。未实现相应控制链路的服务端不会开放该操作。

对于开源 Signal 的读取,SQLite Prepare/DispatchIntent/outbox 同时构成唯一发送围栏。Signal 在派发前和释放结果前检查已领取调用、当前输入、grant 撤销/到期及 readiness;typed 限额会收窄主机请求并约束完整成功/错误 payload。结果标签绑定已经验证的精确字节,期限不能超过 grant 或所选数据。若 Provider 返回时授权已经变化,终态仍作为已知结果持久化,但正文不交给模型,也不能据此自动重试。

所有者交互式自由命令 ​

命令模板仍是默认的执行条件。只有经过认证的设备所有者操作自己的设备时,中心服务才能授予 OwnerInteractive 权限;开源信令服务中的唯一认证账户就是设备所有者。非所有者、访问码会话、操作共享设备的组织成员、批量运维、自动化、MCP 和原始请求仍然必须使用模板,或保持禁止执行。

非模板的所有者命令不会被视为安全。黑名单只进行尽力而为的宽泛匹配,并不是完整的语义沙箱。因此这类命令一律标为严重风险,完整展示命令解释器、工作目录和超时时间,并提示“仅检查黑名单”。每条命令都必须单独批准;确认按钮不会默认获得焦点,也不能直接按 Enter 触发。模型只能提出请求并等待,不能自行批准。

批准后,中心服务会重新判定风险,并要求命令草稿的每个字段都与预览一致。被控端随后独立检查授权绑定、本地执行上限、黑名单、执行依据和资源限制。工作进程最终只接收已经冻结的程序名和参数列表(program + argv),不会重新解析命令字符串。

在智能体执行流程中,被控端无法直接观察浏览器里的确认操作,只能信任受信中心服务已经消费了一次有效审批。如果中心服务本身被攻陷,审批边界也会随之失守;被控端仍能阻止非受信来源伪造请求,以及命令在传输过程中被篡改。

设备自己的并发上限 ​

被控端设备还会限制同时运行的命令数(ai_policy.max_concurrent_executions,默认 4)。这道限制由设备自己执行,不依赖调用方遵守。

Manager 也会按平台配额调度任务,但这只约束由 Manager 下发的工作。控制端通过开源信令服务器直连设备时并不经过 Manager,因此设备必须保留自己的并发上限,不能依赖中心调度器保证安全。

超过上限的命令会被拒绝且不予受理——它没有被记入设备的执行账本,所以调用方稍后重试会被正常接纳,而不会被误判为一次重复投递。

运行中的命令会自己上报 ​

命令一旦启动,被控端就会主动说明:上报已受理、运行期间周期性上报仍在运行, 并可随时回答关于任一次派发的直接询问。

这取代了原先靠时钟做的推断。此前上游听不到消息时只能猜一条长命令是仍在工作还是已经丢失, 而对一条会改变系统的命令猜错,不是无关紧要的错误。现在沉默不再被解读: 权威答案永远来自被控端自己的持久记录,该记录比写下它的进程活得更久。

被控端若因崩溃而丢失了某次执行的踪迹,它会如实报告不确定,而不是声称失败。 可能已改变系统的命令会被留给人工查看,绝不静默重试。

停止一条命令 ​

运行中的命令可以被停止,而停止会回收整棵进程树——不只是被启动的那一个进程。 命令启动的辅助进程、fork 出的子进程或转入后台的工作,都无法遗留下来继续运行。 由于被控端回收的是容器而非向进程发信号,忽略信号的命令同样会被停止。

每一次停止都会留痕,无论是否生效;留痕归属于经过认证的操作者, 绝不采用请求里自报的名字。

停止是一个请求,不是一个结果。在被控端报告命令自身的结局之前,命令都不被当作已结束, 因此一条已经产生改动的命令被停止后,不会被误报成从未运行过。

Computer Action 执行器接纳 ​

OSS SQLite 的 agent_permission_resume,引用不可变的原决定事件作为续跑领取记录,只存主体与领取元数据,不复制对话正文,也不是新的设备执行队列。新决定、授权、会话变更与 pending 记录原子提交;领取在同一事务核对原决定、输入版本、预检的 session 版本及当前授权记录,再保存 started。readiness 或来源检查拒绝不会续发权限。started 不重置为 pending;原租约过期时沿用既有动作账本恢复,旧候选不能恢复新输入的回合。会话到期清理将续跑记录与事件、授权一起删除;这是逻辑清理,不是取证级擦除。

已确认的会话定时续跑由单实例 Signal 中心扫描与派发,不依赖浏览器保持连接。执行前须确认设备唯一在线、AI 开关开启和当前能力信息有效,并原子领取原会话与运行记录;历史权限只作为上限,模型和工具调用仍检查当前授权。待审批的定时运行使用独立领取入口,批准后继续原输入。重复扫描不会重领已启动的运行;持久化失败可以结算,传输错误或未确认的动作结果不能直接当作失败重试。 若原回合已持久保存成功或失败且动作均已确认终结,中心在原租约过期后只补结算未完成的运行记录,不重新调用模型、派发动作或增加执行次数。旧回合回复、仍在运行的会话和未确认执行状态不能作为终态证据。普通会话保留期回收不会单独结束定时运行;定时会话与对应运行记录按同一恢复流程处理。若会话已保存确切的审批等待位置,重启后会恢复到原请求,不重新询问模型或另建审批;用户已作出的决定仍按当前授权检查后处理。如果原执行租约已过期,且回合尚未产生工具调用、动作记录或待处理审批,中心会把中断回合结算为失败;已请求取消的则记为取消,不累计失败。两者都不自动重跑。存在动作或工具调用时仍需检查原回执。

定时任务的需求文本最多为 16 KiB(按 UTF-8 字节计算),与会话输入上限一致。创建或修改任务时会检查此限制。

在“定时任务”的“自动化任务”页,点击“录制记录与权限”可找回最近一次录制,包括尚未开始、进行中和已取消的记录。已完成录制可查看实际成功使用的权限范围,以及未确认或尚未分类的调用数量;时间按当前显示时区换算。查看和刷新记录不会启动任务,也不会授予后续自动执行权限。

设备在线时,可在此处点击“准备录制”,再点击“进入录制会话”,最后在助手中点击“开始录制”。准备和打开会话不会执行任务。录制使用已保存的任务说明,可能发送消息或修改文件,实际操作仍按当前权限确认;完成后返回此页刷新权限记录。当前录制入口固定首条任务输入,暂不支持追加澄清消息,完成录制也不会自动发布循环任务。

在任务列表点击“运行历史”,可以分页查看定时或手动触发的运行状态、请求/计划/开始/结束时间、取消请求时间及错过次数。时间按当前显示时区换算,刷新会重新读取最新记录;查看历史不会触发执行。运行记录会显示已知的失败或中断原因;原因缺失或不可识别时显示“原因暂不可用”,不会展示原始内部错误。已开始的运行可点击“查看会话”,读取原始会话并标记本次运行首轮的消息,也可加载更早消息。服务端会重新校验访问权限;Manager 中设备转移或删除后,原 owner 不再能读取该设备的会话。打开运行历史或某次会话时,地址栏会保留公开的任务 / 运行标识,可复制为固定链接或添加书签;重新打开时仍会校验当前访问权限。查看本身不会执行或继续任务。当前运行存在待审批请求且任务设备有唯一在线连接时,可在此逐项审阅、收窄权限并批准或拒绝;服务端重新核对当前运行与原审批请求,记录决定后可能继续执行。页面会刷新会话,审批提交成功不代表任务执行成功;响应不确定时先核对最新状态,不自动重发。对账操作尚未提供。

尚未开始的录制可点击“取消未开始的录制”撤销预约,即使设备当前离线也可以取消。已开始的录制不提供此按钮,不能用撤销预约来终止正在执行的操作。

如果已开始的录制在首次调用工具前被取消,服务端核对持久会话与动作记录后,可将任务恢复为草稿,保留本次录制的取消记录。已有工具调用或未决操作的录制需要进一步核对,不会因收到取消结果而自动重新执行。

首轮录制报错且尚无工具调用或动作记录时,服务端可将本次录制记为“录制失败”,把任务恢复为草稿。用户可以重新准备一次录制,旧会话不会被重新启动,也不会因为失败而自动执行下一次。尚未建立持久会话的错误、已调用工具或结果未知的情况仍需进一步核对。

若会话已结束,但服务重启导致录制记录尚未更新,后台会根据保存的会话补齐完成、失败或取消记录。这个恢复过程不会重新调用模型或执行操作;仍有未决动作、运行中的会话或证据不完整的记录会保留待核对。

原生 Computer Action 的定时恢复在同一数据库事务内校验原始派发绑定和设备回执:已完成的动作只回填原结果,有有效后台接收记录的动作继续等待原回执;无法确认结果时保留原动作身份并暂停后续调度,取消请求不能将未知结果改为已取消。恢复不会重发动作或返还已消费的权限额度。尚未提交派发意图的 Provider 候选使用独立的预留记录核对:原始调用、参数摘要、授权与未派发状态一致,且不存在派发队列记录时,才在同一任务结算事务中关闭候选、释放未消费的预留额度;已提交的额度不能按此路径退回。任务结算失败时,关闭和额度释放一起回滚。已冻结命令来源的 exec 使用独立命令身份核对原回合、参数、派发代次和结果。回执与关联动作完成记录参与同一任务结算事务;仍在等待原结果且未过截止时间时保留运行,派发状态无法确认或超过截止时间则记为未知并暂停。普通结果发布器不会单独改写仍在执行的定时会话,即使其租约已经过期。恢复不重发命令,也不增加新的自动续跑。原 exec 投递消费与任务结算一起提交;发布器处理旧快照时会重查消费状态,前台已保存的同一回执不会因消息 ID 不同而再次投递。没有持久动作或命令记录的注册读取/截图工具,若结果未保存,恢复会关闭原调用并标记结果不可用,不声称未执行或已成功;已有读取结果保持原样。写操作、外发操作和未知工具不使用此分支。提示和任务结算一起提交或回滚,恢复不会重新读取。已提交派发意图但尚无命令来源或 Computer Action 绑定的调用,须核对原调用参数、授权主体和已消费的预留记录;未领取或已领取的原队列均在任务结算事务内标记为结果未知,保留 Provider 身份并暂停后续调度,不返还额度或重新派发。无法核实的账本、已有但无法验证的结果仍需各自对账。

当前尚未正式发布,单实例 Signal 不提供历史开发版本 SQLite 数据库的自动迁移。空库会创建当前完整结构;已有库必须与当前 schema 版本一致且结构完整,否则启动明确失败,不会自动删除、重建或修复原数据。不要通过修改数据库版本号绕过校验。权限 grant 统一使用当前格式,旧格式不会被自动转换或重新授权。

worker 在原动作通过预检并取得 writer lease 后,才在 ComputerActionStarted 中设置 executor_accepted=true。缺失字段按 false 解读;旧版 MayHaveStarted、发送成功或等待超时都不是执行器接纳凭据。这一标记只表示执行器已接手,不证明输入已发生、最终成功或重启后可重试动作。daemon/worker 使用二进制 IPC,必须按同构建升级。

共享循环将后台/未知/等待状态标记为中央控制信息,沿用原消息边界,不冒充原始设备结果。带凭据的迟到完成保留原调用、摘要、标签和稳定完成 ID;等待应答与原始结果分别保存,原结果只在保存成功后确认投递。成功接纳或完成投递不等于具备取消能力。

开源 Signal 在发送前,将原有副作用 Computer Action 的计划、连接和模型调用来源冻结到已有 dispatch outbox。只有经过 token 认证的原主机、且 audience、帧 ID、动作和代次全部匹配的明确接纳才会持久保存;重复接纳不延长原时间,也不允许再次发送。浏览器快照和元素等待虽然共用传输,但仍是内联只读调用,不要求写操作结果来源,也不取得后台副作用任务接纳。当前 SQLite 结构包含可空的绑定、接纳与后台化元数据,以及独立 owner 快照序号和缓存列。缺少元数据不构成接纳或外发授权,不能改变执行租约,也不能据此认定动作仍在运行。

对于这些已绑定的副作用动作,完成观察器验证原认证传输身份与冻结计划,在原 work 记录上原子保存有界的类型化原生结果、工具投影和原始回执,再通知前台等待者。结果格式 2 不新增数据库列。首次未知观察保留,真实终态可将其细化;重复投递不刷新时间,冲突终态不能覆盖。恢复、主动等待及完成发布器保留原模型调用身份与标签,不再次派发,也不隐含外发权限。Outlook 助理式交接仍未验证且只能手动发送;Gmail/Slack 交接仍要求精确回读。

后台化要求原接纳和冻结执行策略均有效,且已过前台预算、未到原硬期限;只在同一 outbox 记录元数据,不创建第二个可执行 work 或续发 grant。owner 快照在同一 SQLite 事务内读取会话、授权及新旧任务投影,展示缓存与执行 CAS 分离。崩溃恢复核对原动作,不再因缺少旧命令行就推定“未执行”;完成扫描中一页未完成或损坏记录不会饿死后续原回执。

OSS 原任务取消在同一事务保存请求 ID、原因摘要及原 work 的停止字段;重复请求不更新时间,冲突内容拒绝。原因正文不写入 outbox、不转发。单实例发送器核对冻结的原主机连接、audience、批准者和动作代次,取得 socket 后再次核对,只重试停止帧,直到精确成功的 ComputerActionStateReported 观察或原终态。不会跟随重连、续发执行许可、退还已提交次数,也不会把 socket 写成功当成 ACK。CancelRequested 不是终态;原生 PausedByUser 回执可显示 Cancelled,但不表示已经发出的系统调用被撤销。SQLite 重开、取消/完成竞争及本机 WebSocket ACK 丢失测试已覆盖此链路;完整移动恢复与其它 Provider 仍分别验收。

无工具的自动解释复用前台严格模型出站与审计校验。发送动作前,原绑定冻结已选择的来源、精确模型目标和上下文/策略摘要,期限不超过五分钟及更早的附件/授权范围到期时间;完成时不能事后补造该许可。模型 I/O 前重新核对主体、原回执、输入/链、上下文/策略、模型 revision 和到期时间。Secret 或无效字节仍不可外发,模型投影不覆盖原始回执标签;若 replay/保留过滤已移除原结果,则不调用模型生成未见结果的解释。即使不能自动解释,owner 仍可查看原结果。

模型上下文过滤为历史回合预留 60 秒的保留期余量。当前回合的观察按实际到期时间校验,不因剩余有效期较短而移除;当前输入已过期时,拒绝调用模型。请求和响应检查保持原到期时间,上下文压缩不会延长有效期。

空闲会话到期时,会话及其动作结果、派发绑定、授权预留、授权、运行事件和旧命令记录在同一事务内清理;事务内复核到期与空闲条件,任一删除失败则整批会话回滚。迟到结果不能重建已删除的原工作记录。这是数据库逻辑清理,不承诺 SQLite 文件、备份或存储介质上的取证级擦除。

快照读取和后台任务停止可通过快照或历史返回的原始不透明 sessionId 恢复离线目标。它只定位原 actor/device 会话,store 仍验证该主体及持久状态;已知非主机连接会被拒绝。恢复不授权新回合、不签发权限,也不将停止迁移到新连接。移动端前台轮询和重复停止拦截不等于进程重建或真机生命周期验收通过。

脱敏失败即中止 ​

流水线按 采集 → 脱敏 → 模型 → 渲染 运行。采集与脱敏在被控端设备上进行;模型调用在中心进行。若脱敏失败,被控端返回错误,中心大脑在调用模型之前中止。证据(原始截图字节已剥离)在离开主机或到达模型前一定已脱敏。

API 密钥只保存在服务端 ​

AI 模型 API 密钥存放在中心信令服务器,不会保存到被控端设备上,也不会回传浏览器、进入公开设置数据或写入日志。

审计只记元数据 ​

审计只记录不含原文的摘要,例如计数、大小、模型 Token 用量、模型服务商和适配器。原始提示词、模型输出和截图不会进入审计记录。这与用于恢复、受访问控制和保留策略约束的会话及执行结果存储不同。

MCP 只读 ​

MCP 工具集是静态白名单,从构造上就没有执行 / 写入 / 控制类工具(“未定义即不可达”)。也没有诊断工具:MCP 只暴露只读上下文,从不进行模型推理或屏幕采集。见 MCP 服务页。

模型无关 ​

不同模型服务的接口协议由中心服务的适配器统一处理,包括 OpenAI 兼容接口和 Anthropic Messages。接入新服务商时只需增加适配器,不必修改诊断编排器。

工具续调所需的服务商推理状态只以不透明、绑定来源的 replay envelope 保存,绝不进入 transcript DTO、审计正文、安全审核 prompt 或日志。若 replay 已不可用,或来源端点/协议/模型 revision 不一致,系统会从“发送给模型的上下文”中省略受影响的完整工具组,不重建也不只发送半组;用户可见对话保持不变。

AI 交互披露 ​

AI 诊断面板与终端 AI 助手 面板会在每个会话的首次交互起,明确告知你正在与 AI 助手交互。该提示是各面板顶部的常驻元素——绝非一次性、可关闭的横幅——并与另一条准确性提示(“AI 可能会出错”)清晰区分开。这让 AI 的身份被显式告知,而不只是靠命名暗示。

AI 生成内容标注 ​

AI 输出会携带机器可读的来源信息,并在界面上显示「AI 生成」标记。是否显示标记取决于内容本身是否由 AI 生成,而不是来源信息是否完整;即使来源信息缺失,AI 内容也不会被误标为普通内容。来源信息可用时,会记录生成模型和生成时间。

这覆盖所有展示模型文本的界面:诊断结论、终端 AI 助手 回答、内联命令补全,以及供应商连通性测试的回复片段。模型生成的命令建议是新生成的输出、而非对你已输入内容的辅助编辑,因此会被标注;而补全那条来自你自己近期历史的零延迟本地猜测并非 AI 生成,不作标注。

授权后继续执行 ​

授权后的继续执行会保留其他仍有效的已授权工具,以支持先创建文件、再执行命令等前置依赖。精确入参授权仍要求匹配已批准的入参;每次实际调用仍校验授权范围、有效期和剩余次数。

AI 助手的提示词缓存 ​

助手把固定规则和有界工具定义放在稳定前缀,把本次授权、目录、时钟和能力状态放在历史之后。当前状态不会作为旧快照不断写入会话;图片替换、附件读取记录和上下文压缩仍按原规则执行。工具参数说明可以在授权耗尽后保留,但每次调用仍独立检查当前权限、资源范围、设备就绪状态并预留次数。看到工具不代表可以执行。

Anthropic Messages 的模型高级配置新增“提示词缓存”。默认使用网关自身行为,不额外发送缓存参数。只有验证目标网关支持内容块缓存后才启用“显式缓存提示”;“同时标记对话历史”默认关闭。等价高级请求选项如下,prompt_cache 是应用内部配置,不会作为同名字段发送给网关:

json
{"prompt_cache":{"mode":"anthropic_explicit","cache_history":false}}

启用后使用静态内容块断点;开启历史选项后只标记当前状态之前的合法历史块。缓存写入可能额外收费,供应商可能保留缓存输入,命中不保证。更换连接、模型或思考配置后重新验证并开启历史选项。不会自动开启 beta、修改 thinking 重放或遇到任意 400 就换协议重试。

本地仅保存有界的带密钥摘要和边界位置,不保存另一份请求正文;摘要缺失或失效只影响缓存优化。缓存 token 仍占上下文,不能抵扣上下文预算。OpenAI / DeepSeek 的缓存读取从总输入中扣除一次,Anthropic 的缓存读写单独统计;供应商计数矛盾时记为未知,不伪造零消耗。请求投影的公共前缀长度只是本地观测,不等于供应商已命中的 token 数。