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
5 changes: 3 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ The Superpowers plugin is disabled for this repository. Do not invoke or follow
- **Daemon**:[src/apps/daemon/cli.cpp](src/apps/daemon/cli.cpp) → `worker.cpp::run_worker`(已近 1000 行上限,装配往外拆),写 `<data_dir>/run/` 运行文件,服务 [src/apps/web/](src/apps/web) 路由与 WebSocket。
- **Headless**(`acecode -p "<prompt>"`):`command_dispatch.cpp::dispatch_non_tui_command` → [headless_runner.cpp](src/apps/headless/headless_runner.cpp),无 run/ 文件、无心跳、无 Crow,会话正常落盘可 resume。`headless::active()` 两个消费点:权限门(默认自动拒绝并给模型解释,`--yolo` 全放行)与 AskUserQuestion 自动应答。`-c` 接最近会话,`--resume <id>` 在 print 模式 id 必填,`--session-id` 自定 id,`--output-format json` 成败都出单个 result 对象;未传模型走默认模型、权限固定 default、`--max-turns` 默认无限;`--disable-tools` / `--enable-skills` / `--enable-mcp` 与 `--list-tools` / `--list-skills` / `--list-mcp`,未知名称 exit 64。归档:Current Runtime Surfaces。
- **Desktop**:[src/apps/desktop/](src/apps/desktop),每个 workspace 一个 daemon 子进程(独立端口 / token / Job Object),webview 经同进程 bridge 调用,daemon 内部零改动。见 [docs/desktop-shell/multi-workspace.md](docs/desktop-shell/multi-workspace.md)。
- **Android**:[android/](android/README.md),APK 内带 Ubuntu 小系统,用 Termux 的 proot 跑原版 Linux `acecode daemon`,全屏 WebView 打开 Web UI;targetSdk 刻意停在 28(只能侧载);daemon 必须带 `--require-local-token`(安卓所有 App 共用回环地址,本机免 token 不成立),所以 Linux 包要用含这个开关的版本。
- 进程级服务(工具重写加载、审计库、记忆运行时、LSP、代理探测、数据目录告警补记)在 worker.cpp / TUI main.cpp / headless_runner.cpp 各自接线;新增进程级服务要逐个入口核对,别只接 daemon。工具注册在三处启动时各做一次,`/model` 中途切换不重建 ToolExecutor。

