Repository navigation
release v0.5.3 - #46
Merged
Merged
Conversation
README 头部 SVG 的「字小、线细、锯齿」三个根因与修法: 1. 字小 —— 画布 960x280 经 width=100% 引用后在 GitHub 阅读栏(1012px) 只剩 ~295px 高。改为 1200x300,主标题 100→88px(配 letter-spacing 撑满)、 底部文案 18→23px。删掉副标题后标题整体下移到视觉居中。 2. 线细 —— 原字体栈以 'SF Mono','Cascadia Code' 打头,Windows 会落到 Courier New(细衬线等宽)。字体栈改为 ui-monospace 打头; 主标题改 fill + 同色 stroke + paint-order 加粗字面。 3. 锯齿 —— 0.4px 级描边在 Retina 上被采样成灰虚线。全部细线提到 >=1.6px 且落在整数设备像素;移除 0.4px 网格线。 排版取舍: - 背景改为纯色 #0b1118,不使用渐变。 - 删除副标题「智械体集群 // AGENT CLUSTER」。 - 不加角标等装饰性元素,只保留刻度尺 / HUD 角标 / 边框 / 分隔线。 - 底部文案含「零情绪」,属此前已否掉的自造氛围词,删除; 压成四个短标签(契约回流 / 冲突裁决 / 证据分级 / 结论收束)。 exmachina-icon.svg 未改动。
通道网关(后端):
- 新增 qqbot 适配器:开放平台 WS 长连接,token 缓存提前刷新,断线先 Resume 再
Identify,被动回复携带 msg_id + 递增 msg_seq,sandbox 可选
- 新增 napcat 适配器:OneBot 11 正向 WS(NapCat / Lagrange 通用),读循环常开 +
mpsc 专职写任务,数组段与 CQ 码双格式解析
- 通道配置平台目录化:Channel.config{} 扩展配置,新平台零结构体改动;
create 校验 qqbot 需 appId/appSecret、napcat 需 url
- 通道运行状态:适配器连上/断开/出错覆盖上报,GET /api/channels/status 查询,
删除/停用即清除
- 密钥全链路掩码回显(***已配置***):顶层 token/secret + 敏感 config 键;
更新三态语义(掩码沿用 / 空清除 / 新值)
- 修复:PUT /channels/:id 的 body.id 无默认值,前端更新通道(不发 id)一直 422,
通道编辑与启停开关自上线即不可用;补 #[serde(default)] + e2e 锁定
WebUI:
- 通道页重写为平台目录驱动(PLATFORMS):表单/凭证判定/回复形态由目录出,
状态列轮询运行状态(已连接 / 连接异常 + 明细)
- 修复:ModelsView 本地掩码哨兵 ***MASK*** 与后端 ***已配置*** 漂移,编辑档案
不改密钥会把掩码字面量存成 API Key;统一为 api.ts 共享 KEY_MASK
- i18n 架构化:i18n/ 注册表(TKey 编译期键检查,en 缺键回退 zh,新语言零成本),
全部视图清扫,中英双份词条
- 布局修复:对话页与右侧会话栏间距(row-reverse 无 gap)
验证:
- cargo check --workspace 零警告;e2e 103/103(新增通道校验/掩码落盘/状态接口
断言;e2e 环境自持,不再随本机 config 漂移)
- npm build 通过;通道页中英表格与编辑弹窗截图复核
模型设置页(原「提供商」页改名,nav.models): - LlmProfile.models[]:每个提供商一份模型清单(模型名 + 视觉/语音能力开关); 默认模型保存时自动并入清单;清单未标记 = 能力未知,输入直通(向后兼容) - 能力模型槽位(capabilities 配置节 + GET/PUT /api/llm/capabilities): 语音合成(TTS)/ 语音识别(语音转述)/ 视觉转述 / 嵌入; 嵌入与记忆页 semanticModel 同一字段(两处入口等价);TTS/STT 由硬编码 tts-1/whisper-1 改为按槽位解析,未配置回落原默认 - 视觉转述降级:生效模型明确 vision=false 且配置了转述模型时,逐图转文字描述注入规划; 未配置则忽略图片并在输入中说明;能力未知保持直通 - UI:提供商卡新增模型清单行(默认 / 视觉 / 语音);页底「能力模型 · 全局默认」卡; 编辑弹窗 Form.List 模型清单(开关 + 增删) 组级能力覆盖(能力槽位不再全局单值): - GroupMeta.capabilities 持久化 + PUT /api/groups/:id/capabilities (空串 = 清除该项跟随全局;全空 = 整块收回) - 槽位解析两级:组覆盖 → 全局槽位 → 出厂默认;TTS / STT / 视觉转述 / 嵌入四处统一 - 组设置弹窗新增「能力模型(组级覆盖)」四槽位,留空 = 跟随全局默认 修复: - tr() 改用 useLang.getState() 同步读语言:原 hook 形式在组件渲染期被调用 (构造 Select options)会把 hook 计入当前组件,两次渲染间钩子数漂移导致 React #310 全树崩溃;同时消除 api.ts / models.ts 三处同类隐患 验证:cargo check 零警告;e2e 全过(模型清单与开关回显、能力槽位写入/回读、 组级覆盖写入/空串清除/落盘回读);npm build 通过;中英双页截图复核
- rust-toolchain.toml / .cargo/config.toml: switch to stable channel so rustup auto-selects the host triple (Linux/macOS/Windows all build without edits); comment updated accordingly. - crates/exm-core/src/tools.rs: mark the local \`pid\` binding with \`cfg_attr(not(target_os = \"windows\"), allow(unused_variables))\`. The PID is only consumed inside the Windows taskkill branch; on POSIX, tokio::Child::kill_on_drop already handles process teardown. Verified on Debian 13 / x86_64-unknown-linux-gnu: `cargo check --workspace` and `cargo build --workspace --release` both report zero warnings; the `exm` / `exmachina` / `exm-gateway` binaries are produced and a `cargo run -p exm-gateway --release` smoke test answers `/api/health` with agents=40, ok=true.
VPS / 容器 / 局域网部署场景下,loopback 默认值导致 '能跑起来但远程 访问不到'。改为: - exm-gateway 默认监听 0.0.0.0,公网/局域网可访问(向后兼容: EXM_HOST=127.0.0.1 或 --host 127.0.0.1 仍可收紧)。 - `exm serve` 新增 --host 选项(短 -H),显式传入覆盖默认 / 环境变量。 - 启动日志链接打印改为绑定到的真实地址(不写死 127.0.0.1)。 API 变化:`exm_gateway::serve(core, port)` → `serve(core, port, host: Option<&str>)`, 库调用方需更新;唯一调用方(exm-cli 与 exm-gateway 独立入口)已同步。
fix(install + gateway bind): host-detected toolchain, silence Linux-only pid, bind 0.0.0.0 by default
…重连竞态、间距统一等)+ 主智能体更名指挥体 + 单体去职责化;并入在途 WIP(browser 闸门/自定义工具/discord/matrix/slack 通道)
…UL.MD)+ 单体人设读写与 plan/converge 双注入 + 默认组/指挥体英文标注映射
… 硬编码与构建日志吞错;bat 改 PS5.1 引导壳全 ASCII 免疫代码页 bug
docs: 移除 README 低性能设备预编译包引导段落
Added a note about the project's inspiration from Ex-Machina in No Game No Life.
思维链与过程透明(对标编码型 Agent):
- provider 双轨流式:解析 reasoning_content/thinking_delta/Gemini thought,新增
StreamDelta::{Text,Thinking};新 WS 事件 orchestrator.thinking / unit.thinking
- tool.call / tool.result 事件(callId/args/ok/耗时/摘要/images),工具执行全程可见
- 审批等待回灌:拦截后原地等待 approvalWaitSecs,批准后代执行、输出直灌模型继续干活
- WebUI 聊天页:思维流折叠、工具执行卡(edit diff/终端输出/截图预览)、内联审批卡
Computer Use:
- computer 工具(enigo 键鼠 + xcap 截屏):screenshot/click/move/scroll/type/key
- 默认关闭显式开启;输入动作过审批闸门 + 动作节流;截图经 ToolResult.images
回灌视觉模型(vision 能力检测)并可在工具卡内预览
WebUI:
- 新增编码工作台 [CODE]:会话 | 工具优先对话流 | 工作区文件树 + 变更清单 + 代码预览
- 网关配套 /api/asset(截图预览)与 /api/fs/list|file(文件树/预览,沙箱只读)
- PWA(manifest + Service Worker + 图标)与移动端抽屉导航;与客户端同端口交付
编成组目录制定稿(多轮评审定稿):
- 组 = groups/<gid>/:group.json + SOUL.md(主智能体人格,仅用户面持有)+
MEMORY.md(组浅层记忆快照,6000 字截断)+ agents/*.json + prompts/*.md + adaptations/
- 单体 = singles/<id>/:agent.json + PROMPT.md + SOUL.md + MEMORY.md
- 子个体无人格层、无独立文件夹(定义+提示词合并存储于组内);深/浅记忆分层语义定稿
- 提示词分层:主智能体偏助手(对话优先/L0 直答)、子个体各司其职(编码位增补作业纪律)、
单体全能;registry 全链适配 + gen-agents.mjs/doctor/install/e2e 同步
桌面端:
- desktop/(Tauri v2):捆绑 exm-gateway sidecar 本机模式 + --remote/--key 远程直连,
退出杀进程树;MSVC 为官方构建目标(README 内说明)
测试:test_config 密封化(强制 Mock + 审批等待 0);新增审批等待回灌三场景用例;
cargo test --workspace 8 单测 + 21 冒烟全绿;npm run build:webui 通过;网关冒烟全过
chore: 接入 OpenSpec 规范驱动开发(openspec/ 骨架 + .gitkeep 放行)
…骨架、patch 补丁工具(统一 diff 解析/整体拒绝/行尾容差)+ coding/ops 白名单
version job 的后缀逻辑(v0.5.2 已存在 → 发 v0.5.2.1)与 publish 的幂等逻辑(tag 已存在 → 挂到既有 tag 覆盖 assets)互相矛盾: 后者救场时白白全平台重构建一遍;若哪天 publish 幂等被改掉, 就会凭空多出一个 .N 重复版本。改为 exists=yes 时所有构建与 发布 job 一律跳过,与文件头注释声明的语义一致。
…deref 为 deny 级)+ 大变体装盒/冗余闭包/可派生 Default 等 56 条机械修复
…/关 autocrlf;fs_save 对带根路径(/etc/passwd)统一 403(原 is_absolute 在 Windows 放行致静默落盘工作区)
…容忍连续 10 次抖动、CLI 超时 kill_on_drop、which→where;video 通道 HTTP 客户端共享单例
… + Windows 测试/路径安全 + nexus 缺陷修复 + CI clippy 门禁)
- PROMPT 423→58 行:只留行为协议(校验先行/播报格式/澄清/错误分级/输出规范/禁止项), 角色与性格设定全部移除(归 SOUL) - SOUL 承接角色定义:Machina 身份、性格一行、自称「本机」、核心优先级 - agent.json 显示名 default → Machina(identifier 不变) - registry 显示名迁移方向反转:default → Machina(存量安装重启自动跟进) - smoke 断言同步:name=Machina、PROMPT 无「你是」、SOUL 含「理性」
ensure_compacted 的滚动摘要逻辑从 orchestrator.rs 抽到 compaction.rs, 单智能体直接循环与组编排共用同一压缩实现(触发阈值/保留窗口/增量合并)。 纯移动 + 接口收口,行为不变。
… 5 头 tungstenite 0.21+ 的 generate_request 要求传入 Request 自带 Host/Connection/Upgrade/Sec-WebSocket-Version/Sec-WebSocket-Key, connect_async(&str) 走的 IntoClientRequest 才补全这些头; napcat.rs 手动 builder 只放了 Authorization,握手必失败: 「Missing, duplicated or incorrect header sec-websocket-key」。 修法:url.into_client_request() 生成规范请求后叠加 Authorization (token 为空则不带)与 X-Client-Role;地址非法分支保留 30s 退避。 已对真实 NapCat 实测:已连结 + 机器人已连结(黑星 2511705734)。
- 通道 group 字段扩展两种值:single:<智能体id> 或组 id(历史组 id 兼容) - 缺省回落默认智能体 machina(不再跟随对话页组切换);machina 缺失取首个智能体 - ChannelRun::begin / webhook 出站统一走 switch_context_to:切换含单体上下文, 执行后 restore_context 还原(Drop guard 覆盖任务中止) - 会话归属按目标 scope 隔离(single:<id> / 组 id),记忆分区同口径 - 创建通道校验绑定目标存在性(智能体查 singles,组查 groups) - WebUI 通道表单分组下拉:智能体(默认,在前)/ 智能体组(集群协作,在后); 表格 Tag 区分展示;文案用「智能体」不叫「单智能体」 - napcat.rs 顺带修 unused mut 警告
last_message_preview / last_active_at / tool_calls / steps 字段加入后, 测试里的 mk() 构造缺字段编译失败,补 None/空默认。
扫码登录: - POST /api/channels/bili-qr 出码(passport web qrcode/generate) - GET /api/channels/bili-qr/:key 轮询(poll):外层 code 仅为 HTTP 层结果, 真实扫码状态在 data.code(86101 未扫/86090 待确认/86083 过期/0 确认) - 确认瞬间从 Set-Cookie 提取 SESSDATA/bili_jct/DedeUserID,查 nav 校验 登录态并取用户名;Cookie 只在 poll 响应回给前端填表单,不落盘 - 前端 BiliQrLoginModal:qrcode 本地渲染、2s 轮询、已扫蒙层、过期自动 换码、成功自动回填 Cookie 并 toast 用户名;表单 sessdata 字段挂 「扫码登录」按钮(目录驱动 qrLogin 标记) - 新增 qrcode 依赖(webui workspace) 人设遵循(视频互动回复不符合人设的修复): - 删「像真人观众」强制要求(与 SOUL「不模拟人类情绪」冲突的根源) - 硬性要求首条:人格/语气/口头禅全部沿用智能体自身 SOUL 设定, 本任务不要求扮演别人 - summary 指令:用你自己的语言,保持一贯说话方式 - commentStyle 注入追加「与本账号人设冲突时以人设为准」
IdentityPanel 增加 expanded 形态(tab 内联平铺,无卡片壳); 通道页 Segmented 分「账号通道 / 身份与配对」,接入账号按钮 只在账号 tab 显示。ChannelsView 侧改动随上一提交。
第 1 组 上下文治理共享层
- compaction.rs 抽取:滚动压缩组调度与单智能体循环同口径
- budget.rs 预算软着陆:超限截旧消息→截思维链,context.trim 事件留痕
- 步数三级覆盖:个体 maxSteps > 档位 > 全局 chatMaxSteps(默认 24)
- 模型档案 contextWindow(0=未知不判定),contextBudgetRatio 默认 0.8
第 2 组 Git 工具组
- git 多合一工具:只读直行,写动作走审批闸门,检查点联动;doctor 检测
第 3 组 子智能体派生
- spawn 工具:临时个体+空历史复用 chat_execute;单层限制(子级剔 spawn/agent_manage)
- 实例级并发闸(默认 4)+ 独立超时(默认 300s);spawn.started/finished 事件可观测
第 4 组 计划模式
- 会话模式位 plan|execute;写类工具拦截转计划清单,读类放行
- 审批复用 approvals 通道([plan] 前缀单);批准回放执行/拒绝保留
- REST /api/sessions/{id}/plan 三动作;IM 通道文本摘要+plan:yes/no 快捷审批
第 5 组 CLI 全屏 TUI(BREAKING:裸 exm 进 TUI,exm chat 保留 readline)
- ratatui 三段版式:消息流(工具卡/diff 着色/滚动)/输入/状态栏
- Tab 审批页与 WebUI 同源;斜杠命令共享分派(stdout 捕获回灌)
第 6 组 WebUI 代码工作台
- /api/workbench/tree|file(工作区边界校验);「代码」视图:树+分页+会话引用
- 工具卡 diff 审查+回滚按钮(检查点联动);终端产出分区面板
第 7 组 验证与文档
- cargo test --workspace 全绿;四场景 e2e(计划改码/工作台回滚/spawn 检索/严格审批 commit)
- README/docs 双形态说明与配置项表;验收记录三份入 docs/
- 通道表单新增「内容倾向」多行提示词(B 站 / YouTube 通用) - 整段注入观看提示作口味参考;分词用于候选软排序(命中优先,不硬过滤) - 提示词明确不硬凑、不在评论里复述倾向要求
- 页头 sticky 吸顶(模糊背景 + 底部投影),滚动时标题与操作常驻;窄屏自动关闭 - 长表格表头吸顶、行悬停过渡、表格内空态占位收敛 - 三账页三卡等高 + 超长任务账卡体独立滚动,不再数屏撑高 - 设置页左侧分区导航 sticky 常驻,吸顶位置对齐页头下缘 - 统计读数(Statistic)统一 mono 读数语言:等宽数字 + 大写小标题 - 超宽屏内容约束 1480px 居中;卡片悬停描边反馈
- 对话输入 @ 文件提及:文件树懒加载候选弹层,选中插入相对路径 - 模型管理:端点拉取入清单、远端模型选择窗、默认模型从清单选择 - 实验性开关:模型主动压缩(dynamicCompaction / context_compact 工具)等 - 移除 git_panel 与 CodeWorkbenchView(双形态收敛为对话即编码) - orchestrator 提示词移除编码工作流段;新增编程技能包 entities/skills
B 站评论关 dry-run 仍不显示(code=0 静默风控): - 每轮观看前匿名访问首页取 buvid3/4 设备指纹(内存缓存复用),发评论携带 - 评论清洗剥离 Markdown 符号与人设装饰符(审核拦截高发因素) - 发后验证:按时间倒序接口双次确认评论上屏,未上屏如实报错不虚计配额 内容倾向在选视频前起效: - 从自由文本倾向提取核心搜索词(剥离引导虚词、过滤泛词),游标轮换主动搜索 - 搜索命中替代热门流,倾向即选择而非事后排序;搜索接口风控拦截按回退处理 系统自动内容与会话分离: - chat_scoped/handle_user_message 链路新增 origin 标记(复用 agent_id 字段) - 视频观看 prompt 落库带 auto:video 来源,聊天页显示「自动任务」徽标区分真人消息 其他: - intervalMinutes 默认值 60 → 10 分钟(后端默认 + UI 默认) - 页头与内容间距紧凑化(margin 10→8px + 相邻元素归零)
根因:空字符串在后端语义是「沿用旧值」(不丢已配密钥),清空输入框保存后 密钥依然存在;行级删除(保留其余密钥)没有任何协议手段表达。 - 后端新增 __CLEAR__ 哨兵:apiKey=哨兵 → 清主 Key 保留池;池条目=哨兵 → 删该池位 - 池兜底沿用收紧:apiKeys 缺省/空列表才沿用旧池,全哨兵(显式清池意图)如实清空 - 前端 submit 按原始行三态分类:掩码保留=沿用、明文=替换、掩码行被清空=删除哨兵 - 行删空仍走 clearKeys 全清(原有语义不变);i18n 提示语改为「清空某行 = 删除该密钥」 - 回归测试:清除哨兵只删主键、池全哨兵清空池、空提交沿用旧值(兼容不变)
直角风: - 设计令牌 --r-xs~xl 全部归零(功能性圆形走 --r-full 保留:LED、进度环等) - antd ConfigProvider borderRadius 五档全 0 - 药丸形态改直角:brand-tag、ant-tag、change-op、mode-toggle、scroll-bottom-btn、attach-del - 面板语汇注释同步更新(直角卡片 + 智械硬朗风) 通道页运行状态列: - 详情文本 inline → block:inline 元素 max-width 不生效导致长错误撑破页面 - 状态列固定宽 280px + 详情 260px 截断,完整内容 Tooltip 查看
Form.List 删行是物理移除,删掉的池行使提交 apiKeys 变空数组; 后端把空列表当「旧客户端未提供」触发兜底沿用旧池,删除保存即失效。 - submit 按初始池掩码行数对齐提交序列:掩码=沿用、明文=替换、 行被删/被清空=补 KEY_CLEAR 哨兵,后端逐把精确替换 - 主 Key 行(keep:-1)被物理删除时提交 KEY_CLEAR(此前被误当池行沿用) - 端到端回归:删行保存池清空 ✓、清空文本保存池清空 ✓、主 Key/模型清单不受影响
v1 时代 cache-first SW 装机后,sw.js 自身被浏览器启发式缓存(ServeDir 无 Cache-Control 头),新版 SW 与新壳长期无法接管——服务端已修复的 bug, 用户界面仍跑旧逻辑(表现为「API Key 删除保存无效」修复部署后依旧复现)。 - 网关静态服务补 Cache-Control:sw.js / index.html / 文档 no-cache (每次回源验证),/assets/ hash 产物 immutable 一年长缓存 - SW 缓存名 bump exm-shell-v2 → v3:新 SW activate 时强制清旧缓存
修复: - API Key 删除保存无效(KEY_CLEAR 显式清除哨兵协议,清文本/删行/全清三路径全通) - 点 − 删行保存后密钥仍在(池提交按初始掩码行对齐) - 前端更新不可达(静态资源缓存语义 + SW v3,旧 cache-first SW 不再阻塞换版) - B 站评论关 dry-run 不显示(buvid 指纹 + 发后上屏验证 + 评论清洗) - 内容倾向未先于选视频生效(核心词提取 + 游标轮换主动搜索) - 系统自动内容混充用户消息(auto:video 来源标记 + 自动任务徽标) - 通道页错误信息溢出页面(inline max-width 失效 → block + 列宽约束) 变更: - 智械直角风:设计令牌与 antd radius 五档归零,药丸形态改直角 - intervalMinutes 默认 60 → 10 分钟 - 页头与内容间距紧凑化
…早期时点,dev 为唯一演化真源)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
release v0.5.3
版本 bump:Cargo workspace
0.5.2 → 0.5.3(合并后 CI 自动打 tag、全平台构建、发 GitHub Release)。修复
__CLEAR__显式清除哨兵协议——清空输入框、点 − 删行、全部删空三条路径全部可正确保存KEY_CLEAR哨兵,后端逐把精确替换sw.js/index.htmlno-cache、/assets/immutable 长缓存)+ SW 缓存名 bump v3auto:video来源,聊天页显示「自动任务」徽标与真人消息区分变更
--r-xs~xl归零、antd ConfigProvider borderRadius 五档全 0、药丸形态改直角(LED/进度环等功能性圆形保留)intervalMinutes默认 60 → 10 分钟规模
307 commits · 104 files · +8279 / −2049
验证
cargo check三 crate 全绿,cargo test79/79 通过tsc --noEmit+vite build通过