Skip to content

bug: pi-subagents 的 transcript 被误识别为会话,导致会话列表出现无法打开的条目 #168

Description

@MUYUTwilighter

Summary

PiDeck 会递归扫描以下目录中的所有 .jsonl 文件:

~/.pi/agent/sessions/

pi-subagents 启动子代理时,会在以下位置生成用于观测和审计的 transcript:

~/.pi/agent/sessions/<encoded-cwd>/subagent-artifacts/<run-id>_<agent>_0_transcript.jsonl

这些 transcript 并不是 Pi 会话文件,但 PiDeck 仍会将它们加入会话列表。原因可能是 PiDeck 的扫描器:

  1. 递归收集会话目录下的所有 .jsonl 文件;
  2. 创建 catalog 记录前,没有验证文件是否包含有效的 Pi session header;
  3. transcript 中恰好包含 cwdmessage.role、消息内容和模型等字段,因此能够被摘要解析器识别成“看起来正常”的会话。

结果是:运行子代理后,会话侧边栏中会多出若干会话,标题通常类似:

[prompt redacted]; live Prompt A…

但这些条目无法作为正常 Pi 会话打开或恢复。

这看起来是 PiDeck 的递归会话扫描器与 pi-subagents transcript artifact 之间的格式/命名空间冲突。

Steps to reproduce

  1. 安装并启动 PiDeck。

  2. 打开一个项目并开始普通 Pi 会话。

  3. 通过 pi-subagents 启动一个子代理,例如 workerscoutreviewer

  4. 等待子代理开始运行或运行完成。

  5. 等待 PiDeck 刷新或重新扫描会话列表。

  6. 观察侧边栏中新增的会话条目。

  7. 检查该条目的文件路径,可以看到它指向类似以下文件:

    C:\Users\<user>\.pi\agent\sessions\--<encoded-cwd>--\subagent-artifacts\<run-id>_worker_0_transcript.jsonl
    
  8. 尝试打开、恢复或继续该会话。

重复运行子代理后,会话列表中会不断增加类似的无效条目。

Expected behavior

PiDeck 应当只索引有效的 Pi session JSONL 文件。

至少应验证文件的第一条有效 JSON 记录满足:

firstEntry.type === "session" && typeof firstEntry.id === "string"

以下目录中的非会话 artifact 不应显示在会话列表中:

subagent-artifacts/

真正的嵌套子代理会话,例如:

<parent-session-stem>/<run-id>/run-0/session.jsonl

包含有效的 Pi session header,因此仍可根据产品设计正常索引或分组显示。

Actual behavior

PiDeck 会将 *_transcript.jsonl 文件作为 active session 加入会话列表。

Transcript 的第一条记录类似:

{
  "version": 1,
  "recordType": "message",
  "source": "foreground",
  "runId": "<redacted>",
  "agent": "worker",
  "cwd": "<project-path>",
  "sourceEventType": "initial_prompt",
  "role": "user",
  "message": {
    "role": "user",
    "content": [
      {
        "type": "text",
        "text": "[prompt redacted]; live Prompt Audit only."
      }
    ]
  }
}

它并不包含 Pi 会话所需的 header:

{
  "type": "session",
  "version": 3,
  "id": "<session-id>",
  "timestamp": "<timestamp>",
  "cwd": "<project-path>"
}

PiDeck 可以从 transcript 中提取足够的信息并将其显示在侧边栏中,但在真正恢复会话时,会把该路径作为 --session 参数传给 Pi,而 Pi 会因为文件不是有效 session 而拒绝加载。

在当前受影响的环境中,session-catalog.json 中共有 64 条记录,其中 13 条指向:

subagent-artifacts/*_transcript.jsonl

OS

Windows 10 专业工作站版,10.0.19045.6456,x64

Node.js version

v24.14.1

pi version

0.84.2

Logs or screenshots

- **PiDeck:**0.7.1
- **pi-subagents:**0.53.0
- **运行环境:**Windows Native,非 WSL

没有在 PiDeck 应用日志中找到明确的 `Session file is not valid` 错误记录,但从文件格式可以稳定复现该问题

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    Status
    Todo

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions