Files
tutti/docs/architecture/claude-code-sdk-requirements.md
agent-radar 2ed3415fb7
Publish Claude Code Binaries / Stage and publish binaries (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-arm64 (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build linux-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build windows-amd64 (push) Canceled after 0s
Sync Tutti Agent Skills / sync (push) Canceled after 0s
Windows Agent Adapters / Test Windows agent adapters (push) Canceled after 0s
Windows Daemon Adapters / Test Windows daemon adapters (push) Canceled after 0s
Publish Tutti App Runtime / Publish runtime catalog (push) Canceled after 0s
源码快照 @ 2026-09-01 (source-only, 剔除非源码素材)
2026-09-01 20:17:27 +08:00

119 lines
9.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Claude Code SDK 重构保真要求
本文定义 Tutti 中 Claude Code 集成的产品保真范围和重构验收边界。它描述的是必须长期成立的产品契约,不绑定旧代码结构。
Claude Code 只有一条运行链路:`tuttid` 启动 `@tutti-os/claude-sdk-sidecar`,sidecar 使用 Claude Agent SDK。不得增加运行时选择器、平行实现或仅供迁移期使用的第二套会话语义。
具体模块所有权和协议见 [Claude Code SDK Runtime](./claude-code-sdk-runtime.md)。
## 用户能力保真
### 安装、认证与状态
- 自动发现 Claude CLI、Node 和 SDK sidecar,展示安装、登录、版本、可用性和可恢复错误。
- 支持安装、登录、刷新,以及用户已有 Claude 订阅、Anthropic API Key、Auth Token 和兼容 endpoint。
- 展示账号套餐、会话与周额度、重置时间和 extra usage;自定义 API 配置允许 quota 不可用。
- 安装、登录、配置文件变化、运行时认证失败和账号切换后,provider 状态与模型目录必须同步失效和刷新。
- 所有可能刷新共享 OAuth credential 的启动操作必须串行,等待过程响应取消;隐藏模型发现不得破坏 token 旋转。
- macOS usage 读取必须以 Keychain 为主、`$CLAUDE_CONFIG_DIR/.credentials.json` 为兜底;AgentGUI 初次挂载不得访问 Anthropic usage API。
### 会话、历史与窗口
- 支持从 Agent Dock、Launchpad、Agent 提及及业务入口创建 Claude Code 会话。
- 支持项目目录和无项目会话、多会话、多工作台窗口及独立 Agent 窗口。
- 支持新建、恢复、重试、搜索、分页、重命名、置顶、删除、批量删除和在新窗口打开。
- 支持按项目、Chats、Pinned 和 Agent Target 浏览,并正确呈现运行、等待、完成、失败、取消和未读状态。
- 支持 Claude 本地历史导入,保留标题、项目、消息、最近模型和时间;重复导入必须幂等。
- 支持会话 handoff;多个窗口共享 daemon 中的同一份 durable session 和 activity 真相。
### Composer 与上下文
- 支持普通文本、多行文本、长文本托管附件、图片、文件、目录和结构化 workspace reference。
- 支持 Workspace App、产物、Issue、历史 Agent 会话和 Agent Target mention,并由对应 Tutti skill 路由。
- 发现项目技能、个人技能和 Tutti 注入技能;支持 Claude slash commands 和参数提示。
- 支持 `/compact`、`/context`、`/usage`、`/status`、`/fast`、`/plan`、`/goal` 和 `/review` 对应能力。
- 忙碌时支持提示词排队、编辑、删除和立即发送;guidance 进入当前 turn,不创建普通下一 turn。
### 设置与能力协商
- 模型目录优先使用 live session,回退到 auth-scoped last-known-good cache,再回退静态模型。
- 支持 Default、账号动态模型、自定义模型、reasoning effort、Standard/Fast、权限模式和 Plan Mode。
- 模型、reasoning、速度、权限和 Plan Mode 可在 live session 中更新;active session 设置不反写新会话默认值。
- 静态 composer profile 是预启动权威;会话启动后以 runtime capability 为权威。
- Runtime 必须报告 image input、compact、token usage、rate limits、plan mode、interrupt、skills、review 和 goal;仅在实际启用时报告 browser/computer。
- capability 不可用时,GUI 隐藏或禁用入口,daemon 同时拒绝越权调用。
### 执行、活动与交互
- 实时显示回答、thinking、工具输入/进度/输出/终态、计划、后台 Agent、嵌套 Agent 和 task notification。
- SDK 消息在 daemon 边界归一为稳定 session/message/turn/tool identity;GUI 不读取 sidecar stdout 或 SDK 日志补数据。
- Assistant/thinking 分段、工具生命周期、文件 diff、usage 和 compact boundary 必须可乱序对账且不能重复终态。
- 支持 Allow、Allow for session、Reject、AskUserQuestion 和 ExitPlanMode;pending interaction 具备 object/null/omitted 三态语义。
- 支持停止、goal set/show/clear/complete、上下文用量、手动 compact、Undo/Reapply 和生成文件再次引用。
- 后台 Agent 使用 tool call identity 作为主键,保留父子链;子 assistant 文本不能提前终结 task。
### Tutti 扩展能力
- 每会话在 run-scoped 目录生成 system prompt、Claude plugin、skills、manifest 和托管临时文件,不修改用户项目或用户 `.claude` 内容。
- 注入 `tutti-cli`、`tutti-handoff`、`tutti-model-allocation`、`issue-manager`、`workspace-app` 和 `reference`,按能力注入 browser/computer skill。
- Claude Code 可通过 Tutti CLI 访问 Workspace、Agent、Issue、Workspace App 和 reference bundle。
- Browser 由 daemon-owned `tutti browser` 路由;Computer 仅在开关、driver 和系统权限均满足时启用,启动时 fail fast 且不擅自弹授权框。
## 技术不变量
### 身份、所有权与持久化
- 兼容 provider 输入统一规范化为 `claude-code`;新会话必须携带可信 `agentTargetId`,daemon 校验 Target/provider 一致性。
- Tutti session、Claude provider session、turn、message 和 tool call id 各自稳定,不得互相替代。
- Provider 可用性、启动授权、会话生命周期、恢复、持久化和 activity 投影归 `tuttid`;Desktop 只拥有 Electron/host integration,AgentGUI 只消费规范化契约。
- Durable session 与 live process 分离。Idle release 只释放进程,不清 provider session id、resume cursor、历史活动或 runtime manifest。
- SQLite 投影和 `agent.activity.updated` 是跨窗口同步权威;optimistic prompt 只作为可对账 overlay。
### 原生配置与凭证安全
- 全链路尊重 `CLAUDE_CONFIG_DIR`、`CLAUDE_CODE_EXECUTABLE`、Anthropic credential、endpoint 和模型别名,不自行改写代理模型映射。
- SDK env 优先级为 sidecar process env、用户 settings、从根到 cwd 的项目 settings、daemon session env;损坏或缺失配置不得阻塞启动。
- 不得创建空配置目录隔离用户 credential,不得并发启动会触碰同一 OAuth refresh token 的 Claude 进程。
- 诊断只能记录 credential 是否存在、来源、过期信息和不可逆短 fingerprint;不得记录 token、prompt、账户名、个人路径、命令参数或异常堆栈原文。
### Sidecar 与生命周期
- Sidecar 以 raw TypeScript 和生产依赖交付,由 managed Node 使用 `--experimental-strip-types` 执行。
- Daemon 与 sidecar 使用带版本的 NDJSON;stdout 只承载协议,stderr 有界收集且必须经过敏感字段清理。
- 协议支持 `start`、`exec`、`guide`、`cancel`、`submit_interactive`、`apply_settings` 和 `close`;请求 ack 使用 request id 和超时。
- `close` 必须等待 SDK query 完成关闭并收到 sidecar ack 后再关闭进程输入;UI 等待超时不得强杀仍在初始化或落盘 credential 的 SDK 进程。
- 每 session 只有一个持续 reader;turn 返回后仍处理后台 task、title、usage 和 session state。
- Start、Resume 和替换 live process 必须具备失败回滚;Close/reader failure/cancel 必须终结 pending interaction 并释放资源。
- Provider session id 和 opaque resume cursor 必须持久化;不可恢复错误不得静默创建 shadow session。
### 输入与 Activity
- 文本和图片在 daemon/adapter/sidecar 之间保持结构化 content blocks;文本 prompt 只作为兼容 fallback。
- 图片和附件由 Tutti 托管;daemon 重新校验 realpath、symlink、类型、大小和 state-root 边界。
- 每条 transcript message 必须有稳定 message id、正 version/sequence、turn id 和时间。
- Tool use、stream update、hook 和 result 合并为同一 call id;Edit/Write 的最终 diff 以成功响应的 structured patch 为准。
- Turn lifecycle 具有单调序列和原子 settle;取消幂等,迟到事件不能复活已终结 turn 或后台 task。
### 打包与可观察性
- Desktop 最终资源包含 sidecar 源码、生产依赖、managed Node contract 和平台 Claude binary,不依赖 monorepo、全局 npm 或开发机 workspace。
- Vendor 完成后必须从 vendored 路径启动进程并跑通 start/exec/close;Electron `afterPack` 后必须从最终 Resources 路径再次执行同一冒烟协议。
- 关键路径用 workspace/session/turn 关联 provider probe、install/login、prepare、start/resume、submit、usage、模型失效、auth refresh、stderr 和 event reconcile。
- 旧 provider id、旧 workbench state、旧 session provider-only 数据、旧消息 payload 和旧导入记录只在读取边界兼容;新写入使用当前契约。
## 重构验收门
合入前至少覆盖以下回归面:
| 领域 | 必测场景 |
| ---------- | ------------------------------------------------------------------------------------ |
| 探测与认证 | PATH/CLI/Node、安装、登录、API credential、自定义 endpoint、账号切换、OAuth 并发续期 |
| 生命周期 | 创建、恢复、失败回滚、idle release 后再附着、close、进程异常、event reconnect |
| Composer | 动态模型、live settings、skills、slash commands、browser/computer capability 降级 |
| 输入与活动 | 图片、附件、stream/thinking、tool/diff、审批、问题、后台与嵌套 Agent |
| 状态机 | compact、goal、cancel、guidance、busy queue、stop 后 queue suspension |
| 持久化 | session/message/activity 对账、分页、历史导入、跨窗口同步、usage quota |
| 发布 | vendored 路径启动、最终 Resources 路径启动、无仓库源码依赖、平台架构资源 |
局部修改先运行 sidecar/daemon/desktop 的针对性测试,再运行 `pnpm check:changed`。发布或大规模迁移完成时运行 `pnpm check:full`。