BitFun 存储路径清单
本文记录 BitFun 当前各产品表面的存储路径、数据边界和路径覆盖规则。内容以本仓库当前实现为准。当前 HarmonyOS PC 定制构建的主路径恢复为应用沙箱路径;与上游 D:\workspace\wc\github\BitFun 的 main 分支存在明确的平台差异。
本文中的“路径”分为两类:
- 物理路径:由操作系统、Tauri、浏览器或 HarmonyOS 分配的真实目录。
- 逻辑路径:BitFun 在其数据根下定义的稳定目录和文件名,例如
projects/<workspace-slug>/sessions。
除特别说明外,下面的路径均为模板,不代表某个用户机器上的固定绝对路径。
1. 统一路径模型
桌面和 CLI 的主路径由 PathManager 提供:
| 符号 | 默认值 | 作用 | 覆盖变量 |
|---|---|---|---|
U |
/data/storage/el2/base/files/bitfun |
用户配置、缓存、模型、日志、临时文件 | 当前实现不覆盖 |
H |
dirs::home_dir()/.bitfun |
助手工作区、跨工作区运行时、远程镜像、派发任务 | BITFUN_HOME、BITFUN_E2E_HOME |
P |
<workspace>/.bitfun |
项目级配置、规则、插件和搜索索引 | 无 |
R |
H/projects/<workspace-slug> |
工作区级会话、计划、快照和插件信任 | 间接受 H 影响 |
当前定制构建默认值:
U = /data/storage/el2/base/files/bitfun
H = dirs::home_dir()/.bitfun
当前构建仅将 U 固定到应用沙箱路径;H 仍保持跨平台实现,并支持 BITFUN_HOME / BITFUN_E2E_HOME 覆盖。BITFUN_USER_ROOT / BITFUN_E2E_USER_ROOT 当前不会改写 U,相关 E2E 隔离逻辑需要后续单独校正。
2. 用户配置根 U
U/
├── config/
│ ├── app.json
│ ├── hooks.json
│ └── logs/
├── agents/
├── cache/
│ └── model-downloads/
│ └── speech/
├── data/
│ ├── models/
│ │ └── speech/<model_id>/<version>/
│ ├── memories/
│ │ └── memories.sqlite
│ ├── agent-runtime/
│ │ ├── coordination.sqlite
│ │ └── ownership/
│ ├── cron/
│ │ └── jobs.json
│ ├── miniapps/
│ │ └── <app_id>/
│ ├── rules/
│ └── plugins/
├── runtimes/
└── temp/
└── speech-input/
| 路径 | 生命周期 | 说明 |
|---|---|---|
U/config |
长期 | 应用配置、用户 Hook 和日志 |
U/agents |
长期 | 用户级 Agent 内容 |
U/cache |
可清理 | 托管模型下载等缓存;不应作为唯一数据副本 |
U/data/models |
长期 | 跨工作区共享的模型资源 |
U/data/memories |
长期 | 用户记忆 SQLite 数据库 |
U/data/agent-runtime |
运行时及可恢复状态 | Agent 协调数据库和进程归属锁 |
U/data/cron |
长期 | 定时任务定义 |
U/data/miniapps |
长期 | 用户 MiniApp 数据 |
U/data/rules、U/data/plugins |
长期 | 用户级规则和插件包 |
U/runtimes |
长期、可升级 | BitFun 管理的 Node/Python/Office 等运行时 |
U/temp |
临时 | 语音输入分片等短期文件 |
路径 owner 主要是 PathManager 以及 services 层对应的持久化模块。清理逻辑必须区分 cache/temp 与用户数据,不能用“删除整个 U”恢复错误状态。
2.1 技能目录例外
PathManager::user_skills_dir() 当前仍直接根据 dirs::data_dir()、dirs::data_local_dir() 和平台条件计算:
Windows: dirs::data_dir()/BitFun/skills/
macOS: ~/Library/Application Support/BitFun/skills/
Linux: dirs::data_local_dir()/BitFun/skills/
因此它不一定落在 U 下,也不能完全通过 BITFUN_USER_ROOT 隔离。内置技能位于该目录的 .system/ 子目录。
3. 助手根 H
H/
├── personal_assistant/
│ ├── workspace/
│ └── workspace-<assistant_id>/
├── projects/
│ └── <workspace-slug>/
│ ├── sessions/
│ ├── plans/
│ ├── snapshots/
│ └── plugin-runtime/
│ └── <path_digest>/
│ └── trust.json
├── worktrees/
├── memories/
├── remote_ssh/
├── dispatch/
├── account_session.enc
├── account_session.key
├── device_identity.json
└── ...
说明:
personal_assistant/workspace是默认助手工作区。personal_assistant/workspace-<assistant_id>是命名助手工作区。- 旧版本的
H/workspace和H/workspace-<assistant_id>仍需兼容读取,不能直接删除。 projects/<workspace-slug>是工作区运行时根,slug 由规范化工作区路径生成。plugin-runtime/<path_digest>/trust.json保存工作区插件信任状态。worktrees是 BitFun 管理的 Git worktree 根。memories是助手级记忆工作区;SQLite 主库位于U/data/memories。remote_ssh保存远程 SSH 工作区对应的本地会话镜像。dispatch是 Detached Dispatch 控制端的持久化根。account_session.*和device_identity.json属于账户/设备身份材料,必须按密钥文件的权限要求保护。
4. 项目根 P
对工作区 <workspace>,项目路径为 <workspace>/.bitfun:
<workspace>/.bitfun/
├── config/
│ ├── agent_profiles.json
│ ├── tool_permissions.json
│ ├── mode_skills.json
│ ├── agent_subagents.json
│ └── hooks.json
├── agents/
├── rules/
├── plugins/
├── search/
│ └── flashgrep-index/
│ ├── base-snapshot/
│ └── workspace-overlay/
├── computer_use_debug/
└── tmp/
| 路径 | 生命周期 | 是否应提交到项目 Git |
|---|---|---|
.bitfun/config |
长期 | 取决于项目策略;可能包含用户本地设置 |
.bitfun/agents |
长期 | 取决于项目是否共享 Agent |
.bitfun/rules |
长期 | 可作为项目规则共享 |
.bitfun/plugins |
长期 | 取决于插件来源和安全策略 |
.bitfun/search/flashgrep-index |
可重建缓存 | 通常不应提交 |
.bitfun/computer_use_debug |
调试期 | 通常不应提交 |
.bitfun/tmp |
临时 | 不应提交 |
项目路径不应被替换为控制端本地路径。远程工作区必须在实际执行端使用其自己的项目根和临时目录。
5. 项目运行时和 Session
项目运行时根:
R = H/projects/<workspace-slug>/
由 SessionStorageLayout 管理的会话结构如下:
R/sessions/
├── index.json
└── <session_id>/
├── metadata.json
├── state.json
├── prompt_cache.json
├── turn-catalog.json
├── request-traces/
│ └── request-000001.json
├── turns/
│ └── turn-0000.json
├── snapshots/
│ ├── context-0000.json
│ ├── skill-agent-0000.json
│ └── skill-agent-baseline-override.json
└── artifacts/
├── transcript.txt
├── transcript.meta.json
├── compression-transcripts/
└── session-references/
文件职责:
metadata.json、state.json:会话元数据和可恢复状态。prompt_cache.json:会话级提示缓存保护状态。turn-catalog.json、turns/:Turn 索引及逐 Turn 持久化内容。request-traces/:请求级诊断记录。snapshots/:上下文和 Skill Agent 快照。artifacts/:转录、压缩转录、引用会话的只读副本及用户可下载产物。
Session 是长期用户数据。解析失败、凭据缺失、远端离线或断开连接都不能触发静默删除;应保留目录并返回可诊断状态。
6. 远程 SSH 工作区
远程工作区的本地会话镜像约定为:
H/remote_ssh/<sanitized-host>/<remote-path-segments>/sessions/<session_id>/
远程路径必须使用 POSIX 语义。Windows 控制端不能用 std::path 的 Windows 分隔符替代远程路径,也不能把控制端工作区路径直接传给远端。
6.1 SSH 连接配置的未统一路径
Desktop/Server 的 SSH 管理器当前仍使用另一套目录:
dirs::data_local_dir()/BitFun/ssh/
├── ssh_connections.json
├── known_hosts
└── remote_workspace.json
Desktop E2E 场景可能使用 U/ssh/。这部分尚未完全收敛到 PathManager,因此迁移或清理用户数据时必须同时检查两套位置。
7. Detached Dispatch
控制端的派发根为:
H/dispatch/
├── outbound/
├── repos/
├── worktrees/
├── jobs/
└── ...
目标端 job store 的逻辑结构为:
<dispatch_root>/
├── jobs/<job_id>/
│ ├── job.json
│ ├── state
│ ├── events.ndjson
│ ├── events.meta.json
│ ├── permissions/
│ ├── messages/
│ └── turns/
├── repos/
├── worktrees/
└── workspaces/
目标端拥有任务、会话、worktree、事件日志和权限邮箱。控制端只是提交者和观察者,不能假定控制端仍在线,也不能把控制端文件系统当成目标端工作区。
8. Desktop WebView 和 Web UI
8.1 Tauri 原生恢复文件
Desktop WebView 恢复状态使用:
app.path().app_data_dir()/webview-recovery.json
owner:webview_recovery.rs。这是 WebView 恢复用途的短期持久化文件,不等同于 U/config 或 Session 目录。
8.2 浏览器存储
Web UI 运行在 WebView 浏览器沙箱中,使用以下存储:
localStorage:更新提示、模型配置、UI 偏好、待发送队列、Review/设置偏好等。sessionStorage:当前页面恢复标记、导航状态、临时模式选择等。- IndexedDB:数据库
bitfun-appearance,object stores 为packages和catalog。
IndexedDB owner:AppearanceStorage.ts。这些数据不经过 Rust PathManager,也不受统一的文件清理和 E2E 根目录控制;清除 WebView 站点数据会使其丢失。
9. Mobile Web
Mobile Web 使用浏览器 localStorage,典型键包括:
bitfun-mobile-language
bitfun-mobile-theme
bitfun.mobile.install_id
bitfun.mobile.user_id
bitfun.mobile.failure_count
bitfun.mobile.lock_until
bitfun.mobile.last_selected_model_id
主要 owner:
这些键属于浏览器站点,不属于 Desktop/CLI 的 U 或 H。浏览器站点清理、隐私模式或设备更换都会导致其丢失。
10. HarmonyOS
HarmonyOS Mobile 使用应用沙箱中的 ArkData;真实物理目录由系统分配,BitFun 只持有逻辑名称和 URI 转换规则。
10.1 Preferences
bitfun_remote_identity
bitfun_cloud_account
bitfun_general_chat_config
bitfun_app_locale
10.2 RelationalStore
bitfun_remote_chat.db
bitfun_remote_sessions.db
bitfun_general_chat.db
当前代码中涉及的 URI/路径转换前缀:
/storage/Users/currentUser/appdata
/data/storage
file://docs/storage/Users/currentUser
相关代码入口:
路径常量和转换逻辑可能由其他 HarmonyOS 模块或生成产物提供;新增实现时应集中到一个明确的平台适配器,并补充源码级契约测试。
HarmonyOS 的 URI 转换目前存在多处实现,后续应集中到一个平台适配器,避免不同模块把同一逻辑路径映射到不同物理目录。
11. Relay Server
默认配置:
静态资源目录:由 RELAY_STATIC_DIR 指定
Room Web 目录:/tmp/bitfun-room-web
Page 数据:<room_web_dir>/page-data/
账户数据库:由 RELAY_DB_PATH 指定,未设置时不启用账户功能
Docker Compose 默认值:
/app/static
/app/room-web
/app/data/bitfun_relay.db
Docker volumes:
relay-server_room-web
relay-server_relay-db
相关 owner:
/tmp/bitfun-room-web 是非持久化默认值;生产部署应显式设置 RELAY_ROOM_WEB_DIR 和 RELAY_DB_PATH 到持久化卷。RELAY_DB_PATH 未设置时,Relay 只提供房间配对和桥接,不提供账户、设备路由和同步数据库。
12. 路径统一性和迁移注意事项
当前仍绕过或部分绕过 PathManager 的位置:
| 优先级 | 位置 | 风险 |
|---|---|---|
| 高 | user_skills_dir() 使用 dirs::* |
E2E 隔离、备份和清理无法覆盖全部技能数据 |
| 高 | Desktop/Server SSH 使用 data_local_dir()/BitFun/ssh |
SSH 配置与其他用户数据分散 |
| 中 | 部分 Remote Connect 代码直接拼接 home_dir()/.bitfun |
BITFUN_HOME 覆盖可能不完整 |
| 中 | WebView local/session storage 与 IndexedDB | 不受 Rust 存储统计、迁移和清理控制 |
| 中 | Relay 默认 /tmp/bitfun-room-web |
重启或系统清理可能丢失 page data |
| 中 | HarmonyOS URI 转换重复 | 逻辑路径与物理路径可能不一致 |
| 低 | OHOS Desktop 隐私/反馈固定 /data/storage/... |
仅平台适配层,不能作为跨平台规范 |
| 低 | 旧助手工作区路径 | 升级时不能删除旧目录或强制改写引用 |
建议的后续收敛顺序:
- 把技能目录和 SSH 配置路径纳入
PathManager,保留旧路径只读迁移和兼容读取。 - 清点所有
dirs::home_dir()、dirs::data_*()和.join(".bitfun")调用,改为注入PathManager或明确的平台 adapter。 - 为 WebView/移动端存储建立命名空间、版本号和导出/清除策略;不要把浏览器键值假设成 Rust 文件已持久化。
- Relay 生产配置禁止使用
/tmp作为 page data 根,部署检查应要求显式持久化路径。 - 合并 HarmonyOS URI 转换实现,并为
/storage/Users/currentUser/appdata与/data/storage建立转换契约测试。
13. 变更检查清单
新增或修改存储路径时,至少检查:
- 是否属于
U、H、P、R中的某一层;如果不属于,是否有明确的 owner 和理由。 - 是否支持
BITFUN_USER_ROOT/BITFUN_HOME的 E2E 隔离。 - 是否区分长期数据、缓存、临时文件和密钥材料。
- 是否影响 Remote workspace、Remote control、Peer Device Mode 或 Detached Dispatch。
- 是否需要旧路径读取、字段默认值和迁移测试。
- 是否在对应模块的
AGENTS.md要求的范围内完成验证。