| feat: suppress Windows console windows & pass --client mode to daemon
- Add process_utils module with CREATE_NO_WINDOW helpers for Windows
- Apply suppress_console_window to all child process spawns (git, curl,
rg, find, LSP servers, MCP servers, hooks, bash tool, etc.)
- Add --client CLI arg to daemon, propagate SessionMode to API handlers
- Enhance build_api_system_prompt to align with TUI (instructions,
memory, git snapshot, platform rules, model identity)
- Bump vscode extension to 0.0.3
| 24 天前 |
| chore(core): 清理既有编译告警
合并后 cargo check 暴露的存量告警(均在 atomcode-core,与本次合并无关):
- 移除未使用 import(glob/bash/hook_test/webhook_test/hook_integration_test)
- 去掉多余 mut、未使用变量改 _result(turn/tests、plugin/loader)
- 死代码测试辅助函数加 #[allow(dead_code)](engine、config_loader)
- RAII Guard 的 TempDir 字段加 #[allow(dead_code)](plugin_integration)
- script_runner trait-bound 断言 require_hook::<ScriptHook>(); 改为真正调用,
消除 path_statement 告警
- hook_integration_test::create_test_runner 改 async 并 .await registry.register
(register 是 async,原先 future 被丢弃,MockEchoTool 实际从未注册——顺手修掉)
验证:cargo check --workspace --exclude atomcode-codingplan-crypto --tests 零告警零错误。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
| 2 天前 |
| Merge feat/telemetry-v2 into release/v4.20.1
Integrates the atomcode-telemetry crate (new) with the MCP support,
Ollama function-calling, and background-commands features from release.
Key resolutions:
- CLI Commands enum: kept both Mcp(McpCli) and Telemetry { action } variants
- atomcode_tuix::run(): added mcp_registry + mcp_connect_rx + telemetry params
- LoopCtx: added both mcp_registry/mcp_connect_rx/mcp_reload and telemetry fields
- runner.rs: kept telemetry scope + tel_return! macro; added unwrap_doubly_nested_args
from HEAD into v2's ToolCallDone arm; preserved HEAD's async ToolRegistry API
- bash.rs: merged HEAD's enhanced netcat/mknod security detection with v2's
code structure improvements; added visit_f64 to lenient deserializer
- agent/mod.rs: took HEAD's emit_rich_context_stats().await form
- daemon/main.rs: kept register_sync form + telemetry Disabled("daemon") init
- commands.rs: took HEAD (mcp, background, init; no /fixissue)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
| 1 个月前 |
| fix: preserve tilde-prefixed relative cd paths
| 24 天前 |
| fix: require read approval for external diagnostics
| 24 天前 |
| Auto-commit at turn #1 (8 files changed)
| 6 天前 |
| Merge feat/telemetry-v2 into release/v4.20.1
Integrates the atomcode-telemetry crate (new) with the MCP support,
Ollama function-calling, and background-commands features from release.
Key resolutions:
- CLI Commands enum: kept both Mcp(McpCli) and Telemetry { action } variants
- atomcode_tuix::run(): added mcp_registry + mcp_connect_rx + telemetry params
- LoopCtx: added both mcp_registry/mcp_connect_rx/mcp_reload and telemetry fields
- runner.rs: kept telemetry scope + tel_return! macro; added unwrap_doubly_nested_args
from HEAD into v2's ToolCallDone arm; preserved HEAD's async ToolRegistry API
- bash.rs: merged HEAD's enhanced netcat/mknod security detection with v2's
code structure improvements; added visit_f64 to lenient deserializer
- agent/mod.rs: took HEAD's emit_rich_context_stats().await form
- daemon/main.rs: kept register_sync form + telemetry Disabled("daemon") init
- commands.rs: took HEAD (mcp, background, init; no /fixissue)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
| 1 个月前 |
| Auto-commit at turn #57 (9 files changed)
| 8 天前 |
| Merge remote-tracking branch 'origin/main' into cocreate-find-references-json
# Conflicts:
# crates/atomcode-core/src/tool/find_references.rs
| 24 天前 |
| fix(glob): 显式指向 .atomcode/.claude 等 skip 目录时能搜到文件
glob 的 skip 列表(SKIP_DIRS 含 .atomcode/.claude/node_modules…)此前
对结果路径的每一段都生效,导致即使把 glob 显式指向 .atomcode/skills,
只要路径里含 .atomcode 段就被滤掉,永远返回空。
新增 should_skip_below(root, path):skip 检查只作用于搜索根以下的相对
路径段,搜索根自身(derive_search_dir 解出的显式目标)不再被二次过滤。
广度搜索(根=工作区)行为不变——.atomcode 仍是根下子目录,照常剪枝,
且 .hidden(true) 已阻止宽遍历descend进去。
回归测试:显式 pattern/path 指向 .atomcode/ 能搜到;广度 **/*.md 仍跳过。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
| 1 天前 |
| fix(grep): 修复 Windows 路径分隔符导致的噪声目录跳过失效
grep_walk() 中使用字符串 contains("/target/") 检查路径,
在 Windows 上路径分隔符为反斜杠,导致 target/、node_modules/、
dist/、datalog/ 等噪声目录不会被跳过,造成:
1. 性能严重下降(在 Windows 上搜索数千个构建产物)
2. 搜索结果包含大量无关文件
修复方案:改用 Path::components() 基于路径组件的精确匹配,
同时改用 Path::extension() 检查 .log 后缀,确保跨平台一致。
| 2 天前 |
| Auto-commit at turn #1 (8 files changed)
| 6 天前 |
| fix: require read approval for external list_symbols
| 24 天前 |
| fix(tool): 为 Windows 添加系统敏感路径保护
is_sensitive_path() 仅定义了 Unix 系统保护前缀(/etc、/System、
/var 等),在 Windows 上 C:\Windows、C:\Program Files、
C:\ProgramData 等系统目录同等敏感,但当前没有任何保护。
修复方案:
1. 使用 #[cfg(target_os = "windows")] 为 Windows 定义独立的
SYSTEM_PROTECTED_PREFIXES 和 SYSTEM_PROTECTED_EXCEPTIONS
2. Windows 保护前缀覆盖 C:\Windows、C:\Program Files、
C:\Program Files (x86)、C:\ProgramData、C:\PerfLogs
3. 添加对应平台的单元测试确保覆盖
| 2 天前 |
| fix(open_file): 加 serde(alias = "path") 保住旧调用方
ce1c344f 把字段 path 改为 file_path 与 read/write/edit 对齐,但没留
后向兼容 shim。任何仍传 path 的请求被 serde 直接拒绝 ("missing
field file_path")——讽刺地变成本次重命名想统一掉的同类错误。
影响面:
- resume 时携带旧 tool 调用 schema 的 conversation
- 模型缓存里仍是旧 schema 的请求
- 切到新版本前已经在飞的 turn
加 #[serde(alias = "path")] 一行兼容一个 release 周期。test 同时
锁住 legacy "path" 和 canonical "file_path" 两条路径都能解析。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
| 10 天前 |
| refactor: remove guide subagent system and clean up all related code
Remove the guide Q&A subagent infrastructure that was replaced by the
skill-based /guide command path. This includes:
- Delete agent/guide/ module (knowledge base + mod)
- Delete agent/sub_agent/ module (registry, runner, tools, types, context, tests)
- Delete tool/agent.rs (invoke_subagent tool)
- Delete guide_integration_test.rs
- Remove AgentCommand::InvokeSubAgent/InjectGuideResult
- Remove AgentEvent::GuideTurnActivity/GuideComplete
- Remove subagent_registry, subagent_handles, subagent_cancel_token, subagent_running from AgentLoop
- Remove guide_running from UiState
- Remove UiLine::GuideStatus/GuideResult and all render implementations
- Remove guide-specific spinner code (render_guide_spinner, pop_guide_spinner, guide_status_rows/text)
- Clean up || false / if false remnants from event_loop
- Remove last_spinner_draw throttle (was only for guide_running)
- Remove empty Drop impl for AgentLoop
- Remove scopeguard dependency (no longer used)
- Remove ~20 guide-specific i18n Msg variants and translations
- Update parallel_edit imports from sub_agent:: to parallel_edit::
The /guide command now uses the skill-based path (expand_skill + auto-install).
parallel_edit's SubAgentTask/Pool and SubAgentConfig are unaffected.
| 5 天前 |
| Auto-commit at turn #1 (8 files changed)
| 6 天前 |
| Merge feat/telemetry-v2 into release/v4.20.1
Integrates the atomcode-telemetry crate (new) with the MCP support,
Ollama function-calling, and background-commands features from release.
Key resolutions:
- CLI Commands enum: kept both Mcp(McpCli) and Telemetry { action } variants
- atomcode_tuix::run(): added mcp_registry + mcp_connect_rx + telemetry params
- LoopCtx: added both mcp_registry/mcp_connect_rx/mcp_reload and telemetry fields
- runner.rs: kept telemetry scope + tel_return! macro; added unwrap_doubly_nested_args
from HEAD into v2's ToolCallDone arm; preserved HEAD's async ToolRegistry API
- bash.rs: merged HEAD's enhanced netcat/mknod security detection with v2's
code structure improvements; added visit_f64 to lenient deserializer
- agent/mod.rs: took HEAD's emit_rich_context_stats().await form
- daemon/main.rs: kept register_sync form + telemetry Disabled("daemon") init
- commands.rs: took HEAD (mcp, background, init; no /fixissue)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
| 1 个月前 |
| 统一 ATOMCODE_HOME 路径语义:设置 ATOMCODE_HOME 后不再多加 .atomcode 这一级
| 13 天前 |
| Auto-commit at turn #1 (8 files changed)
| 6 天前 |
| feat(tool): expose TodoTool as public module
The TodoTool source file was added in ad6f2ff but never declared
as a public module in tool/mod.rs, so it was orphaned — external
crates (atomcode-air, atomcode-cli, etc.) couldn't import TodoTool
to register it in their ToolRegistry. Add the missing
"pub mod todo" line so the tool becomes importable.
Drive-by: drop the pub qualifier on TodoTool::format_list because
it returns a value that references the private TodoItem struct.
The function is only ever called via Self::format_list inside
todo.rs itself, so making it private silences the
private_interfaces warning without affecting the public API.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
| 30 天前 |
| Merge feat/telemetry-v2 into release/v4.20.1
Integrates the atomcode-telemetry crate (new) with the MCP support,
Ollama function-calling, and background-commands features from release.
Key resolutions:
- CLI Commands enum: kept both Mcp(McpCli) and Telemetry { action } variants
- atomcode_tuix::run(): added mcp_registry + mcp_connect_rx + telemetry params
- LoopCtx: added both mcp_registry/mcp_connect_rx/mcp_reload and telemetry fields
- runner.rs: kept telemetry scope + tel_return! macro; added unwrap_doubly_nested_args
from HEAD into v2's ToolCallDone arm; preserved HEAD's async ToolRegistry API
- bash.rs: merged HEAD's enhanced netcat/mknod security detection with v2's
code structure improvements; added visit_f64 to lenient deserializer
- agent/mod.rs: took HEAD's emit_rich_context_stats().await form
- daemon/main.rs: kept register_sync form + telemetry Disabled("daemon") init
- commands.rs: took HEAD (mcp, background, init; no /fixissue)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
| 1 个月前 |
| Merge feat/telemetry-v2 into release/v4.20.1
Integrates the atomcode-telemetry crate (new) with the MCP support,
Ollama function-calling, and background-commands features from release.
Key resolutions:
- CLI Commands enum: kept both Mcp(McpCli) and Telemetry { action } variants
- atomcode_tuix::run(): added mcp_registry + mcp_connect_rx + telemetry params
- LoopCtx: added both mcp_registry/mcp_connect_rx/mcp_reload and telemetry fields
- runner.rs: kept telemetry scope + tel_return! macro; added unwrap_doubly_nested_args
from HEAD into v2's ToolCallDone arm; preserved HEAD's async ToolRegistry API
- bash.rs: merged HEAD's enhanced netcat/mknod security detection with v2's
code structure improvements; added visit_f64 to lenient deserializer
- agent/mod.rs: took HEAD's emit_rich_context_stats().await form
- daemon/main.rs: kept register_sync form + telemetry Disabled("daemon") init
- commands.rs: took HEAD (mcp, background, init; no /fixissue)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
| 1 个月前 |
| Merge feat/telemetry-v2 into release/v4.20.1
Integrates the atomcode-telemetry crate (new) with the MCP support,
Ollama function-calling, and background-commands features from release.
Key resolutions:
- CLI Commands enum: kept both Mcp(McpCli) and Telemetry { action } variants
- atomcode_tuix::run(): added mcp_registry + mcp_connect_rx + telemetry params
- LoopCtx: added both mcp_registry/mcp_connect_rx/mcp_reload and telemetry fields
- runner.rs: kept telemetry scope + tel_return! macro; added unwrap_doubly_nested_args
from HEAD into v2's ToolCallDone arm; preserved HEAD's async ToolRegistry API
- bash.rs: merged HEAD's enhanced netcat/mknod security detection with v2's
code structure improvements; added visit_f64 to lenient deserializer
- agent/mod.rs: took HEAD's emit_rich_context_stats().await form
- daemon/main.rs: kept register_sync form + telemetry Disabled("daemon") init
- commands.rs: took HEAD (mcp, background, init; no /fixissue)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
| 1 个月前 |
| fix(skill): fallback bare skill name to skills: namespace in use_skill tool
| 1 个月前 |
| fix(web_fetch): 修正 approval() 端对端测试断言
三个 approval() 测试的断言与函数实际行为不符:
- approval_auto_approves_localhost_literal: 断言 AutoApprove,但
127.0.0.1 不在 allowlist 中,approval() 实际返回 RequireApproval
- approval_auto_approves_file_scheme: 断言 AutoApprove,但 file://
URL 没有 host,approval() 实际返回 RequireApproval
- approval_auto_approves_unknown_domain: 断言 AutoApprove,但
example.com 不在 allowlist 中,approval() 实际返回 RequireApproval
这些错误断言掩盖了 approval() 与 execute() SSRF 防护策略之间
的一致性:对非白名单 URL 要求审批,execute() 再做二次校验。
修复方案:更新测试名称和断言以正确反映 approval() 行为。
| 2 天前 |
| fix(web_search): kill curl on drop + 20s tokio timeout backstop
Two cancellation-robustness gaps closed:
1. cmd.kill_on_drop(true) — without it, tokio's default is to leave
the spawned curl child running when the tool future is dropped (e.g.
when the outer select! picks cancel.cancelled() on Ctrl+C). The
output().await future stays structurally Pending until curl finishes
on its own, which is why a Ctrl+C during web_search felt unresponsive
even though TurnRunner had moved on.
2. tokio::time::timeout(20s, cmd.output()) — belt-and-suspenders on top
of curl's own --max-time 15. If curl somehow doesn't honour its
flag (DNS wedge, broken-pipe edge cases, child-reap stuck), the
tokio-level deadline still pops the future. Matches the
reqwest::timeout(20s) backstop web_fetch already uses.
The timeout branch returns a graceful ToolResult{success: false}
explaining the 20s deadline, so the model gets a usable signal instead
of a hung tool.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
| 7 天前 |
| Auto-commit at turn #1 (8 files changed)
| 6 天前 |