Skip to content

Progress

LiManshiang edited this page Sep 11, 2026 · 1 revision

lmux 1.0.6 — 进展文档

注:本文档为历史记录(截至 1.0.53)。当前进度与路线图见 ROADMAP.md

日期: 2026-08-04 分支: 1.0.6(开发)+ fix/crash-issues(崩溃/权限修复,未合并) 版本: 1.0.53 Git 钩子: pre-commit 自动升级小版本号


已完成的修复/功能

1.0.6 阶段

# 简述 提交 文件
1 Agent 检测(pgrep 子进程) b425a6f TerminalManager.swift
2 LaunchMode 追踪(bash/agent) b425a6f SessionRestore.swift
3 Restore 时从后端回退 cbcSessionID ad3e5b6 ContentViewModel.swift
4 Polling 优化(不再无条件重赋值 selectedSession) d739ce1 ContentViewModel.swift
5 SessionDetailView 移除条件分支(PTYTerminalView 位置固定) 多次 SessionDetailView.swift
6 Scrollback 降至 50K 行 6c5926e TerminalManager.swift
7 Split pane overlay 方式实现 多次 SessionDetailView.swift
8 Split ratio 控制 terminal 高度(不可见时高度 0) 7809ed4 SessionDetailView.swift
9 性能: isIdle 节流(2s 而非每次 data chunk) c358f6d TerminalManager.swift
10 闪退修复: SwiftTerm 回调 dispatch 到 main queue 8cbb0d4 TerminalManager.swift
11 合并 perf/optimize-v1 性能优化 0e1e863 多文件
12 新建 session 直接启动 agent 而非 bash 8d14476 SessionDetailView.swift, ContentViewModel.swift
13 侧边栏版本号 + 自动 bump 2689ed4 Version.swift, bump-version.sh, .githooks/

fix/crash-issues 阶段(未合并到 1.0.6)

# 简述 提交 文件
14 行为修正: 新建 session 无历史 → 进 bash(非 agent);有历史 → 跟随历史进 agent da95ae3 SessionDetailView.swift, ContentViewModel.swift
15 Restore 仅对 agent 模式做 JSONL 扫描(bash 模式不再被历史会话劫持) da95ae3 ContentViewModel.swift
16 DispatchIO 双重 close 防护(closeBackendIO 单次关闭)+ retryBackend 先关 IO 再 kill(防 EV_VANISHED) d837686 ContentViewModel.swift
17 connect/connectBash 启动失败检测(executable 存在 + shellPid>0)+ onConnectError 上抛 UI b997b7a TerminalManager.swift, ContentViewModel.swift
18 bash scrollback 1M→200K 行;detach() 停止 agent 检测 timer b997b7a TerminalManager.swift
19 SessionRowView 用 terminalManagerIfExists 只读查询(不再为每行建空壳 manager) 0ffd56c SessionListView.swift, ContentViewModel.swift
20 SessionRestore.loadAll() 走 ioQueue + 内存缓存(main 不再同步读盘) 0ffd56c SessionRestore.swift
21 refreshSessions 比较整个数组内容(status/pid 变化可刷新) 0ffd56c ContentViewModel.swift
22 K3: split pane PTYTerminalView 加 .id() 稳定 NSView 身份 2f708b1 SessionDetailView.swift
23 通知权限仅在 .notDetermined 时请求;Info.plist 删除日历/照片/通讯录多余 usage key 58a933f App.swift, Info.plist
24 新增 NSAppleMusicUsageDescription/NSPhotoLibraryUsageDescription(声明不使用),使拒绝状态可持久化、弹窗收敛为一次 812a521 Info.plist
25 make run 检测源码变更,.app 未过期时跳过重建,保持签名/TCC 权限稳定 e2f9bdc Makefile
26 终端内容覆盖 header:容器 clipsToBounds + stretch 的 dx/dy clamp 到 >=0 5679d5a TerminalView.swift
27 拖拽文件到终端:容器注册 .fileURL/.string 拖拽类型,插入 shell 引用路径(多文件空格分隔) 9a1dda3 TerminalView.swift, TerminalManager.swift
28 历史对话恢复:resumeArgs 用 --resume <id> 而非 --session-id(后者只固定 ID 不恢复消息);验证 codebuddy 恢复历史成功 ab35b53 Session.swift
29 find-session 只返回有效会话:scanner 完整扫描(去掉 ai-title 提前 break)+ 仅选有 assistant 回复的会话(排除残留 stub)+ 缓存 TTL 30s;agent 检测 extractSessionID 支持 --resume c560f56 scanner.go, TerminalManager.swift
30 恢复前校验 cbc 有效性:新增 GET /api/codebuddy/session/{id}(valid=无 assistant 回复则 false);restore/connect 时无效 cbc 自动重新 find-session 并写回后端修正 7519d16 handlers.go, server.go, APIClient.swift, ContentViewModel.swift, SessionDetailView.swift
31 启动只恢复最后选中的 session(UserDefaults 持久化 lastSelectedSessionID),其余 session 点击时惰性连接;codebuddy 进程数 7→1 ccb998c ContentViewModel.swift

