Skip to content

fix(gateway): restart sentinel wakes the session after restart and preserves thread routing#53940

Merged
BunsDev merged 6 commits intoopenclaw:mainfrom
VACInc:fix/restart-sentinel-wake
Mar 25, 2026
Merged

fix(gateway): restart sentinel wakes the session after restart and preserves thread routing#53940
BunsDev merged 6 commits intoopenclaw:mainfrom
VACInc:fix/restart-sentinel-wake

Conversation

@VACInc
Copy link
Copy Markdown
Contributor

@VACInc VACInc commented Mar 24, 2026

Summary

  • Problem: restart sentinel could send a restart note without actually waking the interrupted session.
  • Why it matters: after restart, the in-progress session could stall instead of continuing.
  • What changed: startup restart-sentinel handling now queues a system event, requests an immediate wake for that session, and preserves explicit thread/topic routing through the wake-triggered reply path.
  • What did NOT change (scope boundary): no config changes, no heartbeat schedule changes, no broad routing rewrite outside restart-sentinel wake handling.

Change Type (select all)

  • Bug fix
  • Feature
  • Refactor required for the fix
  • Docs
  • Security hardening
  • Chore/infra

Scope (select all touched areas)

  • Gateway / orchestration
  • Memory / storage
  • Skills / tool execution
  • Auth / tokens
  • Integrations
  • API / contracts
  • UI / DX
  • CI/CD / infra

Linked Issue/PR

Root Cause / Regression History (if applicable)

  • Root cause: the restart-sentinel path was refactored into direct outbound delivery, which no longer guaranteed an agent turn for the interrupted session.
  • Missing detection / guardrail: no test covered "startup consumes restart sentinel and wakes the original session."
  • Prior context (git blame, prior PR, issue, or refactor if known): refactor: unify outbound session context wiring plus earlier restart-sentinel routing/thread fixes.
  • Why this regressed now: restart note delivery survived, but session wake did not.
  • If unknown, what was ruled out: N/A

Regression Test Plan (if applicable)

  • Coverage level that should have caught this:
    • Unit test
    • Seam / integration test
    • End-to-end test
    • Existing coverage already sufficient
  • Target test or file: src/gateway/server-restart-sentinel.test.ts, src/infra/heartbeat-runner.ghost-reminder.test.ts, src/infra/outbound/targets.test.ts, src/infra/system-events.test.ts
  • Scenario the test should lock in: startup restart-sentinel handling wakes the original session and preserves thread/topic routing.
  • Why this is the smallest reliable guardrail: it covers the exact startup -> wake -> routing seam without full restart E2E.
  • Existing test that already covers this (if any): partial coverage only.
  • If no new test is added, why not: N/A

User-visible / Behavior Changes

  • After restart, restart sentinel now wakes the interrupted session instead of only sending a best-effort restart note.
  • Wake-triggered replies preserve explicit thread/topic routing.

Security Impact (required)

  • New permissions/capabilities? (Yes/No): No
  • Secrets/tokens handling changed? (Yes/No): No
  • New/changed network calls? (Yes/No): No
  • Command/tool execution surface changed? (Yes/No): No
  • Data access scope changed? (Yes/No): No
  • If any Yes, explain risk + mitigation:

Repro + Verification

Environment

  • OS: Linux
  • Runtime/container: Node 22, pnpm
  • Model/provider: N/A
  • Integration/channel (if any): restart sentinel + heartbeat wake routing
  • Relevant config (redacted): agents.defaults.heartbeat.target=last

Steps

  1. Consume a restart sentinel on startup for a session with delivery context.
  2. Trigger the wake path for that session.
  3. Verify the reply routes back to the original thread/topic.

Expected

  • The interrupted session wakes after restart and replies in the original thread/topic.

Actual

  • Before: restart note could be sent without waking the session.
  • After: session wakes and thread/topic routing is preserved.

Evidence

Attach at least one:

  • Failing test/log before + passing after
  • Trace/log snippets
  • Screenshot/recording
  • Perf numbers (if relevant)

Human Verification (required)

  • Verified scenarios: targeted restart-sentinel, heartbeat-runner, outbound-target, and system-event tests pass; pnpm build passes.
  • Edge cases checked: retry does not drop the wake; partial turn-scoped metadata still preserves thread/topic routing.
  • What you did not verify: full live restart E2E against a real gateway/channel.

