持久化
MadoHub 保存什么、保存到哪里,以及如何保存。
MadoHub 会将你的工作空间状态持久化到磁盘,因此在你重新启动应用时,所有内容都会恢复。所有持久化的工作区数据都保存在本地设备上。
存储位置
所有文件都保存在 ~/.madohub/ 中:
~/.madohub/
├── canvas-state.json # 完整画布状态
├── config.json # 应用配置
├── chat-history.json # 聊天消息历史
├── memory-policies.json # 内存自动注入策略
├── templates/
│ └── <slug>.json # 每个已保存的工作空间模板对应一个文件
├── flows/
│ └── <id>.json # 每个已保存的 flow 对应一个文件
├── logs/
│ └── madohub.log # 应用日志
├── notifications/ # Stop hook 完成标记
└── orchestrator/ # Orchestrator 模式状态保存内容
画布状态 (canvas-state.json)
| 数据 | 说明 |
|---|---|
| Tiles | 类型、位置、大小、z-index、文件路径、工作目录 |
| Frames | 工作空间路径、颜色、位置 |
| Viewport | 平移偏移(X/Y)和缩放级别 |
| Connections | 所有路由连接及其触发/转换配置 |
| Settings | API provider、key、model;通知 hook 状态 |
| Max z-index | 新图块的层级顺序 |
| Dismissed sessions | 已隐藏的 tmux 会话 |
应用配置 (config.json)
| 数据 | 说明 |
|---|---|
| Hooks state | Claude Code 通知 hook 是否已启用 |
| Workspaces(遗留,已失效) | 配置 schema 中仍定义了已注册项目目录列表和当前激活工作空间 ID,但没有任何前端代码路径会调用它们的保存/加载函数,因此这部分已经是死代码。每个项目状态现在实际的载体是 frame,保存在 canvas-state.json 中。 |
保存方式
- 自动保存:在任何画布、连接或设置变更时触发。
- 防抖:延迟 500ms 以合并快速连续的更改。
- 原子写入:数据先写入一个唯一的同级文件(
<name>.tmp.<pid>.<seq>),再重命名到目标位置。这样即使应用在写入中途崩溃,也能避免损坏数据。 - 损坏恢复:如果某个文件在加载时解析 JSON 失败,其原始字节会被隔离到一个内容寻址的同级文件
<name>.corrupt.<hash>(在多次重启间保持稳定),随后加载会回退到默认值,而不是直接失败。
不会保存的内容
- 终端会话内容(PTY 输出是临时的)
- 剪贴板内容