Skip to content

Fix /history on async saver + 3 config diagnostics (0.6.28: #106, #107, #108, #109) - #111

Merged
dkedar7 merged 1 commit into
mainfrom
fix/106-107-108-109-diagnostics-history
Aug 3, 2026
Merged

dkedar7 merged 1 commit into
mainfrom
fix/106-107-108-109-diagnostics-history

Conversation

@dkedar7

@dkedar7 dkedar7 commented Aug 3, 2026

Copy link
Copy Markdown
Owner

Ships 0.6.28 fixing four cli-local issues in one release. One regression test per issue; full suite green; ruff check + ruff format --check clean.

#106 (bug, regression from #102) — /history throws "Event loop is closed"

In the shipped persist-on default the durable checkpointer is the async-only AsyncSqliteSaver, opened inside each turn's own event loop and closed when the turn ends. cmd_history read state via the sync graph.get_state, which against that async, already-closed saver scheduled aget_tuple as a never-awaited coroutine and surfaced Could not retrieve history: Event loop is closed + a RuntimeWarning — every user hit it (only --no-persist worked). Now reads through the async API (aget_state) on a freshly-opened saver over the same SQLite file, mirroring the run loop; the sync path still serves the in-memory case.

#107 (bug) — --show-config mislabels the source of DEEPAGENT_SPEC

A value set via the oldest legacy alias DEEPAGENT_SPEC was labelled [env:DEEPAGENT_AGENT_SPEC] — the canonical-legacy key the resolver copies it onto, absent from the environment, contradicting the command's own stderr note. The [source] column now reports [env:DEEPAGENT_SPEC] (re-attributed in CodeConfig.resolve, same class of fix as #101/#20).

#108 (enhancement, finishes #102 item 3) — --show-config never surfaced persist/session config

Persistence was visible only in interactive /status. --show-config now shows the resolved persist value with its [source], the (env: LANGSTAGE_PERSIST, toml: session.persist) hint, and the store path when on — in both on and off states, so the off-switch is verifiable. Interactive /config appends the identical block so the two can't diverge.

#109 (bug) — blank, typeless Error: on an empty-message load exception

A bare assert / raise NotImplementedError / RuntimeError() has an empty str(e), so the top-level handlers printed just Error:. They now name the exception class (Error: NotImplementedError) and point at -v, matching the runtime turn-error path.

Tests

🤖 Generated with Claude Code

https://claude.ai/code/session_011HWCfJii6gXd3XL3Gq3W8B

…ig persist surface, blank load errors (#106, #107, #108, #109)

Ship 0.6.28 fixing four cli-local issues:

- #106 (regression from #102): /history threw "Event loop is closed" in the
  default persist-on config because cmd_history called the SYNC get_state on the
  async-only AsyncSqliteSaver (opened per-turn and already closed). It now reads
  through the async API on a freshly-opened saver over the same SQLite file.
- #107: --show-config mislabelled a value set via DEEPAGENT_SPEC as
  [env:DEEPAGENT_AGENT_SPEC] (a var the user never set). The source label now
  names the alias actually set, matching the stderr note.
- #108 (finishes #102 item 3): --show-config now surfaces the persist/session
  config (value + source + store path) in both on and off states; interactive
  /config appends the identical block so the two can't diverge.
- #109: a top-level/load exception with an empty str(e) printed a blank, typeless
  "Error:". It now names the exception class and points at -v, like the runtime
  turn-error path.

One regression test per issue; full suite green; ruff check + format clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011HWCfJii6gXd3XL3Gq3W8B
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant