From 1e1b80bc774f42042566c996ed8db1bbe6c6d1e8 Mon Sep 17 00:00:00 2001 From: unraid Date: Tue, 14 Apr 2026 13:37:08 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20integrate=205=20feature=20branches=20+?= =?UTF-8?q?=20daemon/job=20=E5=91=BD=E4=BB=A4=E5=B1=82=E7=BA=A7=E5=8C=96?= =?UTF-8?q?=20+=20=E8=B7=A8=E5=B9=B3=E5=8F=B0=E5=90=8E=E5=8F=B0=E5=BC=95?= =?UTF-8?q?=E6=93=8E=20+=20TypeScript=20=E9=94=99=E8=AF=AF=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Squashed merge of: 1. fix/mcp-tsc-errors — 修复上游 MCP 重构后的 tsc 错误和测试失败 2. feat/pipe-mute-disconnect — Pipe IPC 逻辑断开、/lang 命令、mute 状态机 3. feat/stub-recovery-all — 实现全部 stub 恢复 (task 001-012) 4. feat/kairos-activation — KAIROS 激活解除阻塞 + 工具实现 5. codex/openclaw-autonomy-pr — 自治权限系统、运行记录、managed flows Additional: 6. daemon/job 命令层级化重构 (subcommand 架构) 7. 跨平台后台引擎抽象 (detached/tmux engines) 8. 修复 src/ 中 43 个预存在的 TypeScript 类型错误 9. 修复 langfuse isolated test mock 不完整问题 10. 修复 CodeRabbit 审查的 Critical/Major/Minor 问题 11. remote-control-server 测试 stderr 静默化 (logger 抽象) --- .gitignore | 2 +- 02-kairos (1).md | 204 +++ AGENTS.md | 283 +++++ build.ts | 2 + docs/features/daemon-restructure-design.md | 318 +++++ docs/features/stub-recovery-design-1-4.md | 310 +++++ docs/task/task-001-daemon-status-stop.md | 77 ++ .../task/task-002-bg-sessions-ps-logs-kill.md | 80 ++ docs/task/task-003-templates-job-mvp.md | 87 ++ .../task/task-004-assistant-session-attach.md | 103 ++ docs/task/task-013-bg-engine-abstraction.md | 196 +++ .../task/task-014-daemon-command-hierarchy.md | 275 ++++ docs/task/task-015-job-command-hierarchy.md | 177 +++ docs/task/task-016-backward-compat-tests.md | 123 ++ docs/test-plans/openclaw-autonomy-baseline.md | 88 ++ .../PushNotificationTool.ts | 62 +- .../SendUserFileTool/SendUserFileTool.ts | 49 +- packages/remote-control-server/src/logger.ts | 10 + .../src/routes/v1/session-ingress.ts | 11 +- .../src/routes/v1/sessions.ts | 3 +- .../src/routes/web/control.ts | 5 +- .../src/routes/web/sessions.ts | 3 +- .../src/services/disconnect-monitor.ts | 5 +- .../src/services/work-dispatch.ts | 3 +- .../src/transport/event-bus.ts | 6 +- .../src/transport/sse-writer.ts | 3 +- .../src/transport/ws-handler.ts | 21 +- scripts/dev.ts | 2 + src/__tests__/context.baseline.test.ts | 91 ++ src/assistant/AssistantSessionChooser.ts | 3 - src/assistant/AssistantSessionChooser.tsx | 54 + src/assistant/gate.ts | 17 +- src/assistant/index.ts | 73 +- src/assistant/sessionDiscovery.ts | 54 +- src/cli/bg.ts | 321 ++++- src/cli/bg/__tests__/detached.test.ts | 15 + src/cli/bg/__tests__/engine.test.ts | 37 + src/cli/bg/__tests__/tail.test.ts | 8 + src/cli/bg/engine.ts | 47 + src/cli/bg/engines/detached.ts | 51 + src/cli/bg/engines/index.ts | 17 + src/cli/bg/engines/tmux.ts | 73 ++ src/cli/bg/tail.ts | 70 ++ src/cli/handlers/ant.ts | 229 +++- src/cli/handlers/templateJobs.ts | 161 ++- src/cli/print.ts | 456 ++++--- src/cli/rollback.ts | 72 +- src/cli/up.ts | 97 +- src/commands.ts | 13 + src/commands/__tests__/autonomy.test.ts | 246 ++++ .../__tests__/proactive.baseline.test.ts | 48 + src/commands/assistant/assistant.ts | 53 - src/commands/assistant/assistant.tsx | 175 +++ src/commands/assistant/gate.ts | 18 +- src/commands/autonomy.ts | 125 ++ src/commands/daemon/__tests__/daemon.test.ts | 24 + src/commands/daemon/daemon.tsx | 57 + src/commands/daemon/index.ts | 17 + src/commands/init.ts | 5 +- src/commands/job/__tests__/job.test.ts | 25 + src/commands/job/index.ts | 16 + src/commands/job/job.tsx | 34 + src/commands/lang/index.ts | 12 + src/commands/lang/lang.ts | 49 + src/commands/send/send.ts | 13 + src/commands/torch.ts | 20 +- src/daemon/__tests__/daemonMain.test.ts | 61 + src/daemon/__tests__/state.test.ts | 185 +++ src/daemon/main.ts | 143 ++- src/daemon/state.ts | 157 +++ src/entrypoints/cli.tsx | 77 +- src/hooks/useAwaySummary.ts | 1 - src/hooks/useMasterMonitor.ts | 76 +- src/hooks/usePipeIpc.ts | 9 + src/hooks/usePipeMuteSync.ts | 141 +++ src/hooks/usePipePermissionForward.ts | 1 + src/hooks/usePipeRelay.ts | 5 +- src/hooks/useScheduledTasks.ts | 107 +- src/jobs/__tests__/classifier.test.ts | 140 +++ src/jobs/__tests__/state.test.ts | 91 ++ src/jobs/__tests__/templates.test.ts | 87 ++ src/jobs/classifier.ts | 70 +- src/jobs/state.ts | 105 ++ src/jobs/templates.ts | 107 ++ src/main.tsx | 6 +- .../__tests__/state.baseline.test.ts | 80 ++ src/proactive/useProactive.ts | 27 +- src/screens/REPL.tsx | 191 +-- src/services/analytics/growthbook.ts | 24 +- .../__tests__/queryModelOpenAI.isolated.ts | 487 +++++++ .../openai/__tests__/queryModelOpenAI.test.ts | 486 +------ .../openai/__tests__/streamAdapter.test.ts | 22 +- src/services/awaySummary.ts | 10 +- .../langfuse/__tests__/langfuse.isolated.ts | 702 +++++++++++ .../langfuse/__tests__/langfuse.test.ts | 709 +---------- .../InProcessTeammateTask.tsx | 112 +- src/tasks/InProcessTeammateTask/types.ts | 10 +- src/types/textInputTypes.ts | 13 + src/utils/__tests__/autonomyAuthority.test.ts | 241 ++++ src/utils/__tests__/autonomyFlows.test.ts | 1116 +++++++++++++++++ .../__tests__/autonomyPersistence.test.ts | 117 ++ src/utils/__tests__/autonomyRuns.test.ts | 421 +++++++ .../__tests__/cronScheduler.baseline.test.ts | 79 ++ .../__tests__/cronTasks.baseline.test.ts | 203 +++ src/utils/__tests__/language.test.ts | 82 ++ src/utils/__tests__/pipeMuteState.test.ts | 124 ++ src/utils/__tests__/taskSummary.test.ts | 93 ++ src/utils/autonomyAuthority.ts | 522 ++++++++ src/utils/autonomyFlows.ts | 1057 ++++++++++++++++ src/utils/autonomyPersistence.ts | 48 + src/utils/autonomyRuns.ts | 797 ++++++++++++ src/utils/config.ts | 4 +- src/utils/handlePromptSubmit.ts | 266 ++-- src/utils/language.ts | 26 + src/utils/pipeMuteState.ts | 78 ++ src/utils/pipePermissionRelay.ts | 16 + src/utils/pipeTransport.ts | 6 +- src/utils/swarm/inProcessRunner.ts | 29 +- src/utils/swarm/spawnInProcess.ts | 13 + src/utils/taskSummary.ts | 81 +- tests/integration/cli-arguments.test.ts | 2 + tests/mocks/file-system.ts | 28 +- tsconfig.json | 10 +- 123 files changed, 13489 insertions(+), 1816 deletions(-) create mode 100644 02-kairos (1).md create mode 100644 AGENTS.md create mode 100644 docs/features/daemon-restructure-design.md create mode 100644 docs/features/stub-recovery-design-1-4.md create mode 100644 docs/task/task-001-daemon-status-stop.md create mode 100644 docs/task/task-002-bg-sessions-ps-logs-kill.md create mode 100644 docs/task/task-003-templates-job-mvp.md create mode 100644 docs/task/task-004-assistant-session-attach.md create mode 100644 docs/task/task-013-bg-engine-abstraction.md create mode 100644 docs/task/task-014-daemon-command-hierarchy.md create mode 100644 docs/task/task-015-job-command-hierarchy.md create mode 100644 docs/task/task-016-backward-compat-tests.md create mode 100644 docs/test-plans/openclaw-autonomy-baseline.md create mode 100644 packages/remote-control-server/src/logger.ts create mode 100644 src/__tests__/context.baseline.test.ts delete mode 100644 src/assistant/AssistantSessionChooser.ts create mode 100644 src/assistant/AssistantSessionChooser.tsx create mode 100644 src/cli/bg/__tests__/detached.test.ts create mode 100644 src/cli/bg/__tests__/engine.test.ts create mode 100644 src/cli/bg/__tests__/tail.test.ts create mode 100644 src/cli/bg/engine.ts create mode 100644 src/cli/bg/engines/detached.ts create mode 100644 src/cli/bg/engines/index.ts create mode 100644 src/cli/bg/engines/tmux.ts create mode 100644 src/cli/bg/tail.ts create mode 100644 src/commands/__tests__/autonomy.test.ts create mode 100644 src/commands/__tests__/proactive.baseline.test.ts delete mode 100644 src/commands/assistant/assistant.ts create mode 100644 src/commands/assistant/assistant.tsx create mode 100644 src/commands/autonomy.ts create mode 100644 src/commands/daemon/__tests__/daemon.test.ts create mode 100644 src/commands/daemon/daemon.tsx create mode 100644 src/commands/daemon/index.ts create mode 100644 src/commands/job/__tests__/job.test.ts create mode 100644 src/commands/job/index.ts create mode 100644 src/commands/job/job.tsx create mode 100644 src/commands/lang/index.ts create mode 100644 src/commands/lang/lang.ts create mode 100644 src/daemon/__tests__/daemonMain.test.ts create mode 100644 src/daemon/__tests__/state.test.ts create mode 100644 src/daemon/state.ts create mode 100644 src/hooks/usePipeMuteSync.ts create mode 100644 src/jobs/__tests__/classifier.test.ts create mode 100644 src/jobs/__tests__/state.test.ts create mode 100644 src/jobs/__tests__/templates.test.ts create mode 100644 src/jobs/state.ts create mode 100644 src/jobs/templates.ts create mode 100644 src/proactive/__tests__/state.baseline.test.ts create mode 100644 src/services/api/openai/__tests__/queryModelOpenAI.isolated.ts create mode 100644 src/services/langfuse/__tests__/langfuse.isolated.ts create mode 100644 src/utils/__tests__/autonomyAuthority.test.ts create mode 100644 src/utils/__tests__/autonomyFlows.test.ts create mode 100644 src/utils/__tests__/autonomyPersistence.test.ts create mode 100644 src/utils/__tests__/autonomyRuns.test.ts create mode 100644 src/utils/__tests__/cronScheduler.baseline.test.ts create mode 100644 src/utils/__tests__/cronTasks.baseline.test.ts create mode 100644 src/utils/__tests__/language.test.ts create mode 100644 src/utils/__tests__/pipeMuteState.test.ts create mode 100644 src/utils/__tests__/taskSummary.test.ts create mode 100644 src/utils/autonomyAuthority.ts create mode 100644 src/utils/autonomyFlows.ts create mode 100644 src/utils/autonomyPersistence.ts create mode 100644 src/utils/autonomyRuns.ts create mode 100644 src/utils/language.ts create mode 100644 src/utils/pipeMuteState.ts diff --git a/.gitignore b/.gitignore index f03bc66b5e..2a4224105c 100644 --- a/.gitignore +++ b/.gitignore @@ -15,7 +15,7 @@ src/utils/vendor/ .claude/ .codex/ .omx/ - +.docs/task/ # Binary / screenshot files (root only) /*.png *.bmp diff --git a/02-kairos (1).md b/02-kairos (1).md new file mode 100644 index 0000000000..ce022bac1e --- /dev/null +++ b/02-kairos (1).md @@ -0,0 +1,204 @@ +# KAIROS — 永不关机的 Claude + +> 源码位置:`src/assistant/`、`src/proactive/`、`src/services/autoDream/` +> 编译开关:`feature('KAIROS')`、`feature('KAIROS_BRIEF')`、`feature('KAIROS_CHANNELS')` +> 远程开关:GrowthBook `tengu_kairos` + +关掉终端 Claude 还在运行的持久助手模式。KAIROS 是 Claude Code 中最复杂的隐藏功能之一。 + +--- + +## 核心概念 + +KAIROS 让 Claude 从"一次性对话工具"变成"持久运行的 AI 助手": + +- 关闭终端后 Claude 仍在后台运行 +- 每天自动写日志 +- 晚上自动"做梦"整理记忆 +- 没人说话时自己找活干 +- 命令超 15 秒自动丢后台 + +--- + +## 激活流程 + +定义在 `src/main.tsx`(约第 1054-1092 行),需要通过五层检查: + +``` +1. feature('KAIROS') ← 编译时 flag +2. settings.assistant: true ← .claude/settings.json +3. 目录信任状态检查 ← 防恶意仓库劫持 +4. tengu_kairos ← GrowthBook 远程开关 +5. setKairosActive(true) ← 全局状态激活 +``` + +`--assistant` CLI 参数可跳过远程开关检查(用于 Agent SDK daemon 模式)。 + +全局状态存储在 `src/bootstrap/state.ts`: +- `kairosActive: boolean`(默认 `false`) +- `getKairosActive()` / `setKairosActive(true)` + +--- + +## 跨会话持久运行 + +### 会话恢复 + +`src/utils/conversationRecovery.ts` 中使用 `feature('KAIROS')` 条件导入 `BriefTool` 和 `SendUserFileTool`。在反序列化会话时识别这些工具的结果为"终端工具结果",判断 turn 是正常完成还是被中断。 + +### 持久 Cron 任务 + +关键在 `.claude/scheduled_tasks.json`。标记为 `permanent: true` 的任务不受 7 天自动过期限制: + +- `catch-up`:恢复中断的工作 +- `morning-checkin`:每日早间签到 +- `dream`:记忆整合 + +### 会话历史 API + +`src/assistant/sessionHistory.ts` 通过 OAuth API 加载远程会话历史,使用 `v1/sessions/{sessionId}/events` 端点,支持分页拉取。 + +--- + +## 做梦机制(Dream) + +KAIROS 最精巧的子系统——后台运行的子代理,将分散的会话记忆整合为持久的结构化知识。 + +### 触发条件(三层门控,由廉到贵) + +定义在 `src/services/autoDream/autoDream.ts`: + +``` +1. 时间门控:距上次整合超过 24 小时(minHours) +2. 会话门控:至少 5 个新会话(minSessions) +3. 锁门控:没有其他进程正在整合 +``` + +阈值通过 GrowthBook `tengu_onyx_plover` 远程配置动态控制。 + +### 四阶段整合流程 + +定义在 `src/services/autoDream/consolidationPrompt.ts`: + +| 阶段 | 动作 | +|------|------| +| **Orient** | 列出记忆目录、读取 `MEMORY.md` 索引、浏览已有主题文件 | +| **Gather** | 从每日日志、已有记忆、JSONL transcript 中搜集新信号 | +| **Consolidate** | 合并新信号到主题文件,转换相对日期为绝对日期,删除过时事实 | +| **Prune** | 更新 `MEMORY.md` 索引,保持在行数和大小限制内 | + +### 锁机制 + +`src/services/autoDream/consolidationLock.ts`: + +- 使用 `.consolidate-lock` 文件 +- 文件 mtime = `lastConsolidatedAt` +- 文件内容 = 持有者 PID +- 支持 PID 存活检查(1 小时超时) +- double-write 后 re-read 验证防竞争 + +### 每日日志 + +路径由 `src/memdir/paths.ts` 的 `getAutoMemDailyLogPath()` 计算: + +``` +/logs/YYYY/MM/YYYY-MM-DD.md +``` + +### UI 呈现 + +- Footer pill 标签显示 **"dreaming"** +- `src/components/tasks/DreamDetailDialog.tsx` 提供专门的详情对话框 +- 支持查看实时进度和手动中止 +- `Shift+Down` 打开后台任务对话框 + +--- + +## 主动模式(Proactive Mode) + +没人说话时 Claude 自己找活干。 + +### 核心状态 + +`src/proactive/index.ts` 维护三个状态: + +| 状态 | 说明 | +|------|------| +| `active` | 是否激活 | +| `paused` | 是否暂停(用户按 Esc 取消时暂停,下次输入恢复) | +| `contextBlocked` | API 错误时阻塞 tick,防止 tick-error-tick 死循环 | + +### 激活方式 + +- `--proactive` CLI 参数 +- `CLAUDE_CODE_PROACTIVE` 环境变量 +- 受 `feature('PROACTIVE') || feature('KAIROS')` 保护 + +### 系统提示 + +激活后追加: + +``` +# Proactive Mode + +You are in proactive mode. Take initiative -- explore, act, and make progress +without waiting for instructions. + +Start by briefly greeting the user. + +You will receive periodic prompts. These are check-ins. Do whatever +seems most useful, or call Sleep if there's nothing to do. +``` + +### SleepTool 集成 + +设置中的 `minSleepDurationMs` 和 `maxSleepDurationMs` 控制 Sleep 持续时间范围,节流 proactive tick 频率。没活干就 Sleep 等着。 + +--- + +## 后台任务管理 + +### Cron 调度器 + +`src/utils/cronScheduler.ts`: + +- 每 1 秒 tick 一次(`CHECK_INTERVAL_MS = 1000`) +- 使用 chokidar 监视 `.claude/scheduled_tasks.json` +- 支持调度器锁(`src/utils/cronTasksLock.ts`),防止多实例重复触发 +- 锁探测间隔 5 秒,持有者崩溃时自动接管 + +### 任务类型 + +| 类型 | 说明 | +|------|------| +| 一次性(`recurring: false`) | 触发后自动删除,支持错过任务检测 | +| 循环(`recurring: true`) | 触发后重新调度,默认 7 天过期 | +| 永久(`permanent: true`) | 不受过期限制(KAIROS 专用) | +| 会话级(`durable: false`) | 仅内存中,进程退出即消失 | + +### Jitter 防雷群机制 + +`src/utils/cronJitterConfig.ts`: + +- 循环任务:基于 taskId 的确定性延迟(interval 的 10%,上限 15 分钟) +- 一次性任务:在 :00 和 :30 施加最多 90 秒提前量 +- 运维可在事故期间推送配置变更,60 秒内全客户端生效 + +--- + +## 关键源码文件 + +| 文件 | 职责 | +|------|------| +| `src/bootstrap/state.ts` | KAIROS 全局状态 | +| `src/assistant/index.ts` | 助手模式入口 | +| `src/assistant/sessionHistory.ts` | 远程会话历史 API | +| `src/proactive/index.ts` | 主动模式状态管理 | +| `src/services/autoDream/autoDream.ts` | Auto-Dream 引擎 | +| `src/services/autoDream/consolidationPrompt.ts` | 整合提示(四阶段) | +| `src/services/autoDream/consolidationLock.ts` | 整合锁 | +| `src/services/autoDream/config.ts` | Dream 配置 | +| `src/tasks/DreamTask/DreamTask.ts` | Dream 任务定义 | +| `src/utils/cronScheduler.ts` | Cron 调度器 | +| `src/utils/cronTasks.ts` | Cron 任务持久化 | +| `src/skills/bundled/dream.ts` | `/dream` Skill(存根) | diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000000..d1404eee63 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,283 @@ +# AGENTS.md + +This file provides guidance to Codex (Codex.ai/code) when working with code in this repository. + +## Project Overview + +This is a **reverse-engineered / decompiled** version of Anthropic's official Codex CLI tool. The goal is to restore core functionality while trimming secondary capabilities. Many modules are stubbed or feature-flagged off. TypeScript strict mode is enforced — **`bunx tsc --noEmit` must pass with zero errors**. + +## Git Commit Message Convention + +使用 **Conventional Commits** 规范: + +``` +: <描述> +``` + +常见 type:`feat`、`fix`、`docs`、`chore`、`refactor` + +示例: +- `feat: 添加模型 1M 上下文切换` +- `fix: 修复初次登陆的校验问题` +- `chore: remove prefetchOfficialMcpUrls call on startup` + +## Commands + +```bash +# Install dependencies +bun install + +# Dev mode (runs cli.tsx with MACRO defines injected via -d flags) +bun run dev + +# Dev mode with debugger (set BUN_INSPECT=9229 to pick port) +bun run dev:inspect + +# Pipe mode +echo "say hello" | bun run src/entrypoints/cli.tsx -p + +# Build (code splitting, outputs dist/cli.js + chunk files) +bun run build + +# Test +bun test # run all tests (2453 tests / 137 files / 0 fail) +bun test src/utils/__tests__/hash.test.ts # run single file +bun test --coverage # with coverage report + +# Lint & Format (Biome) +bun run lint # check only +bun run lint:fix # auto-fix +bun run format # format all src/ + +# Health check +bun run health + +# Check unused exports +bun run check:unused + +# Remote Control Server +bun run rcs + +# Docs dev server (Mintlify) +bun run docs:dev +``` + +详细的测试规范、覆盖状态和改进计划见 `docs/testing-spec.md`。 + +## Architecture + +### Runtime & Build + +- **Runtime**: Bun (not Node.js). All imports, builds, and execution use Bun APIs. +- **Build**: `build.ts` 执行 `Bun.build()` with `splitting: true`,入口 `src/entrypoints/cli.tsx`,输出 `dist/cli.js` + chunk files。Build 默认启用 19 个 feature(见下方 Feature Flag 段)。构建后自动替换 `import.meta.require` 为 Node.js 兼容版本(产物 bun/node 都可运行)。 +- **Dev mode**: `scripts/dev.ts` 通过 Bun `-d` flag 注入 `MACRO.*` defines,运行 `src/entrypoints/cli.tsx`。默认启用全部 feature。 +- **Module system**: ESM (`"type": "module"`), TSX with `react-jsx` transform. +- **Monorepo**: Bun workspaces — 14 个 internal packages in `packages/` resolved via `workspace:*`。 +- **Lint/Format**: Biome (`biome.json`)。`bun run lint` / `bun run lint:fix` / `bun run format`。 +- **Defines**: 集中管理在 `scripts/defines.ts`。当前版本 `2.1.888`。 +- **CI**: GitHub Actions — `ci.yml`(构建+测试)、`release-rcs.yml`(RCS 发布)、`update-contributors.yml`(自动更新贡献者)。 + +### Entry & Bootstrap + +1. **`src/entrypoints/cli.tsx`** (323 行) — True entrypoint。`main()` 函数按优先级处理多条快速路径: + - `--version` / `-v` — 零模块加载 + - `--dump-system-prompt` — feature-gated (DUMP_SYSTEM_PROMPT) + - `--Codex-in-chrome-mcp` / `--chrome-native-host` + - `--computer-use-mcp` — 独立 MCP server 模式 + - `--daemon-worker=` — feature-gated (DAEMON) + - `remote-control` / `rc` / `remote` / `sync` / `bridge` — feature-gated (BRIDGE_MODE) + - `daemon` [subcommand] — feature-gated (DAEMON) + - `ps` / `logs` / `attach` / `kill` / `--bg` — feature-gated (BG_SESSIONS) + - `new` / `list` / `reply` — Template job commands + - `environment-runner` / `self-hosted-runner` — BYOC runner + - `--tmux` + `--worktree` 组合 + - 默认路径:加载 `main.tsx` 启动完整 CLI +2. **`src/main.tsx`** (~6970 行) — Commander.js CLI definition。注册大量 subcommands:`mcp` (serve/add/remove/list...)、`server`、`ssh`、`open`、`auth`、`plugin`、`agents`、`auto-mode`、`doctor`、`update` 等。主 `.action()` 处理器负责权限、MCP、会话恢复、REPL/Headless 模式分发。 +3. **`src/entrypoints/init.ts`** — One-time initialization (telemetry, config, trust dialog)。 + +### Core Loop + +- **`src/query.ts`** — The main API query function. Sends messages to Codex API, handles streaming responses, processes tool calls, and manages the conversation turn loop. +- **`src/QueryEngine.ts`** — Higher-level orchestrator wrapping `query()`. Manages conversation state, compaction, file history snapshots, attribution, and turn-level bookkeeping. Used by the REPL screen. +- **`src/screens/REPL.tsx`** — The interactive REPL screen (React/Ink component). Handles user input, message display, tool permission prompts, and keyboard shortcuts. + +### API Layer + +- **`src/services/api/Codex.ts`** — Core API client. Builds request params (system prompt, messages, tools, betas), calls the Anthropic SDK streaming endpoint, and processes `BetaRawMessageStreamEvent` events. +- **7 providers**: `firstParty` (Anthropic direct), `bedrock` (AWS), `vertex` (Google Cloud), `foundry`, `openai`, `gemini`, `grok` (xAI)。 +- Provider selection in `src/utils/model/providers.ts`。优先级:modelType 参数 > 环境变量 > 默认 firstParty。 + +### Tool System + +- **`src/Tool.ts`** — Tool interface definition (`Tool` type) and utilities (`findToolByName`, `toolMatchesName`). +- **`src/tools.ts`** (387 行) — Tool registry. Assembles the tool list; some tools are conditionally loaded via `feature()` flags or `process.env.USER_TYPE`. +- **`src/tools//`** — 55 个 tool 目录。主要分类: + - **文件操作**: FileEditTool, FileReadTool, FileWriteTool, GlobTool, GrepTool + - **Shell/执行**: BashTool, PowerShellTool, REPLTool + - **Agent 系统**: AgentTool, TaskCreateTool, TaskUpdateTool, TaskListTool, TaskGetTool + - **规划**: EnterPlanModeTool, ExitPlanModeV2Tool, VerifyPlanExecutionTool + - **Web/MCP**: WebFetchTool, WebSearchTool, MCPTool, McpAuthTool + - **调度**: CronCreateTool, CronDeleteTool, CronListTool + - **其他**: LSPTool, ConfigTool, SkillTool, EnterWorktreeTool, ExitWorktreeTool 等 +- **`src/tools/shared/`** — Tool 共享工具函数。 + +### UI Layer (Ink) + +- **`src/ink.ts`** — Ink render wrapper with ThemeProvider injection. +- **`packages/@ant/ink/`** — Custom Ink framework(forked/internal),包含 components、core、hooks、keybindings、theme、utils。注意:不是 `src/ink/`。 +- **`src/components/`** — 149 个组件目录/文件,渲染于终端 Ink 环境中。关键组件: + - `App.tsx` — Root provider (AppState, Stats, FpsMetrics) + - `Messages.tsx` / `MessageRow.tsx` — Conversation message rendering + - `PromptInput/` — User input handling + - `permissions/` — Tool permission approval UI + - `design-system/` — 复用 UI 组件(Dialog, FuzzyPicker, ProgressBar, ThemeProvider 等) +- Components use React Compiler runtime (`react/compiler-runtime`) — decompiled output has `_c()` memoization calls throughout. + +### State Management + +- **`src/state/AppState.tsx`** — Central app state type and context provider. Contains messages, tools, permissions, MCP connections, etc. +- **`src/state/AppStateStore.ts`** — Default state and store factory. +- **`src/state/store.ts`** — Zustand-style store for AppState (`createStore`). +- **`src/state/selectors.ts`** — State selectors. +- **`src/bootstrap/state.ts`** — Module-level singletons for session-global state (session ID, CWD, project root, token counts, model overrides, client type, permission mode). + +### Workspace Packages + +| Package | 说明 | +|---------|------| +| `packages/@ant/ink/` | Forked Ink 框架(components、hooks、keybindings、theme) | +| `packages/@ant/computer-use-mcp/` | Computer Use MCP server(截图/键鼠/剪贴板/应用管理) | +| `packages/@ant/computer-use-input/` | 键鼠模拟(dispatcher + darwin/win32/linux backend) | +| `packages/@ant/computer-use-swift/` | 截图 + 应用管理(dispatcher + per-platform backend) | +| `packages/@ant/Codex-for-chrome-mcp/` | Chrome 浏览器控制(通过 `--chrome` 启用) | +| `packages/remote-control-server/` | 自托管 Remote Control Server(Docker 部署,含 Web UI) | +| `packages/swarm/` | Swarm 解耦模块 | +| `packages/shell/` | Shell 抽象 | +| `packages/audio-capture-napi/` | 原生音频捕获(已恢复) | +| `packages/color-diff-napi/` | 颜色差异计算(完整实现,11 tests) | +| `packages/image-processor-napi/` | 图像处理(已恢复) | +| `packages/modifiers-napi/` | 键盘修饰键检测(stub) | +| `packages/url-handler-napi/` | URL scheme 处理(stub) | + +### Bridge / Remote Control + +- **`src/bridge/`** (~37 files) — Remote Control / Bridge 模式。feature-gated by `BRIDGE_MODE`。包含 bridge API、会话管理、JWT 认证、消息传输、权限回调等。Entry: `bridgeMain.ts`。 +- **`packages/remote-control-server/`** — 自托管 RCS,支持 Docker 部署,含 Web UI 控制面板。通过 `bun run rcs` 启动。 +- CLI 快速路径: `Codex remote-control` / `Codex rc` / `Codex bridge`。 +- 详见 `docs/features/remote-control-self-hosting.md`。 + +### Daemon Mode + +- **`src/daemon/`** — Daemon 模式(长驻 supervisor)。feature-gated by `DAEMON`。包含 `main.ts`(entry)和 `workerRegistry.ts`(worker 管理)。 + +### Context & System Prompt + +- **`src/context.ts`** — Builds system/user context for the API call (git status, date, AGENTS.md contents, memory files). +- **`src/utils/claudemd.ts`** — Discovers and loads AGENTS.md files from project hierarchy. + +### Feature Flag System + +Feature flags control which functionality is enabled at runtime. 代码中统一通过 `import { feature } from 'bun:bundle'` 导入,调用 `feature('FLAG_NAME')` 返回 `boolean`。 + +**启用方式**: 环境变量 `FEATURE_=1`。例如 `FEATURE_BUDDY=1 bun run dev`。 + +**Build 默认 features**(19 个,见 `build.ts`): +- 基础: `BUDDY`, `TRANSCRIPT_CLASSIFIER`, `BRIDGE_MODE`, `AGENT_TRIGGERS_REMOTE`, `CHICAGO_MCP`, `VOICE_MODE` +- 统计/缓存: `SHOT_STATS`, `PROMPT_CACHE_BREAK_DETECTION`, `TOKEN_BUDGET` +- P0 本地: `AGENT_TRIGGERS`, `ULTRATHINK`, `BUILTIN_EXPLORE_PLAN_AGENTS`, `LODESTONE` +- P1 API 依赖: `EXTRACT_MEMORIES`, `VERIFICATION_AGENT`, `KAIROS_BRIEF`, `AWAY_SUMMARY`, `ULTRAPLAN` +- P2: `DAEMON` + +**Dev mode 默认**: 全部启用(见 `scripts/dev.ts`)。 + +**类型声明**: `src/types/internal-modules.d.ts` 中声明了 `bun:bundle` 模块的 `feature` 函数签名。 + +**新增功能的正确做法**: 保留 `import { feature } from 'bun:bundle'` + `feature('FLAG_NAME')` 的标准模式,在运行时通过环境变量或配置控制,不要绕过 feature flag 直接 import。 + +### Multi-API 兼容层 + +所有兼容层均采用流适配器模式:将第三方 API 格式转为 Anthropic 内部格式,下游代码完全不改。 + +#### OpenAI 兼容层 + +通过 `CLAUDE_CODE_USE_OPENAI=1` 启用,支持 Ollama/DeepSeek/vLLM 等任意 OpenAI Chat Completions 协议端点。含 DeepSeek thinking mode 支持。 + +- **`src/services/api/openai/`** — client、消息/工具转换、流适配、模型映射 +- 关键环境变量:`CLAUDE_CODE_USE_OPENAI`、`OPENAI_API_KEY`、`OPENAI_BASE_URL`、`OPENAI_MODEL` + +#### Gemini 兼容层 + +通过 `CLAUDE_CODE_USE_GEMINI=1` 启用。独立环境变量体系。 + +- **`src/services/api/gemini/`** — client、模型映射、类型定义 +- 关键环境变量:`GEMINI_API_KEY`(必填)、`GEMINI_MODEL`(直接指定)、`GEMINI_DEFAULT_SONNET_MODEL`/`GEMINI_DEFAULT_OPUS_MODEL`(按能力映射) +- 模型映射优先级:`GEMINI_MODEL` > `GEMINI_DEFAULT_*_MODEL` > `ANTHROPIC_DEFAULT_*_MODEL`(已废弃) > 原样返回 + +#### Grok 兼容层 + +通过 `CLAUDE_CODE_USE_GROK=1` 启用。自定义模型映射支持 xAI Grok API。 + +- **`src/services/api/grok/`** — client、模型映射 + +详见各兼容层的 docs 文档。 + +### Stubbed/Deleted Modules + +| Module | Status | +|--------|--------| +| Computer Use (`@ant/*`) | Restored — macOS + Windows + Linux(后端完整度不一) | +| `*-napi` packages | `audio-capture-napi`、`image-processor-napi` 已恢复;`color-diff-napi` 完整;`modifiers-napi`、`url-handler-napi` 仍为 stub | +| Voice Mode | Restored — Push-to-Talk 语音输入(需 Anthropic OAuth) | +| OpenAI/Gemini/Grok 兼容层 | Restored | +| Remote Control Server | Restored — 自托管 RCS + Web UI | +| Analytics / GrowthBook / Sentry | Empty implementations | +| Magic Docs / LSP Server | Removed | +| Plugins / Marketplace | Removed | +| MCP OAuth | Simplified | + +### Key Type Files + +- **`src/types/global.d.ts`** — Declares `MACRO`, `BUILD_TARGET`, `BUILD_ENV` and internal Anthropic-only identifiers. +- **`src/types/internal-modules.d.ts`** — Type declarations for `bun:bundle`, `bun:ffi`, `@anthropic-ai/mcpb`. +- **`src/types/message.ts`** — Message type hierarchy (UserMessage, AssistantMessage, SystemMessage, etc.). +- **`src/types/permissions.ts`** — Permission mode and result types. + +## Testing + +- **框架**: `bun:test`(内置断言 + mock) +- **当前状态**: 2472 tests / 138 files / 0 fail +- **单元测试**: 就近放置于 `src/**/__tests__/`,文件名 `.test.ts` +- **集成测试**: `tests/integration/` — 4 个文件(cli-arguments, context-build, message-pipeline, tool-chain) +- **共享 mock/fixture**: `tests/mocks/`(api-responses, file-system, fixtures/) +- **命名**: `describe("functionName")` + `test("behavior description")`,英文 +- **Mock 模式**: 对重依赖模块使用 `mock.module()` + `await import()` 解锁(必须内联在测试文件中,不能从共享 helper 导入) +- **包测试**: `packages/` 下各包也有独立测试(如 `color-diff-napi` 11 tests) + +### 类型检查 + +项目使用 TypeScript strict 模式,**tsc 必须零错误**。每次修改后运行: + +```bash +bunx tsc --noEmit +``` + +**类型规范**: +- 生产代码禁止 `as any`;测试文件中 mock 数据可用 `as any` +- 类型不匹配优先用 `as unknown as SpecificType` 双重断言,或补充 interface +- 未知结构对象用 `Record` 替代 `any` +- 联合类型用类型守卫(type guard)收窄,不要强转 +- `msg.request` 属性访问:`const req = msg.request as Record` +- Ink `color` prop:用 `as keyof Theme` 而非 `as any` + +## Working with This Codebase + +- **tsc must pass** — `bunx tsc --noEmit` 必须零错误,任何修改都不能引入新的类型错误。 +- **Feature flags** — 默认全部关闭(`feature()` 返回 `false`)。Dev/build 各有自己的默认启用列表。不要在 `cli.tsx` 中重定义 `feature` 函数。 +- **React Compiler output** — Components have decompiled memoization boilerplate (`const $ = _c(N)`). This is normal. +- **`bun:bundle` import** — `import { feature } from 'bun:bundle'` 是 Bun 内置模块,由运行时/构建器解析。不要用自定义函数替代它。**`feature()` 只能直接用在 `if` 语句或三元表达式的条件位置**(Bun 编译器限制),不能赋值给变量、不能放在箭头函数体里、不能作为 `&&` 链的一部分。正确:`if (feature('X')) {}` 或 `feature('X') ? a : b`。 +- **`src/` path alias** — tsconfig maps `src/*` to `./src/*`. Imports like `import { ... } from 'src/utils/...'` are valid. +- **MACRO defines** — 集中管理在 `scripts/defines.ts`。Dev mode 通过 `bun -d` 注入,build 通过 `Bun.build({ define })` 注入。修改版本号等常量只改这个文件。 +- **构建产物兼容 Node.js** — `build.ts` 会自动后处理 `import.meta.require`,产物可直接用 `node dist/cli.js` 运行。 +- **Biome 配置** — 大量 lint 规则被关闭(decompiled 代码不适合严格 lint)。`.tsx` 文件用 120 行宽 + 强制分号;其他文件 80 行宽 + 按需分号。 +- **Ink 框架在 `packages/@ant/ink/`** — 不是 `src/ink/`(该目录不存在)。Ink 相关的组件、hooks、keybindings 都在 packages 中。 +- **Provider 优先级** — `modelType` 参数 > 环境变量 > 默认 `firstParty`。新增 provider 需在 `src/utils/model/providers.ts` 注册。 diff --git a/build.ts b/build.ts index 349a21e7ec..3600515abf 100644 --- a/build.ts +++ b/build.ts @@ -40,6 +40,8 @@ const DEFAULT_BUILD_FEATURES = [ 'KAIROS', 'COORDINATOR_MODE', 'LAN_PIPES', + 'BG_SESSIONS', + 'TEMPLATES', // 'REVIEW_ARTIFACT', // API 请求无响应,需进一步排查 schema 兼容性 // P3: poor mode (disable extract_memories + prompt_suggestion) 'POOR', diff --git a/docs/features/daemon-restructure-design.md b/docs/features/daemon-restructure-design.md new file mode 100644 index 0000000000..8d0d3abd8b --- /dev/null +++ b/docs/features/daemon-restructure-design.md @@ -0,0 +1,318 @@ +# Daemon 重构设计方案 + +> 分支: `feat/integrate-5-branches` +> 基于: `f41745cb` (= main `11bb3f62` 内容) +> 日期: 2026-04-13 + +## 一、问题概述 + +### 1.1 命令结构散乱 + +当前后台进程相关的命令分布在三个不同的位置,没有统一的命名空间: + +| 命令 | 注册位置 | 入口 | +|------|---------|------| +| `claude daemon start/status/stop` | `cli.tsx` 快速路径 L203 | `daemon/main.ts` | +| `claude ps` | `cli.tsx` 快速路径 L220 | `cli/bg.ts` | +| `claude logs ` | `cli.tsx` 快速路径 L232 | `cli/bg.ts` | +| `claude attach ` | `cli.tsx` 快速路径 L236 | `cli/bg.ts` | +| `claude kill ` | `cli.tsx` 快速路径 L238 | `cli/bg.ts` | +| `claude --bg` | `cli.tsx` 快速路径 L244 | `cli/bg.ts` | +| `claude new/list/reply` | `cli.tsx` 快速路径 L250 | `cli/handlers/templateJobs.ts` | +| `claude rollback` | `main.tsx` Commander.js L6525 | `cli/rollback.ts` | +| `claude up` | `main.tsx` Commander.js L6511 | `cli/up.ts` | + +**问题**: +- `ps/logs/attach/kill` 与 `daemon` 逻辑上都是后台进程管理,但互不关联 +- 这些命令都**只有 CLI 入口**,REPL 里输入 `/daemon` 或 `/ps` 不存在 +- `new/list/reply` 是模板任务系统的顶级命令,容易与其他命令冲突(特别是 `list`) + +### 1.2 Windows 不支持 + +`--bg` 和 `attach` 硬依赖 tmux: +- `bg.ts:handleBgFlag()` 第一步就检查 tmux,不可用直接报错退出 +- `bg.ts:attachHandler()` 用 `tmux attach-session`,无 tmux 替代方案 +- Windows (包括 VS Code 终端) 完全无法使用后台会话功能 + +### 1.3 无 REPL 入口 + +对比 `/mcp` 的双注册模式: +- **CLI**: `claude mcp serve/add/remove/list` (Commander.js, `main.tsx:5760`) +- **REPL**: `/mcp enable/disable/reconnect` (slash command, `commands/mcp/index.ts`) + +`daemon`/`bg`/`job` 系列只有 CLI 快速路径,REPL 中完全不可用。 + +## 二、目标 + +1. **层级化命令结构**: 参照 `/mcp` 模式,将后台管理收归 `/daemon`,模板任务收归 `/job` +2. **跨平台后台会话**: Windows / macOS / Linux 都能启动、附着、终止后台会话 +3. **双注册**: CLI (`claude daemon ...`) + REPL (`/daemon ...`) 同时可用 +4. **向后兼容**: 旧命令保留但输出 deprecation 提示 + +## 三、命令结构设计 + +### 3.1 `/daemon` — 后台进程管理 + +合并 daemon supervisor + bg sessions 为统一命名空间: + +``` +claude daemon ← CLI 入口 (cli.tsx 快速路径) +/daemon ← REPL 入口 (slash command, local-jsx) + +子命令: + status 综合状态面板 (daemon + 所有会话) + start [--dir ] 启动 daemon supervisor + stop 停止 daemon + bg [args...] 启动后台会话 + attach [target] 附着到后台会话 + logs [target] 查看会话日志 + kill [target] 终止会话 + (无参数) 等同于 status +``` + +**CLI 快速路径路由** (`cli.tsx`): +```typescript +// 新: 统一入口 +if (feature('DAEMON') && args[0] === 'daemon') { + const sub = args[1] || 'status' + switch (sub) { + case 'start': case 'stop': case 'status': + await daemonMain([sub, ...args.slice(2)]) + break + case 'bg': + await bg.handleBgStart(args.slice(2)) + break + case 'attach': case 'logs': case 'kill': + await bg[`${sub}Handler`](args[2]) + break + } +} + +// 向后兼容 (deprecated) +if (feature('BG_SESSIONS') && ['ps','logs','attach','kill'].includes(args[0])) { + console.warn(`[deprecated] Use: claude daemon ${args[0] === 'ps' ? 'status' : args[0]}`) + // ... delegate to daemon subcommand +} +``` + +**REPL 斜杠命令** (`commands/daemon/index.ts`): +```typescript +const daemon = { + type: 'local-jsx', + name: 'daemon', + description: 'Manage background sessions and daemon', + argumentHint: '[status|start|stop|bg|attach|logs|kill]', + isEnabled: () => feature('DAEMON') || feature('BG_SESSIONS'), + load: () => import('./daemon.js'), +} satisfies Command +``` + +### 3.2 `/job` — 模板任务管理 + +``` +claude job ← CLI 入口 +/job ← REPL 入口 + +子命令: + list 列出模板和活跃任务 + new