原则定义#
Local-first 表示:Mira 的基础工作状态优先由用户自己的设备持有,外部服务作为可配置依赖接入,而不是成为产品唯一运行真相。
本地优先不等于完全离线,也不等于所有模型和工具必须在本机运行。
适用范围#
该原则适用于:
- 对话、线程与消息;
- Provider 和模型配置;
- 知识库、索引与评测记录;
- 角色与提示词原型;
- AgentRun、Evidence、审批与 Trace;
- MicroApp 配置、任务状态和本地产物;
- 桌面运行时和用户工作目录。
数据边界#
| 数据类型 | 默认位置 | 外部传输条件 |
|---|---|---|
| 应用配置 | 本地 SQLite | 用户显式同步或远端配置接口 |
| 对话与任务状态 | 本地数据库 | 调用远端模型时发送必要上下文 |
| 知识文档与索引 | 本地文件 / 数据库 | 用户选择远端解析、Embedding 或模型调用时 |
| Tool / Agent Trace | 本地运行记录 | 明确启用远端观测或集成时 |
| Artifact | 本地受管目录 | 用户主动上传、分享或调用外部服务时 |
| Secret | 后端凭据边界 | 仅注入目标连接,不进入模型正文和普通日志 |
外部调用必须遵守最小必要原则。不能因为配置了一个 Provider,就默认上传全部对话、知识库或工作区文件。
运行边界#
Mira 当前基础路径为:
Desktop Renderer
→ Desktop Shell
→ Local Fastify Backend
→ SQLite / Local Runtime / Local Artifact以下能力可以位于外部:
- 云端模型 Provider;
- External MCP Server;
- 企业微信等平台;
- 用户已登录的外部专家网页;
- ComfyUI、GPT-SoVITS 等本机独立服务;
- 其他显式配置的 API。
外部能力不可自动成为本地状态的唯一持有者。
可退出性要求#
本地优先至少需要满足:
- 用户可以确认数据存储位置;
- 外部连接可以单独停用或移除;
- 配置和失败状态可见;
- Provider 变化不会使基础工作区不可启动;
- 本地数据可以备份和迁移;
- 远端调用失败时,系统返回明确错误或降级状态;
- 用户可以重新取得执行控制权。
外部连接要求#
接入外部能力时必须区分:
已配置
!= 已连接
!= 当前可用
!= 已获得 Agent Access
!= 已批准本次调用MCP、GitHub、邮箱、企业集成和外部专家均应分别维护连接状态、可用性和调用权限。
工程影响#
Local-first 带来以下工程责任:
- 桌面打包与升级;
- SQLite Schema 与迁移;
- 跨进程通信边界;
- 本地 Runtime 发现和安装;
- Artifact 生命周期;
- 离线、超时和远端服务不可用处理;
- 多平台路径差异;
- 数据备份与恢复。
这些成本不能通过把所有状态迁移到云端来静默规避。
非目标#
本地优先不承诺:
- 所有模型都能离线运行;
- 所有外部能力都有本地替代;
- 当前已经完成跨设备同步;
- 本地运行天然等于强隔离 Sandbox;
- 用户不需要理解任何外部传输。
验证问题#
评审涉及数据或连接的功能时,应回答:
- 状态由谁持有?
- 哪些数据会离开设备?
- 外部服务不可用时发生什么?
- Secret 是否进入模型、Evidence 或日志?
- 用户如何停用、迁移或删除?
- 连接是否被错误地等同于授权?