配置
账号服务属于 OHarness Cloud。客户端只知道它的公开 origin,不知道 Supabase 项目,也不知道 Composio 项目的 API key。
| 位置 | 职责 |
|---|---|
~/.oharness/config.json | 通用运行时偏好:模型、权限、日志、同步 |
~/.oharness/cloud.json | 可选的公开 Cloud 地址:{ "siteUrl": "https://oharness.ai" } |
~/.oharness/plugins.json | { "runtimePlugins": [...] };声明式插件包可选用 plugins |
~/.oharness/mcp.json | { "mcpServers": { ... } };Web 端修改连接器时写入这里 |
| Cloud 部署的环境变量 / 密钥 | Supabase 配置和平台持有的服务密钥 |
| 凭据存储 | 用户登录凭据;不在上面任何一个配置文件里 |
OHARNESS_HOME 会重定向这四个客户端文件。默认使用官方 Cloud origin;自托管或开发环境的覆盖依次是 OHARNESS_SITE_URL、cloud.json、打包内置的公开 origin。只有本机回环地址的开发环境允许用 HTTP。仓库配置不能指定 Cloud origin,也不能加载运行时插件代码。通过编程方式调用 Harness.create({ config, runtimePlugins }) 仍然支持显式传入的配置。
记忆
持久笔记在 config.json(或项目的 oharness.config.json)的 memory 下配置:上限、逐条消息的召回,以及自动提取。项目笔记以 Markdown 形式存放在 <project>/MEMORY/ 下;跨项目的用户笔记存放在 ~/.oharness/memory/user/ 下。同步授权和本机索引仍保留在用户目录。项目配置可以调整召回,或关闭提取,但只有用户自己的配置能开启提取,因为它花的是用户的模型额度。记忆列出了所有设置。
产物
在已注册项目里的会话,会把每个产物保存在 <project>/ARTIFACTS/ 下:最新版本是一个普通文件(ARTIFACTS/blue-field.html),被替换掉的旧版本放在 ARTIFACTS/.versions/<name>/v<N>.<ext>。一个会话可以生成多个产物,每个都是独立文件;其他会话生成的同名产物会加后缀(blue-field-2.html)。在编辑器里修改最上层的文件,面板显示的内容也会跟着变。~/.oharness/storage/artifact/<session>.jsonl 仍然是索引——记录哪个会话生成了什么,以及每个版本的版本号和同步字段——但不包含内容。删除会话会删除索引,项目里的文件保留。不在已注册项目里的会话以及栅格图片,仍像以前一样把内容存在索引里。此前以内联方式记录的内容,会在下次打开该会话时移入项目。
同步
自托管的同步目标和会话凭据只能放在用户的 config.json 里:
{
"sync": {
"url": "https://sync.example.com",
"token": "opaque-session-token",
"enabled": true
}
}
当前的优先级是:用户的 sync.url,然后是 OHARNESS_SYNC_URL,最后是内置的官方目标。仓库配置不能设置 URL、token 或团队,否则克隆下来的仓库就能把会话记录重定向到别处;它只能关闭同步或添加排除项。修改目标后需要重启 OHarness。部署自带的服务见运行你自己的同步服务器,实现兼容的服务见同步协议。
兼容迁移
已有的 config.json 分段只在对应的独立文件不存在时作为后备读取。独立文件一旦存在就以它为准,哪怕插件列表或 MCP 映射是空的。旧版的 account.siteUrl 仍然接受;旧版的 Supabase 字段客户端已不再使用。
npm run config:migrate # Preview filenames only; no secrets printed
npm run config:migrate -- --apply # Back up, split, then clean the old sections
迁移会保留无关的偏好设置,不会覆盖已有的拆分文件。它会保存一份私有的 config.before-split.<id>.json 备份,并最后写入通用配置。文件以原子方式替换,权限为 0600。迁移期间不要同时编辑配置,也不要同时运行多个迁移进程。备份里可能有旧凭据:请妥善保管,验证无误后自行删除。迁移从不修改登录凭据,也不会授权任何应用。
账号传输
浏览器登录仍然使用 Cloud 的 /auth/desktop 和 /api/desktop/exchange。刷新和终端 OTP 后备流程现在使用 /api/desktop/auth/refresh、/otp 和 /verify。重启更新后的客户端之前,先更新 Cloud。旧版 Cloud 会返回明确的错误;客户端不会退回到直接调用 Supabase。
Cloud 使用其配置的认证项目,校验输入,限制请求和响应大小,并且只返回会话字段。token 从不写入日志,也不会出现在错误信息里。请求不会自动重试;响应为 no-store。新获取的凭据会记录其 Cloud origin;origin 变更后,必须重新登录才能刷新。旧版凭据会在第一次成功针对当前受信任的 Cloud 地址刷新时获得这个 origin。
Cloud 端点的速率限制是按进程计算的。生产部署还应在边缘层实施共享的速率限制。网站的 Supabase 设置仍保留在 Cloud 项目中;这次迁移不需要修改数据库结构。
托管的云端连接器把 Composio key 和应用白名单保存在 Cloud。它内置的 connector-cloud 运行时插件会在 Web 聊天中显示授权卡片,并在绑定验证通过后恢复等待中的工具。plugins.json 控制该插件的开关;其中不包含任何平台凭据。