Review Conversations

  • I replied to or resolved every bot review conversation I addressed in this PR.
  • I left unresolved only the conversations that still need reviewer or maintainer judgment.

Compatibility / Migration

  • Backward compatible? (Yes/No): Yes
  • Config/env changes? (Yes/No): No
  • Migration needed? (Yes/No): No
  • If yes, exact upgrade steps:

Failure Recovery (if this breaks)

  • How to disable/revert this change quickly: revert this PR
  • Files/config to restore: src/gateway/server-restart-sentinel.ts, src/infra/system-events.ts, src/infra/outbound/targets.ts, src/infra/heartbeat-runner.ts
  • Known bad symptoms reviewers should watch for: restart note appears but the session still does not continue, or replies land in the wrong thread/topic

Risks and Mitigations

  • Risk:
    • Retried outbound restart notifications could duplicate the note in some transport failure modes.
  • Mitigation:
    • Retry is capped, and session wake no longer depends on outbound success.

@openclaw-barnacle openclaw-barnacle Bot added gateway Gateway runtime size: M labels Mar 24, 2026
@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented Mar 24, 2026

Greptile Summary

This PR fixes a regression where the restart sentinel could deliver a restart note but fail to wake the interrupted session, causing the in-progress session to stall after gateway restart. The fix unconditionally calls enqueueRestartSentinelWake (which queues the system event and calls requestHeartbeatNow) before attempting outbound delivery, so the session wake no longer depends on outbound success. Thread/topic routing is preserved through the wake path via DeliveryContext stored on SystemEvent entries and propagated to resolveHeartbeatDeliveryTarget.

Key changes:

  • scheduleRestartSentinelWake now calls enqueueRestartSentinelWake unconditionally (before outbound delivery, and for all no-route early-return paths), replacing the old enqueueSystemEvent-on-error pattern.
  • Outbound delivery is retried once (750ms delay, capped at 2 attempts) with a warning log; session wake is unaffected by delivery outcome.
  • SystemEvent gains an optional deliveryContext field; resolveSystemEventDeliveryContext merges contexts across queued events (newest wins on conflict).
  • resolveHeartbeatDeliveryTarget accepts a turnSource?: DeliveryContext that overrides mutable session routing fields for the wake turn, preserving explicit thread/topic routing.
  • resolveSessionDeliveryTarget in heartbeat mode uses turnSourceThreadId instead of the inherited session lastThreadId to avoid routing replies into stale threads.

One minor observation: In wakeDeliveryContext construction (line 106–109), payload.deliveryContext is used as the primary argument in mergeDeliveryContext, meaning payload.deliveryContext.threadId takes priority over the top-level payload.threadId. The outbound delivery path at lines 156–160 does the opposite (payload.threadId ?? first). In the unlikely edge case where both fields are set to different values, the wake-triggered heartbeat reply and the outbound restart notice would land in different threads. See the inline comment for a suggested fix.

Confidence Score: 4/5

  • Safe to merge; the core fix is correct and well-tested, with only a minor theoretical edge case in threadId priority worth a follow-up.
  • The primary bug (session not waking after restart) is correctly fixed by making the wake unconditional before outbound delivery. The thread-routing preservation through turnSource/resolveSystemEventDeliveryContext is logically sound and validated by targeted unit and integration tests. The only finding is a P2 priority inversion in wakeDeliveryContext that could cause misrouted replies when payload.threadId and payload.deliveryContext.threadId are both set and differ — an unlikely but theoretically possible edge case. Everything else (retry logic, clone isolation, turn-source channel override, heartbeat mode threadId handling) is correct.
  • src/gateway/server-restart-sentinel.ts lines 106–109 — minor threadId priority inconsistency worth addressing before merge.
Prompt To Fix All With AI
This is a comment left during a code review.
Path: src/gateway/server-restart-sentinel.ts
Line: 106-109

Comment:
**`payload.threadId` priority inverted vs outbound delivery path**

`mergeDeliveryContext(primary, fallback)` gives `payload.deliveryContext` priority, so if `payload.deliveryContext` already carries a `threadId`, `payload.threadId` is silently discarded. However the outbound delivery path at lines 156–160 does the opposite — `payload.threadId` wins via `??`:

```ts
const threadId =
  payload.threadId ??
  parsedTarget?.threadId ??
  sessionThreadId ??
  (origin?.threadId != null ? String(origin.threadId) : undefined);
```

In the edge case where both fields are present and differ, the wake-triggered heartbeat reply would land in a different thread than the outbound restart notice. Consider swapping the argument order to match the outbound priority:

```suggestion
  const wakeDeliveryContext = mergeDeliveryContext(
    payload.threadId != null ? { ...payload.deliveryContext, threadId: payload.threadId } : payload.deliveryContext,
    undefined,
  );
```

Or more simply:

```ts
const wakeDeliveryContext = normalizeDeliveryContext({
  ...payload.deliveryContext,
  ...(payload.threadId != null ? { threadId: payload.threadId } : {}),
});
```

This makes the priority consistent: `payload.threadId` (the top-level sentinel field) wins over `payload.deliveryContext.threadId`, matching the outbound path.

How can I resolve this? If you propose a fix, please make it concise.

Reviews (1): Last reviewed commit: "fix: preserve turnSource threadId in hea..." | Re-trigger Greptile

Comment thread src/gateway/server-restart-sentinel.ts
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 3b8599b924

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread src/infra/heartbeat-runner.ts Outdated
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 9d62919f08

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment on lines +99 to 102
const normalizedDeliveryContext = normalizeDeliveryContext(options?.deliveryContext);
entry.lastContextKey = normalizedContextKey;
if (entry.lastText === cleaned) {
return false;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Include delivery context in duplicate suppression key

enqueueSystemEvent now stores deliveryContext, but the duplicate check still only compares lastText. If the same system message is queued again with a different route (for example, same restart text but a new thread/topic), the second enqueue is dropped and the old route remains in the queue; resolveSystemEventDeliveryContext will then resolve stale routing and can send the wake-triggered reply to the wrong destination. Dedup should account for normalized delivery context (or update the queued event’s context) before returning false.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is directionally right as a generic system-event hardening point, but I am not taking it in this PR. The route-bearing enqueue introduced here is the restart-sentinel path, and that sentinel is consumed once on startup rather than being re-enqueued repeatedly with changing delivery context. For this branch I kept the fix scoped to the concrete wake regressions; if maintainers want, I can follow up separately on broader queue dedup semantics.

Comment thread src/gateway/server-restart-sentinel.ts
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c66b621e40

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread src/gateway/server-restart-sentinel.ts
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 033d9c35ed

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

// heartbeat mode intentionally drops inherited thread IDs to avoid replying
// in stale threads (e.g., Slack thread_ts). The sentinel's delivery context
// carries the correct topic/thread ID when present.
turnSourceThreadId: params.turnSource?.threadId,
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Gate turn-source thread IDs to target=last heartbeats

resolveHeartbeatDeliveryTarget now always passes turnSourceThreadId even when heartbeat.target is an explicit channel (not last). In that case resolveSessionDeliveryTarget can still attach the queued event's thread ID if the explicit channel matches the session's last channel, so an explicitly configured destination (e.g., fixed Telegram/Slack chat) can be forced into an unrelated old thread/topic after a restart wake. This is a regression from prior behavior (heartbeat mode dropped inherited thread IDs) and can misroute production heartbeat replies whenever a queued system event carries threadId.

Useful? React with 👍 / 👎.

VACInc and others added 6 commits March 24, 2026 21:45
Previously the restart sentinel note was delivered as an outbound message
with bestEffort:true, which silently swallowed failures. Even on success,
it never triggered an agent turn so the agent couldn't act on the note.

Changes:
- Always enqueue system event AND request heartbeat wake for the session
- Switch outbound delivery to bestEffort:false with retry (2 attempts)
- Log warnings on delivery failures instead of swallowing silently
- Add dedicated logger for restart-sentinel subsystem
… routing

Previously heartbeat mode dropped ALL threadIds, including the restart
sentinel's delivery context threadId. This meant sentinel-triggered
agent turns couldn't route replies back to Telegram forum topics.

Changes:
- resolveSessionDeliveryTarget now preserves turnSourceThreadId in
  heartbeat mode (but still drops session-inherited threadIds)
- resolveHeartbeatDeliveryTarget passes only explicit turnSource
  threadId, not merged session threadId
- Added tests for turn-source thread routing in heartbeat mode
@BunsDev BunsDev force-pushed the fix/restart-sentinel-wake branch from 033d9c3 to 958155a Compare March 25, 2026 04:36
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 958155acb4

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

// heartbeat mode intentionally drops inherited thread IDs to avoid replying
// in stale threads (e.g., Slack thread_ts). The sentinel's delivery context
// carries the correct topic/thread ID when present.
turnSourceThreadId: params.turnSource?.threadId,
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Skip turn-source thread IDs for non-last heartbeat targets

resolveHeartbeatDeliveryTarget now always passes params.turnSource?.threadId into resolveSessionDeliveryTarget, even when heartbeat.target is an explicit channel (not last). In that explicit-target case, if the configured channel matches the session’s lastChannel, heartbeat mode will still attach this thread/topic ID, so stale system-event routing metadata can force replies into an unrelated thread. This is a routing regression for explicit heartbeat destinations, which previously did not inherit thread IDs in heartbeat mode.

Useful? React with 👍 / 👎.

@BunsDev BunsDev merged commit 1c9f62f into openclaw:main Mar 25, 2026
40 of 41 checks passed
@BunsDev BunsDev self-assigned this Mar 25, 2026
netandreus pushed a commit to netandreus/openclaw that referenced this pull request Mar 25, 2026
…ves thread routing (openclaw#53940) thanks @VACInc

Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>
Co-authored-by: Val Alexander <68980965+BunsDev@users.noreply.github.com>
npmisantosh pushed a commit to npmisantosh/openclaw that referenced this pull request Mar 25, 2026
…ves thread routing (openclaw#53940) thanks @VACInc

Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>
Co-authored-by: Val Alexander <68980965+BunsDev@users.noreply.github.com>
fuller-stack-dev pushed a commit to fuller-stack-dev/openclaw that referenced this pull request Mar 25, 2026
…ves thread routing (openclaw#53940) thanks @VACInc

Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>
Co-authored-by: Val Alexander <68980965+BunsDev@users.noreply.github.com>
jacobtomlinson pushed a commit to jacobtomlinson/openclaw that referenced this pull request Mar 25, 2026
…ves thread routing (openclaw#53940) thanks @VACInc

Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>
Co-authored-by: Val Alexander <68980965+BunsDev@users.noreply.github.com>
planfit-alan added a commit to planfit/openclaw that referenced this pull request Mar 26, 2026
 partial)

- Add deliveryContext field to SystemEvent for routing preservation
- Wake interrupted session via heartbeat after restart (requestHeartbeatNow)
- Add retry logic for outbound delivery (2 attempts with 750ms delay)
- Preserve threadId routing through wake path
- Always enqueue wake even when delivery fails

Partial port of upstream 1c9f62f:
- Core: system-events deliveryContext, restart sentinel wake
- Deferred: heartbeat-runner turnSource integration, targets.ts routing updates
  (complex changes, requires more analysis)

Upstream commit:
- 1c9f62f: fix(gateway): restart sentinel wakes session after restart (openclaw#53940)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
planfit-alan added a commit to planfit/openclaw that referenced this pull request Mar 26, 2026
* port: before_dispatch hook delivery semantics (upstream a10d587, b497f3c)

- Add before_dispatch hook allowing plugins to intercept messages before model dispatch
- Extract sendFinalPayload helper to unify TTS + routing logic
- Preserve delivery semantics (TTS, routed delivery) when hook handles message
- Use canonical hook metadata (normalized conversation id, sender id, channel)

Upstream commits:
- a10d587: fix: preserve before_dispatch delivery semantics (openclaw#50444)
- b497f3c: fix: normalize before_dispatch conversation id

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* port: gateway restart sentinel wake + delivery context (upstream 1c9f62f partial)

- Add deliveryContext field to SystemEvent for routing preservation
- Wake interrupted session via heartbeat after restart (requestHeartbeatNow)
- Add retry logic for outbound delivery (2 attempts with 750ms delay)
- Preserve threadId routing through wake path
- Always enqueue wake even when delivery fails

Partial port of upstream 1c9f62f:
- Core: system-events deliveryContext, restart sentinel wake
- Deferred: heartbeat-runner turnSource integration, targets.ts routing updates
  (complex changes, requires more analysis)

Upstream commit:
- 1c9f62f: fix(gateway): restart sentinel wakes session after restart (openclaw#53940)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* port: prefer freshest duplicate session rows (upstream f48571b, 40f820f)

- Add resolveFreshestSessionStoreMatchFromStoreKeys to prefer newest updatedAt
- Add resolveFreshestSessionEntryFromStoreKeys wrapper
- Use in sessions.preview for duplicate row handling

Handles case-insensitive and legacy alias keys by sorting duplicates
by updatedAt timestamp and returning the freshest entry.

Upstream commits:
- f48571b: fix: prefer freshest duplicate rows in session loads
- 40f820f: fix: prefer freshest duplicate session rows in reads

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* fix: remove delivery-queue dependency (not yet ported)

Remove enqueueDelivery/ackDelivery/failDelivery usage from
server-restart-sentinel.ts as delivery-queue.ts is not yet ported
to our codebase. Keep retry logic but use agentCommand directly.

Resolves build failure.

* port: isolate channel startup failures (upstream 30e80fb)

Wrap individual channel startup in try-catch so one broken channel
(e.g. WhatsApp missing runtime) doesn't block other channels
(e.g. Discord) from starting.

Changes:
- Add try-catch in startChannels loop
- Log per-channel startup errors
- Continue starting remaining channels after failure

Upstream commit:
- 30e80fb: fix: isolate channel startup failures (openclaw#54215)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* fix: implement runBeforeDispatch without runClaimingHook

- Implement runBeforeDispatch directly using getHooksForName
- Remove GroupName check (not in our MsgContext)
- Fix TypeScript build errors

Resolves build failures after before_dispatch hook port.

* port: per-model cooldown scope + stepped backoff (upstream 8440122)

Scope rate-limit cooldowns per model so one 429 no longer blocks every
model on the same auth profile. Replace exponential 1min→1h escalation
with stepped 30s/1min/5min ladder.

Key changes:
- Add cooldownReason and cooldownModel to ProfileUsageStats type
- Implement stepped backoff: 30s → 1min → 5min (was: 1min → 5min → 25min → 60min)
- Add model-aware cooldown bypass in isProfileInCooldown()
- Track model scope when marking auth profile failures
- Pass modelId through markAuthProfileFailure and related calls
- Update isProfileInCooldown calls in model-fallback and pi-embedded-runner to pass forModel

Upstream ref: 8440122

* port: surface mid-turn 429 rate limits (upstream 4ae4d1f partial)

Surface rate limit and overload errors that occur mid-turn (after tool
calls) instead of silently returning an empty response.

Only applies when the assistant produced no valid (non-error) reply text,
so tool-level rate-limit messages don't override a successful turn.

Changes:
- Add isReasoning field to EmbeddedPiRunResult payload type
- Detect mid-turn rate limits in agent-runner-execution.ts when there's
  no valid content (checking for text/media, excluding errors/reasoning)
- Import isRateLimitErrorMessage and isOverloadedErrorMessage
- Replace empty responses with user-facing rate limit message

Note: Skipped upstream's incomplete turn detection in run.ts (detecting
stopReason=toolUse with no payloads) as it requires deep understanding
of our specific agent loop structure and could cause false positives.
The agent-runner-execution.ts check catches the issue at final output.

Upstream ref: 4ae4d1f (partial port)

* port: isolate session:patch hook payload (upstream 765182d, 3e2e9bc partial)

Changes:
- Add hasInternalHookListeners() to check for listeners before cloning
- Add session:patch hook with structuredClone to isolate payload
- Add SessionPatchHookEvent and isSessionPatchEvent() type guard
- Only clone and dispatch when listeners are registered (performance)

Why structuredClone:
Fire-and-forget hooks cannot mutate objects used by the response path.
Deep cloning sessionEntry, patch, and cfg prevents plugin corruption.

Skip model default reasoning guards (6c04ce3, b91374e):
Those patches require agentEntry.reasoningDefault and
modelState.resolveDefaultReasoningLevel() which haven't been ported yet.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
godlin-gh pushed a commit to YouMindInc/openclaw that referenced this pull request Mar 27, 2026
…ves thread routing (openclaw#53940) thanks @VACInc

Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>
Co-authored-by: Val Alexander <68980965+BunsDev@users.noreply.github.com>
lovewanwan pushed a commit to lovewanwan/openclaw that referenced this pull request Apr 28, 2026
…ves thread routing (openclaw#53940) thanks @VACInc

Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>
Co-authored-by: Val Alexander <68980965+BunsDev@users.noreply.github.com>
ogt-redknie pushed a commit to ogt-redknie/OPENX that referenced this pull request May 2, 2026
…ves thread routing (openclaw#53940) thanks @VACInc

Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>
Co-authored-by: Val Alexander <68980965+BunsDev@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

gateway Gateway runtime size: L

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants