dwgx@blog:~$dwgx
> cd ../posts

AgentScope:本地 Codex 和 Claude Code 会话监控台

// created

AgentScope 是个 Windows 桌面控制台, 把本机 Codex 和 Claude Code 的会话找出来、建索引、能搜, 并说清每条进程和会话的关联是怎么来的。它不是聊天界面也不是看板, 只做这一件事。

起因是我在 Windows 上同时挂着两个跑活儿, 机器上很快堆满看不见的东西: 一堆 node 进程、.claude\projects 下的 transcript、.codex 里带版本号的 SQLite 和 rollout JSONL。哪个进程对应哪个会话、改了一半的 session 存在哪、想删又怕误伤还在跑的, 翻目录根本对不上。

怎么搭的

TypeScript + Electron, 分三块。

apps/desktop        Electron + React 桌面壳
packages/core       Windows 进程/会话索引核心
packages/shared     共享模型和 IPC 安全类型

主进程拿本地特权, preload 只暴露一条很窄的 IPC, 渲染层 React/TS 画界面。进程侧走 Win32_Process 把 Codex、Claude、node、app-server 捞出来, 再用 Get-Process 补启动时间和窗口标题。会话侧两条线: Claude 解析 .claude\sessions 的 PID 文件再到 .claude\projects 找 transcript; Codex 麻烦些, 要啃 state_*.sqlite 这类带版本号的 SQLite, 还得扫 rollouts 里的 JSONL。

证据, 不是猜

进程和会话对号靠打分, PID、cwd、transcript 路径、session id、窗口标题、时间, 每项都是一份证据。结果标四档 exactindexedheuristicunknown。只有时间对得上、别的都没有的, 我直接压成 unknown, 绝不冒充真匹配。Codex 至今没有可靠的 PID 到 thread 映射, 那就老实标出来。

删除这块做得很保守, 因为删本地会话真会伤人。删之前先备份到 .agentscope\backups, 要动的挪进 quarantine 隔离区, 全程写 journal.json 记每一步, 出事能顺日志回溯。还在跑的、有高置信候选的、带子会话的, 直接拦下不让删。它不杀进程、不解密任何厂商状态, 只碰本地明文, 搜 JSONL 也只查元数据、不返回 transcript 正文。