8000 feat(collector): run registered extra tasks and reveal Paseo sessions in resume for 0.12.4 by InfinityPacer · Pull Request #53 · InfinityPacer/meterleaf · GitHub
[go: up one dir, main page]

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

## [未发布]

## [0.12.3] - 2026-10-24
## [0.12.4] - 2026-10-25

- 周额度刚重置、新快照还没到时,账户 8000 卡片不再整行消失,改为显示「7d · 等待更新」和重置时刻,新数据到达后自动恢复。新快照要等这个账户再发出请求才会到,5h 用满时可能要等几个小时。上一周期结束超过一周仍无新快照时不再占位。
- 只需升级服务端镜像,本机采集器不用替换。数据库结构未变,升级无需先备份。
- 本机采集器可以登记额外任务:`meterleaf-collector tasks add` 登记一条本机命令,由采集器的后台任务按间隔运行,有限时,失败只记日志,不影响同步,`status` 和 `tasks` 显示最近一次结果。用法见[本机采集器](docs/collector.md#额外任务可选)。
- 新增可选脚本 `scripts/claude-resume-visibility.ts`,登记为额外任务后,你在 Paseo 里对话过的 Claude Code 会话会出现在 `claude --resume` 的会话列表里。子代理和仍在运行的会话不处理,改动可以按记录改回。
- 需要重新构建并替换本机采集器,服务端不用升级。数据库结构未变,升级无需先备份。
51 changes: 51 additions & 0 deletions docs/collector.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@

它不会在 Claude Code 的目录里写入、改名、加锁或改权限,不改设置、hooks 或状态栏,不运行 Claude Code 命令,也不调用任何 Anthropic 接口,读取凭据不会产生网络请求。上传内容只有计量数字、模型、时间、账户标识和套餐,不包含对话、工具输出、文件路径、工作目录、邮箱、显示名或令牌。

这些保证只针对采集器本身。你自己登记的[额外任务](#额外任务可选)由采集器按时运行,它们读写什么由任务决定。

凭据不会每次运行都读。采集器每次运行只看凭据的修改时间,这一步只取钥匙串条目的属性或文件状态,不读令牌。只有凭据被改写过(登录、刷新令牌或套餐变化时 Claude Code 都会改写)、刚登录或切换了账户、`~/.claude.json` 里的账户资料有变化,或者上一次读到的套餐还在等确认时,才读取凭据内容。凭据没有改写,其中的套餐就不会变,所以其余时候沿用已确认的套餐。读不到凭据时,例如钥匙串拒绝访问,等凭据下次改写再试。

凭据只代表当前登录的账户,而 Claude Code 切换账户时会先换凭据、后改 `~/.claude.json`。所以采集器只采用连续两次运行都对同一账户读到的同一套餐,新登录的账户要过一分钟左右才显示凭据里的套餐,切换途中读到的结果不会记到旧账户上。`scan` 只运行一次,会显示从凭据换算出的套餐并注明同步时确认后采用。读不到凭据时,例如钥匙串拒绝访问,采集器沿用此前为该账户记录的套餐;从没读到过时只能从席位档位识别 Team,其余显示为订阅账户,可以在 Meterleaf 中手动设置套餐,见[使用与报表](reporting.md#账户管理)。
Expand Down Expand Up @@ -256,6 +258,55 @@ install -m 755 scripts/paseo-claude-quota.sh ~/.local/bin/meterleaf-paseo-claude

脚本不读取登录凭据,也不发出额外请求。Paseo 自带的用量面板会用 Claude Code 的登录令牌请求 Anthropic 的额度接口,不要把那份结果转给采集器。

## 额外任务(可选)

采集器的后台任务每分钟运行一次。需要在这台电脑上定期跑的小脚本,可以登记为额外任务,由同一个后台任务按间隔运行,不必再单独安装定时任务,`status` 里也能一起看到。

```sh
meterleaf-collector tasks add <名称> --every 10 --timeout 60 -- /绝对路径/命令 参数...
meterleaf-collector tasks # 列出任务和最近一次结果
meterleaf-collector tasks run <名称> # 立即运行一次并显示输出
meterleaf-collector tasks remove <名称>
```

- `--` 之后是要运行的命令,第一项必须是可执行文件的绝对路径,其余原样作为参数,不经过 shell。名称只能用小写字母、数字和 `-`。
- `--every` 是间隔分钟数,默认 10;`--timeout` 是限时秒数,默认 60,最长 600。任务结束或超时时,它启动的子进程会一起结束;脱离进程组自行运行的进程不受管理,但不会拖住同步。同名任务用 `--force` 覆盖。
- 任务在每轮同步之后按登记顺序运行,与同步共用一把运行锁,所以不会和自己重叠,也不会与 `tasks run` 同时运行。服务端暂时连不上时任务照常运行。
- 任务失败或超时只写进 `logs/collector.err.log`,不影响同步和其他任务。成功且没有输出时不写日志。
- 任务的工作目录是数据目录下的 `tasks/<名称>`,可以在这里保存自己的状态,删除任务时不会一并删除。任务还能从环境变量读到 `METERLEAF_TASK_NAME`、`METERLEAF_TASK_STATE_DIR`,以及 `METERLEAF_CLAUDE_CONFIG_DIRS`,后者每行一个 Claude 配置目录,默认目录在前,随后是[登记的额外账户](#登记额外账户)。

后台任务以低优先级运行,任务也一样。任务做什么由你负责,采集器不检查它读写哪些文件。

### 让 Paseo 会话出现在 resume 列表

Paseo 以无界面模式启动 Claude Code,这样产生的会话不会出现在 `claude --resume` 和 `/resume` 的会话列表里,只能用会话 ID 打开。Claude Code 是按会话记录开头标着的启动来源决定是否列出的,与会话内容无关。

仓库里的 `scripts/claude-resume-visibility.ts` 把符合条件的会话改成按普通终端会话列出。它只处理同时满足下面三点的会话。

- 属于某个 Paseo 代理,也就是 Paseo 恢复这个代理时用的那个 Claude 会话。
- 里面至少有一条你直接发出的消息。Paseo 子代理只收到其他代理转来的任务,不会被列出。
- 没有正在运行的 Claude Code 进程在使用它。还在运行的代理等它结束后,下一轮再处理。这也避免了 Paseo 和终端同时往一个会话里写。

改动只涉及会话记录开头那一段的启动来源字段,在原位置写入同样长度的内容,文件大小不变,对话内容不动。Claude Code 只在文件末尾追加,不会和这里的写入冲突,采集器也不会因此重新读取这些文件。

先复制到不随仓库分支变化的位置,用 `--dry-run` 看看会列出哪些会话,再登记为额外任务。

```sh
install -m 755 scripts/claude-resume-visibility.ts ~/.local/bin/meterleaf-resume-visibility
~/.bun/bin/bun ~/.local/bin/meterleaf-resume-visibility --dry-run
meterleaf-collector tasks add resume-visibility -- "$HOME/.bun/bin/bun" "$HOME/.local/bin/meterleaf-resume-visibility"
meterleaf-collector tasks run resume-visibility
```

脚本从 `~/.paseo` 读取代理记录,Paseo 数据目录不在这里时,用 `PASEO_HOME` 指定。每一处改动都记在数据目录的 `tasks/resume-visibility/changes.jsonl`。想恢复原状,先 `tasks remove resume-visibility`,再运行一次 `--revert`,带上 `METERLEAF_TASK_STATE_DIR` 指向这个目录。

```sh
METERLEAF_TASK_STATE_DIR="$HOME/Library/Application Support/Meterleaf Collector/tasks/resume-visibility" \
~/.bun/bin/bun ~/.local/bin/meterleaf-resume-visibility --revert
```

这依赖 Claude Code 当前的会话记录格式。以后 Claude Code 换了判断方式,最坏的结果是这些会话重新不在列表里,用会话 ID 仍然可以打开。

## 日常查看与排障

`meterleaf-collector status` 显示同步进度、待发送数量、最近一次成功或失败的原因,以及账户归属情况,不会显示密钥。
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "meterleaf",
"version": "0.12.3",
"version": "0.12.4",
"private": true,
"type": "module",
"license": "Apache-2.0",
Expand Down
Loading
Loading
0