## Agent Loop 与工具
Expand All @@ -46,7 +47,7 @@ The Superpowers plugin is disabled for this repository. Do not invoke or follow
- **GPT 系 apply_patch**:判定只看模型 id(`model_family.cpp::model_prefers_apply_patch`),不看 provider 名;三个编辑工具始终注册、只裁模型侧定义表(`filter_tool_definitions_for_model`),system prompt 按模型族分支,非 GPT 模型输出逐字节不变(`system_prompt_test.cpp::NonGptModelStateIsByteIdenticalToLegacyPrompt`);`apply_patch` 先全量校验再落盘,权限门按路径集合走,Delete / Move 源也要 `track_file_write_before`;表面只扫 header 行。归档:GPT 系模型适配。
- **具体进度提示(工具前言 v4)**:文案全部由 daemon 生成(`engine/tool_preamble/`:推理加粗标题 > 工具模板 > 场景文案),loading 只说正在做什么、不带参数、不依赖模型配合;开关 `agent_loop.tool_preamble.enabled`(设置 > 常规 > 工作模式);只在 `emit_agent_progress` 一个口子替换。前三版(先说一句话 / 必填参数 / `<text_preamble>` 标签)都被否,别做回去;历史标签只剥不用。归档:具体进度提示。
- **提问**:`agent_loop.question_policy` ask / deny / timeout(`question_timeout_seconds` 默认 60);YOLO 不改提问策略;active goal 覆盖为 30 秒超时采纳推荐项。**提问期间的插话**走 `AgentLoop::interject_question`(同回合 soft steer,tool_result 标 interjected,`question_closed.reason=interjected`),**不要**改成 `interrupt_turn`。归档:提问期间的插话。
- **回复中的三种发送**(对标 Claude 桌面版 next / later / now):Enter = 软插话 `/turn/steer`,先画在对话末尾(`SteeredMessages`,排队状态 `lane: 'steer'`),气泡上「立即发送」走 `/turn/steer/send-now`(服务端把这条未读插话提成优先回合并打断,**不要**改成再调 `/turn/interrupt` 重发,会发两遍)、撤回走 `/turn/steer/withdraw`;回合结束仍未读的插话转回排队卡片;Ctrl+Enter = 排到回合结束(原排队卡片),Ctrl+Alt+Enter = `fork` 带 `whole: true` 复制整个会话后在新会话发送。见 [docs/daemon-api.md](docs/daemon-api.md)。
- **回复中的三种发送**(对标 Claude 桌面版 next / later / now):Enter = 软插话 `/turn/steer`,先画在对话末尾(`SteeredMessages`,排队状态 `lane: 'steer'`),气泡上「立即发送」走 `/turn/steer/send-now`(服务端把这条未读插话提成优先回合并打断,**不要**改成再调 `/turn/interrupt` 重发,会发两遍)、撤回走 `/turn/steer/withdraw` 且**消息退回输入框不删**(已有内容时放前面换行,`steerWithdrawal.js`);回合结束仍未读的插话转回排队卡片;Ctrl+Enter = 排到回合结束(原排队卡片),Ctrl+Alt+Enter = `fork` 带 `whole: true` 复制整个会话后在新会话发送。见 [docs/daemon-api.md](docs/daemon-api.md)。
- **侧边对话只放只读工具**(`side_chat.cpp` 小工具循环):白名单 `file_read` / `grep` / `glob` / `lsp` 与会话策略取交集,MCP 一律不放,**不要**改成按 `is_read_only` 筛;凡要弹确认的一律拒绝;在 `MtimeTracker::DetachedReadScope` 里执行;Web 侧边多一个 `send_to_main_session`,用户确认之前绝不送达,送达走 `send_side_chat_message`(有可插话回合就 steer,否则普通 send)。归档:侧边对话只放只读工具。
- **后台任务**:会话级登记表(`tool/background_tasks`,AgentLoop 持有)管后台命令与后台子代理,结束时经邮箱通知会话(在跑就模型边界插入,空闲就开新回合);bash 前台超时**转后台不杀**、`run_in_background` / `monitor`、开头长 sleep 拒绝;用户插话 / 「转到后台」/ TUI Ctrl+B 让前台工作让路;通知落盘为 user + `metadata.background_task`,按内部上下文处理(不计回合、不当标题)。全文 [docs/background-tasks.md](docs/background-tasks.md)。
- **子代理 / 蜂群**:`spawn_subagent` / `wait_subagent` 双端注册,子会话是普通 SessionRegistry 会话(父 cwd + 权限模式),不能再派子代理;子会话从会话列表隐藏、始终跟随主会话(无单独归档 / 删除,主会话永久删除才级联);蜂群 `off | star | mesh` 两套工具互斥,邮件进 AgentLoop 邮箱,信封落盘为 user 角色 + `metadata.inter_agent`,子 agent 完成不唤醒空闲父 agent,Web 芯片只在与服务端模式不同时才随消息提交 `swarm_mode`。全文 [docs/subagents.md](docs/subagents.md)。
Expand Down Expand Up @@ -131,4 +132,4 @@ The Superpowers plugin is disabled for this repository. Do not invoke or follow
## CI / Release

- `package.yml` 出 Linux x64/arm64、Windows x64/arm64、macOS x64/arm64,`v*` tag 自动发版;`release-tag.yml` 手动打注解 tag 并显式 `gh workflow run package.yml`,发布门槛仍是该提交的 test.yml 通过。npm 发布暂停(`if: ${{ false }}`),实现保留。归档:CI / Release。
- **自研 Windows 安装程序**(`src/apps/installer/` → `acecode-setup`,尚未进 package.yml):安装包由 `installer/windows/make_setup.py` 用 `UpdateResource` 嵌进资源区(别拼在文件尾,签名会坏),只装当前用户目录;`acecode_installer_support` 只许链 desktop_support + base_core;本机实测先设 `ACECODE_SETUP_TEST_ROOT` 与 `USERPROFILE` 进沙盒,否则会接管本机已有的 Inno 安装。见 [docs/windows-installer.md](docs/windows-installer.md)。
- **自研 Windows 安装程序**(`src/apps/installer/` → `acecode-setup`,package.yml 出 x64 / ARM64):安装包由 `installer/windows/make_setup.py` 用 `UpdateResource` 嵌进资源区(别拼在文件尾,签名会坏),只装当前用户目录;`acecode_installer_support` 只许链 desktop_support + base_core;界面模式在工作线程上装,COM 调用(快捷方式)必须自己进套间,开发机测不出;本机实测先设 `ACECODE_SETUP_TEST_ROOT` 进沙盒,否则会接管本机已有的安装。见 [docs/windows-installer.md](docs/windows-installer.md)。
9 changes: 9 additions & 0 deletions android/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
.gradle/
.kotlin/
build/
app/build/
local.properties
*.keystore
keystore.properties
runtime/out/
runtime/cache/
Loading
Loading