session: a suspended session never gets time_idle and stays 'running' in the sidebar forever

未关闭
#62,779 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

还没有人认领这个 Issue。

  • #62791 来自 @hakarrr —— 已关闭,未合并

评估

难度
4/5
预计耗时
3-5 天
新手友好度
35/100
Issue 类型
缺陷
描述清晰度
基本清楚
活跃度
停滞
技术栈
sqlite, typescript
领域
backend, databases

调研方向

Start by tracing the code that writes time_suspended and the sidebar logic that counts child sessions with time_idle unset; the issue does not name files or tests. Check how startup or suspension handles sessions without a live process or turn, then add coverage for a suspended child. Done means interrupted children are finalized and no longer counted as running.

由索引模型根据 Issue 内容生成。

描述

reproduced

Summary

A session that is suspended by a server restart (or otherwise interrupted) never gets time_idle / idle_outcome written. The sidebar therefore counts it as an active subagent indefinitely — in my case the app showed "6 subagents" while only 2 were actually running; the other four had last activity 4 and 10 days earlier. Only a manual UPDATE session_v2 SET time_idle = ... clears them.

Environment

  • opencode version: v2.1.4
  • OS: Linux 6.17.0-41-generic (Ubuntu) x86_64
  • Terminal: TERM_PROGRAM=WezTerm, TERM=xterm-256color, COLORTERM=truecolor
  • Shell: /usr/bin/zsh
  • Install/channel: latest (~/.opencode/bin/opencode)
  • Active plugins: none found in ~/.config/opencode/opencode.json (permissions only) and no .opencode/plugin* directories

Reproduction

  1. Run opencode with a main session that spawns subagent sessions (the child rows have session_v2.parent_id set).
  2. Restart the app/server, or let the server suspend a child while it is running (in my DB these rows have time_suspended set).
  3. Open the session sidebar / subagent counter.
  4. Observe the suspended child still counted as running, days after its last message.
  5. Confirm in the database: the row has time_suspended set, but time_idle IS NULL and idle_outcome IS NULL.

Query used:

select id, title, time_updated, time_idle, time_suspended, idle_outcome
from session_v2
where parent_id = '<main session id>' and time_idle is null
order by time_updated desc;

Result at the time of the report (only the first two were actually alive):

last activity title time_idle time_suspended
today 21:51 Multi-instance processor and drain NULL set
today 21:45 Fix macOS desktop compile stage NULL set
2026-11-04 13:21 Scrub client infrastructure NULL set
2026-11-04 13:07 Fix code-diver index freshness NULL set
2026-11-04 01:45 Infisical env gap and config guard NULL set
2026-10-27 19:40 Ask-for-credentials UX with reuse NULL NULL

Expected Behavior

A child session that the server suspends or abandons should be finalized — time_idle written with idle_outcome of interrupted/failed — so the UI stops counting it as an active subagent. At minimum, a session with no activity for hours/days must not be reported as running.

Actual Behavior

The sessions keep time_idle IS NULL forever. The subagent counter and any "running" indicator treat them as live work: the UI said "6 subagents" when 2 were running and 4 had been dead for 4-10 days. Restarting the app does not reconcile them, because the state lives in the database, not in memory.

Scale in this one profile: 1896 rows in session_v2, of which 761 had time_idle IS NULL (most inherited from the v2 migration), so this is systematic rather than a one-off.

Additional Context

Workaround that fixed the display (data-preserving, only marks sessions idle):

update session_v2
set time_idle = time_updated, idle_outcome = 'interrupted'
where time_idle is null
  and time_updated < (strftime('%s','now') - 24*3600) * 1000;

After that the sidebar showed only the two genuinely running subagents.

Expected repair path inside opencode: on startup (or on the suspension path that sets time_suspended), finalize any child that has no live process/turn — e.g. mark time_idle = time_updated, idle_outcome = 'interrupted', and expose that state in the sidebar instead of "running".

主要语言
TypeScript
星标
225k
派生
30.4k
平均合并
4 小时 16 分钟
30 天内合并 PR
528

环境准备

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

anomalyco/opencode 的其他 Issue

查看 anomalyco/opencode 的全部 Issue

相似的 Issue

更多 TypeScript Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。