| feat(referral): add invite referral tracking system
- Add --invite= / ATOMCODE_INVITE support to install.sh and install.ps1,
writing pending_invite file with invite code, install UUID, and timestamp
- Create pending_invite.rs module to parse and validate pending_invite file
with 30-day expiry and format checks
- Add maybe_emit_install_completed() to Telemetry, emitting InstallCompleted
event on first launch after referral install
- Attach invite_code and install_uuid to LoginSuccess events across CLI
login, daemon API login, and codingplan setup paths
- Add referral.html landing page with invite code generation, metrics
dashboard (devices, active users, conversion rate, settlement), leaderboard
and rules
| 2 天前 |
| feat(referral): add invite referral tracking system
- Add --invite= / ATOMCODE_INVITE support to install.sh and install.ps1,
writing pending_invite file with invite code, install UUID, and timestamp
- Create pending_invite.rs module to parse and validate pending_invite file
with 30-day expiry and format checks
- Add maybe_emit_install_completed() to Telemetry, emitting InstallCompleted
event on first launch after referral install
- Attach invite_code and install_uuid to LoginSuccess events across CLI
login, daemon API login, and codingplan setup paths
- Add referral.html landing page with invite code generation, metrics
dashboard (devices, active users, conversion rate, settlement), leaderboard
and rules
| 2 天前 |
| feat(plugin): auto-install default skills marketplace + auto-update on upgrade
Two startup-time hooks land in plugin::bootstrap, both default-on
and config-gated ([plugin] section, auto_install_default_skills
and auto_update_marketplaces).
Plan A — first-startup install of atomcode-skills:
- Triggered when ~/.atomcode/.plugin_bootstrap_v1 marker is absent.
- git clone the default skills marketplace from
https://atomgit.com/atomgit_atomcode/atomcode-skills.git.
- Marker is touched after the attempt (success OR failure) so the
install fires exactly once per host. A later /plugin uninstall
is respected — the marker stays, no auto-reinstall.
- To force a retry: rm ~/.atomcode/.plugin_bootstrap_v1.
Plan B — post-self-upgrade refresh of every installed marketplace:
- Gated on ATOMCODE_UPGRADED_FROM env var (set by
self_update::re_exec_self after a successful binary upgrade).
- git pull --ff-only each installed marketplace so skills stay
in lockstep with the binary.
- Failures (no network, ff-only conflict, etc.) print a stderr
warning and continue — never block startup.
Both functions are best-effort: every error path falls through to
eprintln! and atomcode boots into a working state.
Wiring point: cli/main.rs after Config::load and i18n locale setup,
before the TUI / headless runtime starts. Roughly 1-3 s of git
subprocess time on the warm path (none on subsequent startups thanks
to the marker).
8 Config{} initializers across cli/main.rs, daemon/api_config.rs,
modals/onboarding_wizard.rs, coding_plan/setup.rs, vision_preprocessor.rs,
tool/parallel_edit.rs, turn/tests.rs, and config/mod.rs gain
plugin: Default::default() to satisfy the new mandatory field.
3 unit tests cover marker filename versioning and short-commit
formatting. All 54 plugin tests + 124 config tests pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
| 13 天前 |
| fix(webui): 编辑模型时支持修改名称
name 是后端 providers map 的主键,此前 PATCH 无重命名路径,故名称输入框在编辑时被禁用。
现在让后端支持改名:PATCH 增加可选 name 字段,校验并按 key 迁移条目,命名冲突返回 409,
并在 default_provider 指向旧名时一并修正。前端放开输入框,仅在改名时传 name,改名后用新名
设默认;编辑模式也执行重复名校验(排除自身原名)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
| 1 天前 |
| feat(daemon): webui 敏感路由 token 鉴权(仅 webui 模式强制,不破坏 VSCode)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
| 5 天前 |
| fix(webui): /webui 用 TUI 当前会话播种 LiveSession,续聊后直接落到该会话
atomcode -c 续聊后 ctx.current_session 已是续聊会话,但 /webui 调用的是
ensure_live_session——新建空 LiveSession(空消息 + 随机 LIVE_SESSION_ID),从不把
当前会话搬进去。于是 webui 连 /live 拿到空快照、落到空白新页面而非续聊会话。
- live_api.rs:新增 ensure_live_session_seeded(initial, session_id),新建时用给定消息
播种并复用 session_id(LIVE_SESSION_ID + 执行器 id 一致,后续每轮覆盖同一会话文件、
不产生重复);ensure_live_session 改为空播种封装。lib.rs 导出之。
- commands.rs:/webui 在开浏览器之前先用 ctx.current_session 的消息+id 播种(非空才复用
id;先播种再开浏览器,避免浏览器抢先连 /live 建出空会话)。attach_live_session 加
render_snapshot 参数:/webui 传 false(画面已有该对话,跳过快照回放避免重复刷),
/sync 传 true(重新附着补 webui 期间对话)。
live 测试 core(4)/daemon(3) 全过;LiveSession initial 播种本就被 core 测试覆盖。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
| 18 小时前 |
| fix(webui): /webui 用 TUI 当前会话播种 LiveSession,续聊后直接落到该会话
atomcode -c 续聊后 ctx.current_session 已是续聊会话,但 /webui 调用的是
ensure_live_session——新建空 LiveSession(空消息 + 随机 LIVE_SESSION_ID),从不把
当前会话搬进去。于是 webui 连 /live 拿到空快照、落到空白新页面而非续聊会话。
- live_api.rs:新增 ensure_live_session_seeded(initial, session_id),新建时用给定消息
播种并复用 session_id(LIVE_SESSION_ID + 执行器 id 一致,后续每轮覆盖同一会话文件、
不产生重复);ensure_live_session 改为空播种封装。lib.rs 导出之。
- commands.rs:/webui 在开浏览器之前先用 ctx.current_session 的消息+id 播种(非空才复用
id;先播种再开浏览器,避免浏览器抢先连 /live 建出空会话)。attach_live_session 加
render_snapshot 参数:/webui 传 false(画面已有该对话,跳过快照回放避免重复刷),
/sync 传 true(重新附着补 webui 期间对话)。
live 测试 core(4)/daemon(3) 全过;LiveSession initial 播种本就被 core 测试覆盖。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
| 18 小时前 |
| feat(telemetry): webui chat 上报 mode 区分为 webui
webui 此前发往 daemon 的请求不带 X-AtomCode-Client,导致 daemon
按默认值把 mode 归到 ide,无法在上报数据中区分 webui 流量。
- SessionMode 新增 Webui 变体(序列化为 "webui")并补序列化测试
- daemon 启动 match 增加 webui 映射(resolve_client_mode 中的映射随
上一提交已落入 lib.rs)
- webui authHeaders() 统一为所有请求带上 X-AtomCode-Client: webui
效果:从 webui 发起的 chat,其 LlmChat(含 token 消耗)上报 mode
字段为 webui,可与 vscode/ide 区分。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
| 1 天前 |
| feat(daemon): 权限桥接通道 PermissionResponders
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
| 5 天前 |
| feat(telemetry): distinguish client source via X-AtomCode-Client header
- Add SessionMode::Vscode and SessionMode::AtomcodeAir enum variants
- Daemon middleware resolves X-AtomCode-Client header to SessionMode:
'vscode' → Vscode, 'atomcode-air' → AtomcodeAir, else → Ide (fallback)
- chat_stream extracts resolved mode from request extensions
- daemon_scope helper accepts mode parameter for other handlers
- VS Code extension sends X-AtomCode-Client: vscode on all requests
- Also: spawn daemon with workspace cwd for correct .mcp.json loading
- Also: per-project MCP registry cache (multi-window isolation)
| 25 天前 |
| feat(webui): /webui stop + dev 重定向 + 文档
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
| 5 天前 |