注:#28 排查过程中曾尝试"新建 session 自动扫描目录历史进 agent",用户确认期望新建 session 一律进 bash,已撤销该方向(connectToSession 保持 无 cbc→bash / 有 cbc→agent)。 注:#29-30 复现"change session aba8d82a 不恢复":find-session 返回了残留 stub 会话(只有 user 消息,如 d217dbdb),--resume 失败后 codebuddy 自动切换提示。修复后重启自动将 cbc 从 d217dbdb 修正为 aba8d82a,恢复正常。

已知问题

# 描述 状态 分析
K1 /skills 命令导致对话重载 已知,不可修复 Agent 层面行为(CSI 3 J 尝试过,SwiftTerm patch 尝试过,都不是根因)
K2 窗口缩放导致对话重载 已知,标准行为 SIGWINCH → source → codebuddy 重绘。Terminal.app 同样有,只是速度快不明显
K3 Split pane toggle 可能导致 NSView 重建 ✅ 已修复 .id("main/split-terminal-\(sid)") 稳定身份(fix/crash-issues 2f708b1)
K4 启动弹音乐/相册/下载/文稿等 TCC 权限 已缓解,根治需稳定签名 TCC 权限绑定 code signature + bundle id + 路径;ad-hoc 签名无 TeamIdentifier,重签即视为新 app 全部重弹。make run 跳过重建 + usage description 已缓解;根治:Developer ID 签名

macOS 12.5 (Intel) 兼容性

  • 代码层面完全兼容:部署目标 .macOS(.v12),无 macOS 13+ 专属 API(已全量 grep)
  • 目标机为 Intel x86_64swift build --arch x86_64 交叉编译可行
  • :后端 go-sqlite3 需 CGO。交叉编译 amd64 必须 CGO_ENABLED=1 + CC="clang -target x86_64-apple-macos12.0 -isysroot $(xcrun --show-sdk-path)",否则编出 stub 后端(启动即崩)
  • 交付物:lmux-app/.build/lmux.app(x86_64 前端 + x86_64 CGO 后端,已 ad-hoc 签名,21MB)
  • 12.5 原生编译:Xcode 14 (Swift 5.7) + Go;Package.swift 引用绝对路径 /Volumes/Developer/CodeBuddy/Projects/lmux/SwiftTerm换路径需改相对路径 ../SwiftTerm;SwiftTerm 含本地 backport commit(44339a2),须随目录拷贝

权限弹窗调查(K4)

  • lmux 代码/二进制零调用音乐、相册 API(无 MediaPlayer/Photos 链接、无 usage key 依赖)
  • TCC 弹窗由 code signature + bundle id + 磁盘路径 三者绑定,任一变化 → 系统视为新 app → 对默认敏感服务集(MediaLibrary、Photos、Downloads/Documents/Desktop 等)批量重新授权弹窗
  • ad-hoc 签名(TeamIdentifier=not set)无稳定身份 → 每次 make app 重签都触发重弹
  • 实测:内容不变时 ad-hoc 签名 cdhash 稳定(两次相同);make run 跳过重建后启动无新 TCC 记录(不再弹)
  • 根治方案:Developer ID 证书签名(稳定 TeamIdentifier)

修改的核心文件

lmux-app/Sources/LMUX/
  Utils/
    TerminalManager.swift    — agent 检测 + 闪退修复 + 性能优化 + 启动失败检测 + scrollback
    SessionRestore.swift     — LaunchMode 追踪 + ioQueue 缓存读
    Version.swift            — 版本号定义(1.0.53)
  Views/
    SessionDetailView.swift  — split pane overlay + 启动路由(bash/agent)+ .id()
    SessionListView.swift    — 只读 manager 查询
    ContentView.swift        — 侧边栏版本号显示
    TerminalView.swift       — frame 更新优化 + 裁剪/防溢出 + 文件拖拽
  ViewModels/
    ContentViewModel.swift   — restore 路由(lazy 恢复)+ cbc 校验 + polling 优化 + DispatchIO 防护
  Models/
    Session.swift            — AgentType 枚举 + resume 参数(--resume)
  Network/
    APIClient.swift          — find-session + session 有效性校验
  Info.plist                 — About 版本号

bump-version.sh             — 版本号升级脚本
.githooks/pre-commit        — 自动升级版本号

下次继续

  1. 合并 fix/crash-issues → 1.0.6(用户确认后再合)
  2. 在 Intel macOS 12.5 真机跑修复版(Swift ABI 理论兼容,需真机验证;验证 /skills、窗口缩放、split pane、权限弹窗、header 覆盖、拖拽文件、历史恢复、启动速度)
  3. 12.5 机器上若改代码路径,改 Package.swift 为相对路径 ../SwiftTerm
  4. K4 根治:申请 Apple Developer ID 证书,make appcodesign --sign "Developer ID Application: ..."(替换 Makefile 里的 ad-hoc 签名)
  5. 其他中低风险项(可选):backend/lmux 二进制为构建产物,避免提交;codebuddy --resume 历史渲染速度(SwiftTerm 渲染层面)

分支状态

master ─── 最终稳定代码
1.0.6  ─── 开发主线(bash 修复已合入 da95ae3)
fix/crash-issues ─── 崩溃/权限/性能/渲染/功能修复(18 项,d837686..ccb998c),未合并
perf/optimize-v1 ─── 性能优化(已合并到 1.0.6)

Clone this wiki locally