@@ -24,7 +24,11 @@ import {
2424 resolveProviderTextTransforms ,
2525 transformProviderSystemPrompt ,
2626} from "../../plugins/provider-runtime.js" ;
27- import { isCronSessionKey , isSubagentSessionKey } from "../../routing/session-key.js" ;
27+ import {
28+ isCronSessionKey ,
29+ isSubagentSessionKey ,
30+ parseAgentSessionKey ,
31+ } from "../../routing/session-key.js" ;
2832import { resolveSkillsPromptForRun } from "../../skills/loading/workspace.js" ;
2933import { resolveEmbeddedRunSkillEntries } from "../../skills/runtime/embedded-run-entries.js" ;
3034import {
@@ -41,6 +45,7 @@ import {
4145 setCompactionSafeguardCancelReason ,
4246} from "../agent-hooks/compaction-safeguard-runtime.js" ;
4347import { createPreparedEmbeddedAgentSettingsManager } from "../agent-project-settings.js" ;
48+ import { isDefaultAgentRuntimeId } from "../agent-runtime-id.js" ;
4449import {
4550 resolveAgentDir ,
4651 resolveRunModelFallbacksOverride ,
@@ -87,7 +92,6 @@ import {
8792import { isFallbackSummaryError , runWithModelFallback } from "../model-fallback.js" ;
8893import { supportsModelTools } from "../model-tool-support.js" ;
8994import { ensureOpenClawModelsJson } from "../models-config.js" ;
90- import { resolveContextConfigProviderForRuntime } from "../openai-codex-routing.js" ;
9195import { wrapStreamFnTextTransforms } from "../plugin-text-transforms.js" ;
9296import { resolveAgentPromptSurfaceForSessionKey } from "../prompt-surface.js" ;
9397import { registerProviderStreamForModel } from "../provider-stream.js" ;
@@ -489,20 +493,67 @@ async function compactEmbeddedAgentSessionDirectOnce(
489493 workspaceDir : resolvedWorkspace ,
490494 allowGatewaySubagentBinding : params . allowGatewaySubagentBinding ,
491495 } ) ;
496+ const earlyAgentIds = resolveSessionAgentIds ( {
497+ sessionKey : params . sessionKey ,
498+ config : params . config ,
499+ agentId : params . agentId ,
500+ } ) ;
501+ const agentDir =
502+ params . agentDir ?? resolveAgentDir ( params . config ?? { } , earlyAgentIds . sessionAgentId ) ;
503+ const runtimePolicySessionKey = params . sandboxSessionKey ?? params . sessionKey ;
504+ const runtimePolicyAgentId =
505+ params . sandboxSessionKey && parseAgentSessionKey ( params . sandboxSessionKey )
506+ ? undefined
507+ : params . agentId ;
508+ const policyCompactionTarget = resolveEmbeddedCompactionTarget ( {
509+ config : params . config ,
510+ provider : params . provider ,
511+ modelId : params . model ,
512+ authProfileId : params . authProfileId ,
513+ defaultProvider : DEFAULT_PROVIDER ,
514+ defaultModel : DEFAULT_MODEL ,
515+ } ) ;
516+ const configuredHarnessPolicy = resolveAgentHarnessPolicy ( {
517+ provider : policyCompactionTarget . provider ?? DEFAULT_PROVIDER ,
518+ modelId : policyCompactionTarget . model ?? DEFAULT_MODEL ,
519+ config : params . config ,
520+ agentId : runtimePolicyAgentId ,
521+ sessionKey : runtimePolicySessionKey ,
522+ } ) ;
523+ const configuredHarnessRuntime =
524+ configuredHarnessPolicy . runtimeSource &&
525+ configuredHarnessPolicy . runtimeSource !== "implicit" &&
526+ ! isDefaultAgentRuntimeId ( configuredHarnessPolicy . runtime )
527+ ? configuredHarnessPolicy . runtime
528+ : undefined ;
529+ const selectedHarnessRuntime = params . agentHarnessId ?? configuredHarnessRuntime ;
492530 const resolvedCompactionTarget = resolveEmbeddedCompactionTarget ( {
493531 config : params . config ,
494532 provider : params . provider ,
495533 modelId : params . model ,
496534 authProfileId : params . authProfileId ,
535+ harnessRuntime : selectedHarnessRuntime ,
497536 defaultProvider : DEFAULT_PROVIDER ,
498537 defaultModel : DEFAULT_MODEL ,
499538 } ) ;
500539 // Keep the configured provider for harness policy, while auth/model loading below can
501540 // route OpenAI compaction through Codex OAuth when that runtime owns the session credentials.
502541 const provider = resolvedCompactionTarget . provider ?? DEFAULT_PROVIDER ;
503542 const runtimeProvider = resolvedCompactionTarget . runtimeProvider ?? provider ;
543+ const contextConfigProvider = resolvedCompactionTarget . contextProvider ?? provider ;
504544 const modelId = resolvedCompactionTarget . model ?? DEFAULT_MODEL ;
505545 const authProfileId = resolvedCompactionTarget . authProfileId ;
546+ if ( runtimeProvider !== provider || selectedHarnessRuntime ) {
547+ await ensureSelectedAgentHarnessPlugin ( {
548+ config : params . config ,
549+ provider,
550+ modelId,
551+ agentId : runtimePolicyAgentId ,
552+ sessionKey : runtimePolicySessionKey ,
553+ agentHarnessRuntimeOverride : selectedHarnessRuntime ,
554+ workspaceDir : resolvedWorkspace ,
555+ } ) ;
556+ }
506557 let thinkLevel : ThinkLevel = params . thinkLevel ?? "off" ;
507558 const attemptedThinking = new Set < ThinkLevel > ( ) ;
508559 const fail = ( reason : string , err ?: unknown ) : EmbeddedAgentCompactResult => {
@@ -531,13 +582,6 @@ async function compactEmbeddedAgentSessionDirectOnce(
531582 : undefined ,
532583 } ;
533584 } ;
534- const earlyAgentIds = resolveSessionAgentIds ( {
535- sessionKey : params . sessionKey ,
536- config : params . config ,
537- agentId : params . agentId ,
538- } ) ;
539- const agentDir =
540- params . agentDir ?? resolveAgentDir ( params . config ?? { } , earlyAgentIds . sessionAgentId ) ;
541585 await ensureOpenClawModelsJson ( params . config , agentDir , {
542586 workspaceDir : resolvedWorkspace ,
543587 } ) ;
@@ -627,11 +671,7 @@ async function compactEmbeddedAgentSessionDirectOnce(
627671 sessionId : params . sessionId ,
628672 cwd : effectiveCwd ,
629673 } ) ;
630- const { sessionAgentId : effectiveSkillAgentId } = resolveSessionAgentIds ( {
631- sessionKey : params . sessionKey ,
632- config : params . config ,
633- agentId : params . agentId ,
634- } ) ;
674+ const { sessionAgentId : effectiveSkillAgentId } = earlyAgentIds ;
635675
636676 let restoreSkillEnv : ( ( ) => void ) | undefined ;
637677 let compactionSessionManager : unknown = null ;
@@ -683,19 +723,9 @@ async function compactEmbeddedAgentSessionDirectOnce(
683723 // Apply contextTokens cap to model so session runtime's auto-compaction
684724 // threshold uses the effective limit, not the native context window.
685725 const runtimeModelWithContext = runtimeModel as ProviderRuntimeModel ;
686- const runtimeHarnessPolicy = resolveAgentHarnessPolicy ( {
687- provider,
688- modelId,
689- config : params . config ,
690- agentId : effectiveSkillAgentId ,
691- sessionKey : params . sessionKey ,
692- } ) ;
693726 const ctxInfo = resolveContextWindowInfo ( {
694727 cfg : params . config ,
695- provider : resolveContextConfigProviderForRuntime ( {
696- provider,
697- runtimeId : params . agentHarnessId ?? runtimeHarnessPolicy . runtime ,
698- } ) ,
728+ provider : contextConfigProvider ,
699729 modelId,
700730 modelContextTokens : readAgentModelContextTokens ( runtimeModel ) ,
701731 modelContextWindow : runtimeModelWithContext . contextWindow ,
@@ -731,7 +761,7 @@ async function compactEmbeddedAgentSessionDirectOnce(
731761 model : effectiveModel ,
732762 modelApi : effectiveModel . api ,
733763 harnessId : params . agentHarnessId ,
734- harnessRuntime : runtimeHarnessPolicy . runtime ,
764+ harnessRuntime : selectedHarnessRuntime ,
735765 authProfileProvider : authProfileId ?. split ( ":" , 1 ) [ 0 ] ,
736766 sessionAuthProfileId : authProfileId ,
737767 config : params . config ,
0 commit comments