openclaw - ✅(Solved) Fix /reset preserves session-level thinkingLevel/etc — trivial ternaries in get-reply break agent default settings [1 pull requests, 1 comments, 2 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
openclaw/openclaw#80377Fetched 2026-05-11 03:15:23
View on GitHub
Comments
1
Participants
2
Timeline
2
Reactions
3
Author
Timeline (top)
commented ×1cross-referenced ×1

In get-reply (compiled file dist/get-reply-*.js, around line 576), the session-entry construction uses trivial ternaries of the form resetTriggered ? X : X for six fields. Both branches are identical, so the conditional is effectively a no-op — the previous session's settings (thinkingLevel, verboseLevel, reasoningLevel, ttsAuto, modelOverride, providerOverride, authProfileOverride*) are always preserved on /reset.

This means /reset does not restore agent defaults like agents.list[].thinkingDefault or agents.defaults.thinkingDefault — those defaults are only consulted when no value was ever set, but the trivial ternary keeps any previously-set value alive across every reset.

Root Cause

In get-reply (compiled file dist/get-reply-*.js, around line 576), the session-entry construction uses trivial ternaries of the form resetTriggered ? X : X for six fields. Both branches are identical, so the conditional is effectively a no-op — the previous session's settings (thinkingLevel, verboseLevel, reasoningLevel, ttsAuto, modelOverride, providerOverride, authProfileOverride*) are always preserved on /reset.

This means /reset does not restore agent defaults like agents.list[].thinkingDefault or agents.defaults.thinkingDefault — those defaults are only consulted when no value was ever set, but the trivial ternary keeps any previously-set value alive across every reset.

Fix Action

Workaround

Manually patch sessions.json to set the desired thinkingLevel, then restart the gateway. From that point on, future resets will preserve the desired value (since the bug preserves whatever's there).

PR fix notes

PR #80414: fix(auto-reply): clear session overrides on /reset

Description (problem / solution / changelog)

Summary

  • Fixes #80377 — /reset no longer preserves session-level overrides that should fall back to agent defaults.
  • Replaces nine trivial resetTriggered ? existingEntry?.X : existingEntry?.X ternaries in writeSessionEntry with the resetTriggered ? undefined : existingEntry?.X shape already used by responseUsage.
  • Adds two regression tests in get-reply.fast-path.test.ts: one asserting the fields are cleared after /reset, the other asserting they are preserved on a normal (non-reset) turn.

The issue's bot review (clawsweeper) referenced src/agents/reply-session.ts:407, but on main the same code now lives in src/auto-reply/reply/get-reply-fast-path.ts:251-268. While inspecting it, I also found two additional fields with the same no-op pattern that were not in the original report: authProfileOverrideSource and authProfileOverrideCompactionCount — both included in this fix.

Affected fields

All cleared on /reset (previously preserved across reset):

  • thinkingLevel
  • verboseLevel
  • reasoningLevel
  • ttsAuto
  • modelOverride
  • providerOverride
  • authProfileOverride
  • authProfileOverrideSource
  • authProfileOverrideCompactionCount

responseUsage was already correct and is unchanged.

Test plan

  • pnpm test src/auto-reply/reply/get-reply.fast-path.test.ts → 14/14 passing locally (2 new + 12 pre-existing)
  • pnpm tsgo:core → green
  • tsgo on tsconfig.core.test.json → green (with GOMEMLIMIT=2GiB on a memory-constrained dev box; default settings OOM'd unrelated to this diff)
  • Maintainer: verify intended product semantics for /reset clearing model/provider/auth-profile overrides as well as mode flags (the bot flagged this as the one remaining open question)

🤖 Generated with Claude Code

Changed files

  • src/auto-reply/reply/get-reply-fast-path.ts (modified, +9/-13)
  • src/auto-reply/reply/get-reply.fast-path.test.ts (modified, +101/-0)

Code Example

const sessionEntry = {
  ...!resetTriggered ? existingEntry : void 0,
  sessionId,
  sessionFile,
  updatedAt: now,
  thinkingLevel:                resetTriggered ? existingEntry?.thinkingLevel       : existingEntry?.thinkingLevel,
  verboseLevel:                 resetTriggered ? existingEntry?.verboseLevel        : existingEntry?.verboseLevel,
  reasoningLevel:               resetTriggered ? existingEntry?.reasoningLevel      : existingEntry?.reasoningLevel,
  ttsAuto:                      resetTriggered ? existingEntry?.ttsAuto             : existingEntry?.ttsAuto,
  responseUsage: !resetTriggered ? existingEntry?.responseUsage : void 0,
  modelOverride:                resetTriggered ? existingEntry?.modelOverride       : existingEntry?.modelOverride,
  providerOverride:             resetTriggered ? existingEntry?.providerOverride    : existingEntry?.providerOverride,
  authProfileOverride:          resetTriggered ? existingEntry?.authProfileOverride : existingEntry?.authProfileOverride,
  // ...
};

---

thinkingLevel:   resetTriggered ? void 0 : existingEntry?.thinkingLevel,
verboseLevel:    resetTriggered ? void 0 : existingEntry?.verboseLevel,
reasoningLevel:  resetTriggered ? void 0 : existingEntry?.reasoningLevel,
ttsAuto:         resetTriggered ? void 0 : existingEntry?.ttsAuto,
modelOverride:   resetTriggered ? void 0 : existingEntry?.modelOverride,
providerOverride:resetTriggered ? void 0 : existingEntry?.providerOverride,
authProfileOverride: resetTriggered ? void 0 : existingEntry?.authProfileOverride,
RAW_BUFFERClick to expand / collapse

Summary

In get-reply (compiled file dist/get-reply-*.js, around line 576), the session-entry construction uses trivial ternaries of the form resetTriggered ? X : X for six fields. Both branches are identical, so the conditional is effectively a no-op — the previous session's settings (thinkingLevel, verboseLevel, reasoningLevel, ttsAuto, modelOverride, providerOverride, authProfileOverride*) are always preserved on /reset.

This means /reset does not restore agent defaults like agents.list[].thinkingDefault or agents.defaults.thinkingDefault — those defaults are only consulted when no value was ever set, but the trivial ternary keeps any previously-set value alive across every reset.

Reproduction

  1. In any session, set /thinking off
  2. Run /reset
  3. Send a message
  4. Observe: the session is still at thinkingLevel: off, even with agents.defaults.thinkingDefault: "high" configured at the global level

Result: the only way to escape off is an explicit /thinking <level> command. Setting thinkingDefault in config has no effect for any session that has ever had an explicit thinking level set.

Affected version

[email protected] (npm latest)

Code (compiled dist/get-reply-*.js)

const sessionEntry = {
  ...!resetTriggered ? existingEntry : void 0,
  sessionId,
  sessionFile,
  updatedAt: now,
  thinkingLevel:                resetTriggered ? existingEntry?.thinkingLevel       : existingEntry?.thinkingLevel,
  verboseLevel:                 resetTriggered ? existingEntry?.verboseLevel        : existingEntry?.verboseLevel,
  reasoningLevel:               resetTriggered ? existingEntry?.reasoningLevel      : existingEntry?.reasoningLevel,
  ttsAuto:                      resetTriggered ? existingEntry?.ttsAuto             : existingEntry?.ttsAuto,
  responseUsage: !resetTriggered ? existingEntry?.responseUsage : void 0,
  modelOverride:                resetTriggered ? existingEntry?.modelOverride       : existingEntry?.modelOverride,
  providerOverride:             resetTriggered ? existingEntry?.providerOverride    : existingEntry?.providerOverride,
  authProfileOverride:          resetTriggered ? existingEntry?.authProfileOverride : existingEntry?.authProfileOverride,
  // ...
};

The pattern next to it (responseUsage) shows the intended shape — it discriminates between reset/non-reset (!resetTriggered ? existingEntry?.responseUsage : void 0). The six ternaries above appear to be a copy-paste that lost the distinguishing logic.

Expected behaviour

On /reset, the session-level overrides should fall back to agent-level / global defaults:

thinkingLevel:   resetTriggered ? void 0 : existingEntry?.thinkingLevel,
verboseLevel:    resetTriggered ? void 0 : existingEntry?.verboseLevel,
reasoningLevel:  resetTriggered ? void 0 : existingEntry?.reasoningLevel,
ttsAuto:         resetTriggered ? void 0 : existingEntry?.ttsAuto,
modelOverride:   resetTriggered ? void 0 : existingEntry?.modelOverride,
providerOverride:resetTriggered ? void 0 : existingEntry?.providerOverride,
authProfileOverride: resetTriggered ? void 0 : existingEntry?.authProfileOverride,

This way agentCfg?.thinkingDefault (and equivalents) actually take effect after reset, which matches the documented purpose of agents.defaults.thinkingDefault / agents.list[].thinkingDefault.

(If the design intent is in fact to preserve these across /reset, then the entire ternary should be replaced with the simple expression existingEntry?.thinkingLevel and the dead resetTriggered branch removed — the current form misleads anyone reading the code.)

Workaround

Manually patch sessions.json to set the desired thinkingLevel, then restart the gateway. From that point on, future resets will preserve the desired value (since the bug preserves whatever's there).

Impact

Low severity but high friction:

  • thinkingDefault config setting is silently ineffective for any returning user
  • Same applies to verboseLevel, reasoningLevel, model overrides, etc.
  • Users assume /reset returns to a clean state — it doesn't for these fields

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING

openclaw - ✅(Solved) Fix /reset preserves session-level thinkingLevel/etc — trivial ternaries in get-reply break agent default settings [1 pull requests, 1 comments, 2 participants]