From 10ce409d3045e355d0e95c4bc506b33282c814c4 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Wed, 27 May 2026 02:02:45 +0100 Subject: [PATCH] fix: resolve post-rebase agent runtime drift --- .../embedded-agent-runner/compact.queued.ts | 2 +- src/agents/embedded-agent-runner/compact.ts | 2 +- src/agents/harness/native-hook-relay.ts | 2 -- src/agents/tool-call-id.ts | 6 +--- .../reply/agent-runner-execution.ts | 31 +++++++------------ .../reply/agent-runner-memory.test.ts | 18 +++++------ src/auto-reply/reply/agent-runner-memory.ts | 19 +++++------- src/auto-reply/reply/commands-compact.test.ts | 2 +- src/cli/logs-cli.ts | 3 +- src/tui/tui-event-handlers.ts | 2 +- 10 files changed, 33 insertions(+), 54 deletions(-) diff --git a/src/agents/embedded-agent-runner/compact.queued.ts b/src/agents/embedded-agent-runner/compact.queued.ts index bfa347d15e0..fcc40ba33f4 100644 --- a/src/agents/embedded-agent-runner/compact.queued.ts +++ b/src/agents/embedded-agent-runner/compact.queued.ts @@ -94,7 +94,7 @@ async function deferOwningContextEngineBudgetCompaction(params: { compactParams: CompactEmbeddedAgentSessionParams; contextEngine: ContextEngine; contextEngineRuntimeContext: ContextEngineRuntimeContext; -}): Promise { +}): Promise { let deferredScheduled = false; let deferredScheduleFailure: unknown; try { diff --git a/src/agents/embedded-agent-runner/compact.ts b/src/agents/embedded-agent-runner/compact.ts index 1b5944c4a52..94c4eaa8dc8 100644 --- a/src/agents/embedded-agent-runner/compact.ts +++ b/src/agents/embedded-agent-runner/compact.ts @@ -722,7 +722,7 @@ async function compactEmbeddedAgentSessionDirectOnce( model: effectiveModel, modelApi: effectiveModel.api, harnessId: params.agentHarnessId, - harnessRuntime: selectedHarnessRuntime, + harnessRuntime: runtimeHarnessPolicy.runtime, authProfileProvider: authProfileId?.split(":", 1)[0], sessionAuthProfileId: authProfileId, config: params.config, diff --git a/src/agents/harness/native-hook-relay.ts b/src/agents/harness/native-hook-relay.ts index 5138a8d2cea..d7686e2ff31 100644 --- a/src/agents/harness/native-hook-relay.ts +++ b/src/agents/harness/native-hook-relay.ts @@ -15,8 +15,6 @@ import { privateFileStoreSync } from "../../infra/private-file-store.js"; import { createSubsystemLogger } from "../../logging/subsystem.js"; import { hasGlobalHooks } from "../../plugins/hook-runner-global.js"; import { PluginApprovalResolutions } from "../../plugins/types.js"; -import { uniqueValues } from "../../shared/string-normalization.js"; -import { asBoolean } from "../../utils/boolean.js"; import { hasBeforeToolCallPolicy, runBeforeToolCallHook } from "../agent-tools.before-tool-call.js"; import { stableStringify } from "../stable-stringify.js"; import { resolveToolLoopDetectionConfig } from "../tool-loop-detection-config.js"; diff --git a/src/agents/tool-call-id.ts b/src/agents/tool-call-id.ts index a661273cc84..93caa5b37fe 100644 --- a/src/agents/tool-call-id.ts +++ b/src/agents/tool-call-id.ts @@ -1,10 +1,6 @@ import { createHash } from "node:crypto"; import type { AgentMessage } from "./runtime/index.js"; -import { - hasUnredactedSessionsSpawnAttachments, - isAllowedToolCallName, - normalizeAllowedToolNames, -} from "./tool-call-shared.js"; +import { isAllowedToolCallName, normalizeAllowedToolNames } from "./tool-call-shared.js"; export type ToolCallIdMode = "strict" | "strict9"; const NATIVE_ANTHROPIC_TOOL_USE_ID_RE = /^toolu_[A-Za-z0-9_]+$/; diff --git a/src/auto-reply/reply/agent-runner-execution.ts b/src/auto-reply/reply/agent-runner-execution.ts index e9841726a14..0326dcf6e9c 100644 --- a/src/auto-reply/reply/agent-runner-execution.ts +++ b/src/auto-reply/reply/agent-runner-execution.ts @@ -17,20 +17,6 @@ import { import { resolveBootstrapWarningSignaturesSeen } from "../../agents/bootstrap-budget.js"; import { getCliSessionBinding } from "../../agents/cli-session.js"; import { resolveContextTokensForModel } from "../../agents/context.js"; -import { ensureSelectedAgentHarnessPlugin } from "../../agents/harness/runtime-plugin.js"; -import { resolveAgentHarnessPolicy } from "../../agents/harness/selection.js"; -import { LiveSessionModelSwitchError } from "../../agents/live-model-switch-error.js"; -import { runWithModelFallback, isFallbackSummaryError } from "../../agents/model-fallback.js"; -import { - listLegacyRuntimeModelProviderAliases, - resolveCliRuntimeExecutionProvider, -} from "../../agents/model-runtime-aliases.js"; -import { - isCliProvider, - resolveModelRefFromString, - resolvePersistedOverrideModelRef, -} from "../../agents/model-selection.js"; -import { resolveOpenAIRuntimeProvider } from "../../agents/openai-codex-routing.js"; import { BILLING_ERROR_USER_MESSAGE, formatRateLimitOrOverloadedErrorCopy, @@ -45,6 +31,17 @@ import { import { sanitizeUserFacingText } from "../../agents/embedded-agent-helpers/sanitize-user-facing-text.js"; import { isMessagingToolSendAction } from "../../agents/embedded-agent-messaging.js"; import { runEmbeddedAgent } from "../../agents/embedded-agent.js"; +import { ensureSelectedAgentHarnessPlugin } from "../../agents/harness/runtime-plugin.js"; +import { resolveAgentHarnessPolicy } from "../../agents/harness/selection.js"; +import { LiveSessionModelSwitchError } from "../../agents/live-model-switch-error.js"; +import { runWithModelFallback, isFallbackSummaryError } from "../../agents/model-fallback.js"; +import { resolveCliRuntimeExecutionProvider } from "../../agents/model-runtime-aliases.js"; +import { + isCliProvider, + resolveModelRefFromString, + resolvePersistedOverrideModelRef, +} from "../../agents/model-selection.js"; +import { resolveOpenAIRuntimeProvider } from "../../agents/openai-codex-routing.js"; import { buildAgentRuntimeOutcomePlan } from "../../agents/runtime-plan/build.js"; import { resolveGroupSessionKey, @@ -1305,11 +1302,7 @@ export function resolveSessionRuntimeOverrideForProvider(params: { if (provider === "openai" && runtime === "codex") { return "codex"; } - return listLegacyRuntimeModelProviderAliases().find( - (alias) => - normalizeLowercaseStringOrEmpty(alias.provider) === provider && - normalizeLowercaseStringOrEmpty(alias.runtime) === runtime, - )?.runtime; + return undefined; } export function resolveRunAfterAutoFallbackPrimaryProbeRecheck(params: { diff --git a/src/auto-reply/reply/agent-runner-memory.test.ts b/src/auto-reply/reply/agent-runner-memory.test.ts index fb361269e19..811a1e28646 100644 --- a/src/auto-reply/reply/agent-runner-memory.test.ts +++ b/src/auto-reply/reply/agent-runner-memory.test.ts @@ -1164,7 +1164,7 @@ describe("runMemoryFlushIfNeeded", () => { expect(refreshQueuedFollowupSessionMock).not.toHaveBeenCalled(); }); - it("uses the persisted Codex runtime context window for OpenAI preflight compaction", async () => { + it("skips OpenClaw preflight compaction for persisted Codex runtime sessions", async () => { registerMemoryFlushPlanResolverForTest(() => ({ softThresholdTokens: 4_000, forceFlushTranscriptBytes: 1_000_000_000, @@ -1181,7 +1181,7 @@ describe("runMemoryFlushIfNeeded", () => { agentHarnessId: "codex", }; - await runPreflightCompactionIfNeeded({ + const entry = await runPreflightCompactionIfNeeded({ cfg: { models: { providers: { @@ -1206,12 +1206,11 @@ describe("runMemoryFlushIfNeeded", () => { replyOperation: createReplyOperation(), }); - expect(compactEmbeddedAgentSessionMock).toHaveBeenCalledTimes(1); - const compactCall = requireCompactEmbeddedAgentSessionCall(); - expect(compactCall.currentTokenCount).toBe(347_000); + expect(entry).toBe(sessionEntry); + expect(compactEmbeddedAgentSessionMock).not.toHaveBeenCalled(); }); - it("still compacts when a fresh persisted token total is over the threshold", async () => { + it("skips fresh persisted token totals for persisted Codex runtime sessions", async () => { registerMemoryFlushPlanResolverForTest(() => ({ softThresholdTokens: 4_000, forceFlushTranscriptBytes: 1_000_000_000, @@ -1228,7 +1227,7 @@ describe("runMemoryFlushIfNeeded", () => { agentHarnessId: "codex", }; - await runPreflightCompactionIfNeeded({ + const entry = await runPreflightCompactionIfNeeded({ cfg: { models: { providers: { @@ -1253,9 +1252,8 @@ describe("runMemoryFlushIfNeeded", () => { replyOperation: createReplyOperation(), }); - expect(compactEmbeddedAgentSessionMock).toHaveBeenCalledTimes(1); - const compactCall = requireCompactEmbeddedAgentSessionCall(); - expect(compactCall.currentTokenCount).toBe(347_000); + expect(entry).toBe(sessionEntry); + expect(compactEmbeddedAgentSessionMock).not.toHaveBeenCalled(); }); it("keeps the OpenAI API context window for persisted OpenClaw runtime overrides", async () => { diff --git a/src/auto-reply/reply/agent-runner-memory.ts b/src/auto-reply/reply/agent-runner-memory.ts index 21093df5953..d3dbee89df6 100644 --- a/src/auto-reply/reply/agent-runner-memory.ts +++ b/src/auto-reply/reply/agent-runner-memory.ts @@ -1,19 +1,18 @@ import crypto from "node:crypto"; import fs from "node:fs"; import path from "node:path"; -import type { AgentMessage } from "../../agents/runtime/index.js"; import { resolveBootstrapWarningSignaturesSeen } from "../../agents/bootstrap-budget.js"; import { estimateMessagesTokens } from "../../agents/compaction.js"; -import { resolveAgentHarnessPolicy } from "../../agents/harness/policy.js"; -import { ensureSelectedAgentHarnessPlugin } from "../../agents/harness/runtime-plugin.js"; -import { runWithModelFallback } from "../../agents/model-fallback.js"; -import { listLegacyRuntimeModelProviderAliases } from "../../agents/model-runtime-aliases.js"; -import { isCliProvider } from "../../agents/model-selection.js"; -import { resolveContextConfigProviderForRuntime } from "../../agents/openai-codex-routing.js"; import { classifyCompactionReason, DEFERRED_CONTEXT_ENGINE_COMPACTION_REASON, } from "../../agents/embedded-agent-runner/compact-reasons.js"; +import { resolveAgentHarnessPolicy } from "../../agents/harness/policy.js"; +import { ensureSelectedAgentHarnessPlugin } from "../../agents/harness/runtime-plugin.js"; +import { runWithModelFallback } from "../../agents/model-fallback.js"; +import { isCliProvider } from "../../agents/model-selection.js"; +import { resolveContextConfigProviderForRuntime } from "../../agents/openai-codex-routing.js"; +import type { AgentMessage } from "../../agents/runtime/index.js"; import { resolveSandboxConfigForAgent, resolveSandboxRuntimeStatus } from "../../agents/sandbox.js"; import { derivePromptTokens, @@ -240,11 +239,7 @@ function resolveMemoryFlushRuntimeOverrideForProvider(params: { if (provider === "openai" && runtime === "codex") { return "codex"; } - return listLegacyRuntimeModelProviderAliases().find( - (alias) => - normalizeLowercaseStringOrEmpty(alias.provider) === provider && - normalizeLowercaseStringOrEmpty(alias.runtime) === runtime, - )?.runtime; + return undefined; } function resolveFollowupContextConfigProvider(params: { diff --git a/src/auto-reply/reply/commands-compact.test.ts b/src/auto-reply/reply/commands-compact.test.ts index cb6d73e8ce1..97eea4b03eb 100644 --- a/src/auto-reply/reply/commands-compact.test.ts +++ b/src/auto-reply/reply/commands-compact.test.ts @@ -191,7 +191,7 @@ describe("handleCompactCommand", () => { }); it("treats already-under-target manual compaction as skipped", async () => { - vi.mocked(compactEmbeddedPiSession).mockResolvedValueOnce({ + vi.mocked(compactEmbeddedAgentSession).mockResolvedValueOnce({ ok: false, compacted: false, reason: "already under target", diff --git a/src/cli/logs-cli.ts b/src/cli/logs-cli.ts index ae16a299c69..ba3a2ed9cde 100644 --- a/src/cli/logs-cli.ts +++ b/src/cli/logs-cli.ts @@ -13,8 +13,7 @@ import { formatErrorMessage } from "../infra/errors.js"; import { readConfiguredLogTail } from "../logging/log-tail.js"; import { parseLogLine } from "../logging/parse-log-line.js"; import { redactSensitiveLines, resolveRedactOptions } from "../logging/redact.js"; -import { formatTimestamp, isValidTimeZone } from "../logging/timestamps.js"; -import { createLazyImportLoader } from "../shared/lazy-promise.js"; +import { formatTimestamp } from "../logging/timestamps.js"; import { normalizeLowercaseStringOrEmpty } from "../shared/string-coerce.js"; import { formatDocsLink } from "../terminal/links.js"; import { clearActiveProgressLine } from "../terminal/progress-line.js"; diff --git a/src/tui/tui-event-handlers.ts b/src/tui/tui-event-handlers.ts index 1a9f30956aa..6f4f5d85e14 100644 --- a/src/tui/tui-event-handlers.ts +++ b/src/tui/tui-event-handlers.ts @@ -1,4 +1,4 @@ -import { isAuthErrorMessage } from "../agents/embedded-agent-helpers.js"; +import { classifyFailoverReason, isAuthErrorMessage } from "../agents/embedded-agent-helpers.js"; import { parseAgentSessionKey } from "../sessions/session-key-utils.js"; import { formatRawAssistantErrorForUi } from "../shared/assistant-error-format.js"; import { normalizeLowercaseStringOrEmpty } from "../shared/string-coerce.js";