Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion AGENTS-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ Stable Contracts and Security Control Plane 的边界以
|---|---|---|---|---|---|
| 1 | 接口与入口层 | `src/apps/*`, `src/web-ui`, `src/mobile-web`, `OpenBitFun-Installer`, `tests/e2e`, `src/crates/interfaces` | 产品宿主、命令、UI 入口、协议接口和跨形态测试 | desktop、CLI、server、relay、Web UI、mobile web、installer、E2E、`acp`、`sdk-host` | 最近的本地 `AGENTS.md`;[interfaces](src/crates/interfaces/AGENTS.md) |
| 2 | 产品组装层 | `src/crates/assembly` | 兼容导出、产品能力选择、product-full 接线、不可变内置 Agent 内容、adapter/service 注册和生态无关的来源协调 | `agent-content`, `core`, `external-sources`, `product-capabilities` | [AGENTS.md](src/crates/assembly/AGENTS.md) |
| 3 | 适配层 | `src/crates/adapters` | AI/transport/WebDriver 协议 adapter、外部 AI work source adapter(OpenCode/Claude Code/Codex)和外部 provider 转换 | `agent-runtime-ipc`、`ai-adapters`, `opencode-adapter`, `claude-code-adapter`, `codex-adapter`, `static-hook-support`, `transport`, `webdriver` | [AGENTS.md](src/crates/adapters/AGENTS.md) |
| 3 | 适配层 | `src/crates/adapters` | AI/transport/WebDriver 协议 adapter、外部 AI work source adapter(OpenCode/Claude Code/Codex/Zcode)和外部 provider 转换 | `agent-runtime-ipc`、`ai-adapters`, `opencode-adapter`, `claude-code-adapter`, `codex-adapter`, `zcode-adapter`, `static-hook-support`, `transport`, `webdriver` | [AGENTS.md](src/crates/adapters/AGENTS.md) |
| 4 | 服务实现层 | `src/crates/services` | 可复用 OS、filesystem、terminal、MCP、remote、git、watch、process、session persistence primitives、network 和 MiniApp runtime IO 实现 | `services-core`, `services-integrations`, `relay-service`, `page-function-runtime`, `terminal` | [AGENTS.md](src/crates/services/AGENTS.md) |
| 5 | 执行原语层 | `src/crates/execution` | 可移植 Agent Runtime、命名工作流策略、stream、插件运行时客户端、typed-service、tool-contract、tool-group 和 tool-execution 构件 | `agent-runtime`, `agent-workflows`, `agent-stream`, `tool-contracts`, `plugin-runtime-client`, `runtime-services`, `tool-provider-groups`, `tool-execution` | [AGENTS.md](src/crates/execution/AGENTS.md) |
| 6 | 稳定契约与产品领域层 | `src/crates/contracts` | 跨层共享 DTO、事件形状、runtime port、产品领域契约和策略 | `core-types`, `events`, `runtime-ports`, `product-domains` | [AGENTS.md](src/crates/contracts/AGENTS.md) |
Expand Down
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ Keep crate dependencies inside each layer to the smallest set needed.
|---|---|---|---|---|---|
| 1 | Interfaces and entrypoints | `src/apps/*`, `src/web-ui`, `src/mobile-web`, `OpenBitFun-Installer`, `tests/e2e`, `src/crates/interfaces` | Product hosts, commands, UI entrypoints, protocol interfaces, and cross-surface tests | desktop, CLI, server, relay, Web UI, mobile web, installer, E2E, `acp`, `app-server`, `sdk-host` | nearest local `AGENTS.md`; [interfaces](src/crates/interfaces/AGENTS.md) |
| 2 | Product assembly | `src/crates/assembly` | Compatibility exports, product capability selection, product-full wiring, immutable built-in Agent content, adapter/service registration, and ecosystem-neutral source coordination | `agent-content`, `core`, `external-sources`, `product-capabilities` | [AGENTS.md](src/crates/assembly/AGENTS.md) |
| 3 | Adapters | `src/crates/adapters` | AI/transport/WebDriver protocol adapters, external AI work source adapters (OpenCode/Claude Code/Codex), and external-provider translation | `agent-runtime-ipc`, `ai-adapters`, `opencode-adapter`, `claude-code-adapter`, `codex-adapter`, `static-hook-support`, `transport`, `webdriver` | [AGENTS.md](src/crates/adapters/AGENTS.md) |
| 3 | Adapters | `src/crates/adapters` | AI/transport/WebDriver protocol adapters, external AI work source adapters (OpenCode/Claude Code/Codex/Zcode), and external-provider translation | `agent-runtime-ipc`, `ai-adapters`, `opencode-adapter`, `claude-code-adapter`, `codex-adapter`, `zcode-adapter`, `static-hook-support`, `transport`, `webdriver` | [AGENTS.md](src/crates/adapters/AGENTS.md) |
| 4 | Services | `src/crates/services` | Reusable OS, filesystem, terminal, MCP, remote, git, watch, process, session persistence primitives, MiniApp runtime IO, and network implementations | `services-core`, `services-integrations`, `miniapp-market-service`, `relay-service`, `page-function-runtime`, `terminal` | [AGENTS.md](src/crates/services/AGENTS.md) |
| 5 | Execution primitives | `src/crates/execution` | Portable Agent Runtime, named-workflow policy, stream, plugin runtime client, typed-service, tool-contract, tool-group, and tool-execution building blocks | `agent-runtime`, `agent-workflows`, `agent-stream`, `tool-contracts`, `plugin-runtime-client`, `runtime-services`, `tool-provider-groups`, `tool-execution` | [AGENTS.md](src/crates/execution/AGENTS.md) |
| 6 | Stable contracts and product domains | `src/crates/contracts` | Shared DTOs, event shapes, runtime ports, and product domain contracts/policies | `core-types`, `events`, `runtime-ports`, `product-domains` | [AGENTS.md](src/crates/contracts/AGENTS.md) |
Expand Down
16 changes: 16 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ members = [
"src/crates/adapters/opencode-plugin-host",
"src/crates/adapters/claude-code-adapter",
"src/crates/adapters/codex-adapter",
"src/crates/adapters/zcode-adapter",
"src/crates/adapters/static-hook-support",
"src/crates/adapters/webdriver",
"src/crates/adapters/transport",
Expand Down
78 changes: 78 additions & 0 deletions docs/architecture/extensions/external-ai-work-sources-design.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ Codex 与 DeepSeek Harness 中受支持的安全声明,并在用户显式确

| 内容与生态 | 此页发现范围 | 原生副本导入 | 使用与限制 |
|---|---|---|---|
| Session:Codex、Zcode | 本地 Desktop 按工作区自动发现已保存会话 | 打开来源时刷新只读历史,首次发送创建独立原生分支;可移除和重新添加来源 | Zcode 读取本地 SQLite 主任务历史;Remote workspace、Peer、IM 和 Detached Dispatch 的来源续聊入口未提供 |
| Skill:Claude Code、Codex、OpenCode、Pi、DSH | 已接入各自受支持目录/文件子集;不代表完整包或动态配置解析 | 本地 Desktop 可复制受支持格式;按主机导入版本保留旧格式路径 | 未导入外部 Skill 不进入原生运行目录;导入后由 Skill owner 选择 |
| MCP:Claude Code、Codex、OpenCode、DSH | 已接入安全声明子集;Pi 没有 provider | 本地 Desktop、根 CLI 可规划并复制;副本默认禁用 | 原生连接状态由 MCP owner 确认;前三类另有持续兼容路径,DSH 发现不意味着 DSH 持续运行兼容 |
| Hook:五种生态 | 静态来源和事件声明 | 仅 Claude Code/Codex 的受支持同步 command,经审阅导入 | 目录本身不执行;原生 Hook 仍受开关控制;Pi/DSH/OpenCode 目录只读 |
Expand All @@ -70,6 +71,83 @@ MCP 副本的连接状态不借用外部来源 activation,页面明确“尚
其中远程工作区和 Peer 为前端能力门禁模拟,不是 SSH、IM、Peer 或 Detached Dispatch 端到端证据;手工步骤见
[Web UI 使用说明](../../../src/web-ui/README.zh-CN.md#外部导入状态检查)。

### Zcode 会话来源与原生副本

`adapters/zcode-adapter` 独立读取 `~/.zcode/cli/db/db.sqlite` 的 `session`、`message`、`part`。
格式基线是 Zcode 3.15.1 所附 CLI 0.16.9 的本地记录。SQLite 只读事务包含已提交的 WAL 数据,
不复制正在写入的数据库主文件,不读取凭据,也不从 `model-io-*.jsonl` 请求日志重建历史。
不存在的数据库返回空目录;权限、损坏或缺少必要列返回明确错误,不修改或重建来源。
旧记录缺少 `sequence` 时按时间和 ID 排序,未知可选列保留兼容。

仅列出 `parent_id IS NULL` 的主任务。隐藏的继承上下文、系统和 Todo 提醒不生成用户轮次;
可见消息按 `parentID` 归入原始用户输入,工具参数、结果和失败状态作为非执行历史保留。
进行中的工具保留中断状态。附件仅保留名称引用,并返回和持久化导入提示;不复制来源附件文件。
不支持的消息角色、工具状态、损坏记录和超出读取预算的历史明确失败,不以空历史伪装成功。

产品装配按来源选择 Codex 或 Zcode reader,复用工作区映射、原子写入及 Session owner;
续聊分支使用宿主当前配置的主模型。来源生态与 Session ID 共同参与匹配,避免跨生态混认。
本功能开发阶段的手动列表、计划、执行和取消命令已随旧界面移除;当前入口使用原生会话列表、
历史读取和分叉协议。已有手动导入副本、旧索引及历史修复路径继续兼容,不删除用户数据。
Zcode 会话读取不意味着其 ACP 运行时、设置、Skill、MCP 或 Hook 已接入,其余类别仍显示真实支持状态。

会话自动发现由 `app.external_session_discovery` 按来源选择,默认全部关闭。生态兼容页提供
各来源开关;工作区打开或启动后的原生会话列表首次读取时,由服务主机在后台扫描已开启来源。
会话列表入口从主机的集中式会话存储目录解析所属项目及关联工作树,重新打开工作区按主机记录的
最近访问版本重新扫描;开关保存通知已挂载的会话列表重新读取,绕过保存前的短期缓存。
工作区归属按来源目录匹配最近的已登记本地工作区。后台任务不依赖控制端在线;会话元数据分页
通过可选的 `discoveryPending` / `discoveryWarnings` 投影进度和非致命错误,已有原生会话始终可读。
服务主机合并同一批工作区打开请求的来源目录扫描,Codex 读取器按文件大小和修改时间复用已解析的
有界头部,不重复读取未变化文件。启动仅将会话标题、来源和归属写入集中会话目录的
`.external-session-index.json`;该私有索引由现有持久化入口合并到元数据分页,旧主机忽略此文件,
既有原生 Session 格式不变。改名、归档和删除只更新索引;删除保留抑制记录,重新扫描不复活条目。
源会话的移除动作显示为“从 OpenBitFun 移除”,不修改外部原始记录或已有原生分支。生态兼容页
列出当前主机上已移除的来源,用户主动重新添加时按工作区 ID 和来源身份校验,恢复同一个会话 ID、
自定义名称和缓存;恢复操作幂等,迟到的重试不会撤销之后的归档。旧重复项恢复为隐藏别名。
源会话与续聊分支的归档、移除及删除互不级联;源应用的归档状态不覆盖 OpenBitFun 的本地选择。
分支中打开已移除的来源会显示原因并提供重新添加;无法读取来源不会冒充删除或清空历史。
重新添加不读取来源正文,仍仅在打开来源会话时刷新。Peer 页面明确禁用来源恢复,CLI Peer 和
旧主机返回不支持状态;SSH 工作区在解析本地存储前拒绝恢复请求。
自动发现创建跟随来源的只读视图。首次打开重新验证来源身份、工作区和存储归属,在
`.external-history/<view-id>/<content-version>.json` 原子保存不可变缓存,再发布索引指针;
不创建原生 Session。内容版本是 adapter 版本与标准化轮次的摘要,独立于解析器的 `sourceRevision`。
轮次 ID 带内容版本,已有分页和分叉请求据此读取实际看过的版本;旧缓存保留以支持迟到客户端。
来源追加、回退或重写生成新版本。缓存缺失时来源失败明确报错;已有缓存则保留并标记来源不可用,
不发布空历史、不删除条目。元数据及工作区正文搜索不读取来源正文;正文搜索排除跟随视图并返回说明。
Web UI 每次打开来源会话时读取一次来源;停留、输入、窗口恢复可见及查看原生分支都不触发刷新。
首次发送使用现有分叉入口复制已显示版本并切换到原生分支,之后使用主机当前模型与权限配置。
分支以 `externalBranchOf` 保留来源及版本,来源仍可独立更新,后续内容不自动混入分支。
编辑或回退来源历史须先显式分叉;共享持久化及运行时入口拒绝直接修改跟随视图。
旧版自动导入复用原会话 ID,发现时不读取正文、不额外生成条目;曾经误生成的来源重复项保留为隐藏别名,已有分支链接仍有效。
首次打开才核对旧原生记录与来源内容,未编辑的记录转为跟随视图,原文件保留;已有本地续聊或编辑的记录继续独立显示。
通过核对后记录本地历史摘要,后续来源改写不会误判为本地编辑;旧主机再次修改本地历史时重新核对。
跟随条目保留旧 `externalHistoryPending` 标记,旧版主机仍能物化副本;手动导入的原生副本始终独立。
来源输入区采用当前主机默认权限,用户选择先存于本地输入状态,创建分支后才写入分支,不恢复来源运行时。私有索引新字段可选,
不改变现有原生会话 invoke 请求形状;不理解跟随视图的客户端直接提交时收到明确的只读/需要分叉错误。
改名、归档、删除意图独立于缓存更新,既有完整副本及历史版本不自动清理。
来源标题由生态 adapter 读取:Codex 优先使用 `state_*.sqlite` 的 `threads.name`,随后是
`session_index.jsonl` 最新名称、数据库 `title`、rollout 头部名称及有效用户输入摘要;旧版
`sqlite/` 数据库路径及缺少 `name` 的表继续可读。标题快照按数据库、WAL 与名称索引的修改时间
和大小缓存,一批发现只读一次;可选名称源不可读时保留目录、报告诊断并保留上次已知名称。
Zcode 继续使用来源 `session.title`。私有索引以可选字段保留来源标题及旧摘要,原生元数据读取
投影正确名称,不在启动时批量重写 Session。仅在名称仍等于原来源名称或可验证旧摘要时更新,
手动改名标记阻止后续覆盖;旧索引缺少新字段仍可往返,公开候选 DTO 形状不变。
Codex 恢复或重试可能留下多份相同线程 ID 的 rollout。目录在分页和计数前按线程去重,
优先使用 `threads.rollout_path`,旧数据库缺少该字段时按来源记录时间选择;旧文件候选 ID
在读取正文时也解析到当前记录,避免导入已中断的早期副本。不会拼接已放弃的重试分支。
对旧 `codex-rollout-jsonl-v1` 中只有用户输入、没有助手文本或工具历史的副本,显式读取时
检查全部原有轮次仍带来源标记、用户输入与新来源前缀相同且没有本地新增内容,再补齐历史。
修复保留原生名称、归属及用户元数据;存储服务先保留原副本和目标副本的恢复记录,再逐个
原子写入轮次,最后提交元数据。中断可从恢复记录继续;检测到本地编辑时停止覆盖。
该修复不在启动索引阶段读取正文,也不持续同步已导入的完整副本。
工作区菜单按来源筛选,导入记录带来源标签;筛选覆盖完整元数据分页,不加载历史正文。
来源切换从折叠的前五行开始,元数据加载不改变展开级别;只有原有展开控件增加可见行数。
开关属于服务主机,界面筛选属于设备与工作区;旧主机缺少配置字段时开关不可用。
SSH 工作区自动发现明确不支持,不扫描控制端目录。后台发现仍由目标主机持有。
Peer 的 Relay 历史游标尚不能固定来源版本,Web UI 明确拒绝打开或直接续聊跟随视图;已创建的原生
分支继续走既有 Peer 路径。远程控制、CLI 和 Detached Dispatch 未提供自动分叉的入口时,共享
运行时返回明确的只读错误,不能把来源视图当成可写会话。控制端不参与来源读取或缓存写入。
本实现通过本地存储、DOM 和设备切换夹具验证;未完成真实远程主机或原生 WebView 交互验证。

## 0. 当前 MCP 快照导入契约(C0a)

快照导入是显式复制,不是持续同步,也不改变现有外部 MCP 兼容来源。Desktop 与根 CLI 只负责展示脱敏预览并发送
Expand Down
2 changes: 1 addition & 1 deletion docs/architecture/product-architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ block-beta
| Shared frontend | `src/shared` | `shared` |
| Interfaces | `src/crates/interfaces/*` | `acp`、`app-server`、`app-server-client`、`app-server-protocol`、`sdk-host` |
| Assembly | `src/crates/assembly/*` | `agent-content`、`core`、`external-sources`、`product-capabilities` |
| Adapters | `src/crates/adapters/*` | `agent-runtime-ipc`、`ai-adapters`、`claude-code-adapter`、`codex-adapter`、`dsh-adapter`、`opencode-adapter`、`static-hook-support`、`transport`、`webdriver` |
| Adapters | `src/crates/adapters/*` | `agent-runtime-ipc`、`ai-adapters`、`claude-code-adapter`、`codex-adapter`、`zcode-adapter`、`dsh-adapter`、`opencode-adapter`、`static-hook-support`、`transport`、`webdriver` |
| Services | `src/crates/services/*` | `services-core`、`services-integrations`、`miniapp-market-service`、`skin-market-service`、`relay-service`、`page-function-runtime`、`terminal` |
| Execution | `src/crates/execution/*` | `agent-runtime`、`agent-workflows`、`agent-stream`、`plugin-runtime-client`、`runtime-services`、`tool-contracts`、`tool-provider-groups`、`tool-execution` |
| Contracts | `src/crates/contracts/*` | `core-types`、`events`、`runtime-ports`、`product-domains` |
Expand Down
Loading
Loading