session: a suspended session never gets time_idle and stays 'running' in the sidebar forever
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
- #62791 @hakarrr による — マージされずにクローズ
評価
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 初心者へのやさしさ
- 35/100
- issue の種類
- バグ
- 明瞭さ
- おおむね明確
- 活発さ
- 停滞
- 技術スタック
- sqlite, typescript
調査の方向性
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 の本文から書いたものです。
説明
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
- Run opencode with a main session that spawns subagent sessions (the child rows have
session_v2.parent_idset). - Restart the app/server, or let the server suspend a child while it is running (in my DB these rows have
time_suspendedset). - Open the session sidebar / subagent counter.
- Observe the suspended child still counted as running, days after its last message.
- Confirm in the database: the row has
time_suspendedset, buttime_idle IS NULLandidle_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
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
anomalyco/opencode のほかの issue
-
reproduced
難易度 2/5 1〜3時間 初心者へのやさしさ 61/100
anomalyco/opencode#62873 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
anomalyco/opencode#62822 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
anomalyco/opencode#62601 · コメント 2 件 ·
メンテナーはふだん 1 日以内に返信
-
reproduced
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
anomalyco/opencode#62516 · コメント 2 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
anomalyco/opencode#62374 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
anomalyco/opencode の issue をすべて見る
似ている issue
-
code-quality good-first-issue
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
OpenRailAssociation/netzgrafik-editor-frontend#1481 ·
メンテナーはふだん 1 日以内に返信
-
🙌 icon request
難易度 2/5 1〜3時間 初心者へのやさしさ 63/100
lucide-icons/lucide#5183 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 81/100
cloudflare/capnweb#293 ·
メンテナーはふだん 2 日以内に返信
-
bug implicit-state
難易度 2/5 1〜3時間 初心者へのやさしさ 74/100
-
area:models enhancement
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
メンテナーはふだん 1 日以内に返信