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

オープン
#62,779 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

  • #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分
マージ済み PR(30日)
528

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

anomalyco/opencode のほかの issue

anomalyco/opencode の issue をすべて見る

似ている issue

TypeScript の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。