@@ -25,13 +25,14 @@ import {
2525 resetTaskRegistryForTests ,
2626} from "../../tasks/task-registry.js" ;
2727import { withTempDir } from "../../test-helpers/temp-dir.js" ;
28+ import { captureEnv , setTestEnvValue } from "../../test-utils/env.js" ;
2829import { setGatewayDedupeEntry } from "./agent-wait-dedupe.js" ;
2930import { agentHandlers } from "./agent.js" ;
3031import { chatHandlers } from "./chat.js" ;
3132import { expectSubagentFollowupReactivation } from "./subagent-followup.test-helpers.js" ;
3233import type { GatewayRequestContext } from "./types.js" ;
3334
34- const ORIGINAL_STATE_DIR = process . env . OPENCLAW_STATE_DIR ;
35+ const envSnapshot = captureEnv ( [ " OPENCLAW_STATE_DIR" ] ) ;
3536
3637const mocks = vi . hoisted ( ( ) => ( {
3738 loadSessionEntry : vi . fn ( ) ,
@@ -402,6 +403,10 @@ function resetTimeConfig() {
402403 vi . useRealTimers ( ) ;
403404}
404405
406+ function useTestStateDir ( root : string ) : void {
407+ setTestEnvValue ( "OPENCLAW_STATE_DIR" , root ) ;
408+ }
409+
405410async function expectResetCall ( expectedMessage : string ) {
406411 const call = await waitForAgentCommandCall ( ) ;
407412 expect ( mocks . performGatewaySessionReset ) . toHaveBeenCalledTimes ( 1 ) ;
@@ -562,11 +567,7 @@ async function invokeAgentIdentityGet(
562567
563568describe ( "gateway agent handler" , ( ) => {
564569 afterEach ( ( ) => {
565- if ( ORIGINAL_STATE_DIR === undefined ) {
566- delete process . env . OPENCLAW_STATE_DIR ;
567- } else {
568- process . env . OPENCLAW_STATE_DIR = ORIGINAL_STATE_DIR ;
569- }
570+ envSnapshot . restore ( ) ;
570571 resetDetachedTaskLifecycleRuntimeForTests ( ) ;
571572 resetTaskRegistryForTests ( ) ;
572573 resetSubagentRegistryForTests ( { persist : false } ) ;
@@ -3219,7 +3220,7 @@ describe("gateway agent handler", () => {
32193220
32203221 it ( "terminalizes successful async gateway agent runs in the shared task registry" , async ( ) => {
32213222 await withTempDir ( { prefix : "openclaw-gateway-agent-task-" } , async ( root ) => {
3222- process . env . OPENCLAW_STATE_DIR = root ;
3223+ useTestStateDir ( root ) ;
32233224 resetTaskRegistryForTests ( ) ;
32243225 primeMainAgentRun ( ) ;
32253226
@@ -3245,7 +3246,7 @@ describe("gateway agent handler", () => {
32453246
32463247 it ( "tracks plugin SDK subagent agent runs through the subagent registry only" , async ( ) => {
32473248 await withTempDir ( { prefix : "openclaw-gateway-plugin-subagent-task-" } , async ( root ) => {
3248- process . env . OPENCLAW_STATE_DIR = root ;
3249+ useTestStateDir ( root ) ;
32493250 resetTaskRegistryForTests ( ) ;
32503251 resetSubagentRegistryForTests ( { persist : false } ) ;
32513252 const runId = "plugin-subagent-task-run" ;
@@ -3365,7 +3366,7 @@ describe("gateway agent handler", () => {
33653366 await withTempDir (
33663367 { prefix : "openclaw-gateway-plugin-subagent-registry-fail-" } ,
33673368 async ( root ) => {
3368- process . env . OPENCLAW_STATE_DIR = root ;
3369+ useTestStateDir ( root ) ;
33693370 resetTaskRegistryForTests ( ) ;
33703371 resetSubagentRegistryForTests ( { persist : false } ) ;
33713372 subagentRegistryTesting . setDepsForTest ( {
@@ -3444,7 +3445,7 @@ describe("gateway agent handler", () => {
34443445
34453446 it ( "terminalizes failed async gateway agent runs in the shared task registry" , async ( ) => {
34463447 await withTempDir ( { prefix : "openclaw-gateway-agent-task-error-" } , async ( root ) => {
3447- process . env . OPENCLAW_STATE_DIR = root ;
3448+ useTestStateDir ( root ) ;
34483449 resetTaskRegistryForTests ( ) ;
34493450 primeMainAgentRun ( ) ;
34503451 mocks . agentCommand . mockRejectedValueOnce ( new Error ( "agent unavailable" ) ) ;
@@ -3471,7 +3472,7 @@ describe("gateway agent handler", () => {
34713472
34723473 it ( "preserves aborted async gateway agent runs as timed out" , async ( ) => {
34733474 await withTempDir ( { prefix : "openclaw-gateway-agent-task-aborted-" } , async ( root ) => {
3474- process . env . OPENCLAW_STATE_DIR = root ;
3475+ useTestStateDir ( root ) ;
34753476 resetTaskRegistryForTests ( ) ;
34763477 primeMainAgentRun ( ) ;
34773478 mocks . agentCommand . mockResolvedValueOnce ( {
@@ -3507,7 +3508,7 @@ describe("gateway agent handler", () => {
35073508
35083509 it ( "classifies aborted async gateway agent rejections as timed out" , async ( ) => {
35093510 await withTempDir ( { prefix : "openclaw-gateway-agent-task-abort-error-" } , async ( root ) => {
3510- process . env . OPENCLAW_STATE_DIR = root ;
3511+ useTestStateDir ( root ) ;
35113512 resetTaskRegistryForTests ( ) ;
35123513 primeMainAgentRun ( ) ;
35133514 const abortError = new Error ( "This operation was aborted" ) ;
@@ -3550,7 +3551,7 @@ describe("gateway agent handler", () => {
35503551
35513552 it ( "preserves restart ownership for aborted async gateway agent rejections" , async ( ) => {
35523553 await withTempDir ( { prefix : "openclaw-gateway-agent-task-restart-abort-" } , async ( root ) => {
3553- process . env . OPENCLAW_STATE_DIR = root ;
3554+ useTestStateDir ( root ) ;
35543555 resetTaskRegistryForTests ( ) ;
35553556 primeMainAgentRun ( ) ;
35563557 const abortError = createAgentRunRestartAbortError ( ) ;
@@ -3587,7 +3588,7 @@ describe("gateway agent handler", () => {
35873588
35883589 it ( "classifies timeout async gateway agent rejections as timed out" , async ( ) => {
35893590 await withTempDir ( { prefix : "openclaw-gateway-agent-task-timeout-error-" } , async ( root ) => {
3590- process . env . OPENCLAW_STATE_DIR = root ;
3591+ useTestStateDir ( root ) ;
35913592 resetTaskRegistryForTests ( ) ;
35923593 primeMainAgentRun ( ) ;
35933594 const timeoutError = new Error ( "chat run timed out" ) ;
@@ -3632,7 +3633,7 @@ describe("gateway agent handler", () => {
36323633 await withTempDir (
36333634 { prefix : "openclaw-gateway-agent-task-wrapped-timeout-error-" } ,
36343635 async ( root ) => {
3635- process . env . OPENCLAW_STATE_DIR = root ;
3636+ useTestStateDir ( root ) ;
36363637 resetTaskRegistryForTests ( ) ;
36373638 primeMainAgentRun ( ) ;
36383639 const timeoutReason = new Error ( "chat run timed out" ) ;
@@ -3681,7 +3682,7 @@ describe("gateway agent handler", () => {
36813682
36823683 it ( "does not hide provider timeout async gateway agent rejections" , async ( ) => {
36833684 await withTempDir ( { prefix : "openclaw-gateway-agent-task-provider-timeout-" } , async ( root ) => {
3684- process . env . OPENCLAW_STATE_DIR = root ;
3685+ useTestStateDir ( root ) ;
36853686 resetTaskRegistryForTests ( ) ;
36863687 primeMainAgentRun ( ) ;
36873688 const providerError = new Error ( "provider request timed out" ) ;
@@ -3722,7 +3723,7 @@ describe("gateway agent handler", () => {
37223723
37233724 it ( "does not overwrite operator-cancelled async gateway agent tasks after late completion" , async ( ) => {
37243725 await withTempDir ( { prefix : "openclaw-gateway-agent-task-cancelled-" } , async ( root ) => {
3725- process . env . OPENCLAW_STATE_DIR = root ;
3726+ useTestStateDir ( root ) ;
37263727 resetTaskRegistryForTests ( ) ;
37273728 primeMainAgentRun ( ) ;
37283729 let resolveRun : ( value : {
@@ -4616,7 +4617,7 @@ describe("gateway agent handler", () => {
46164617
46174618 it ( "dispatches async gateway agent task creation through the detached task runtime seam" , async ( ) => {
46184619 await withTempDir ( { prefix : "openclaw-gateway-agent-seam-" } , async ( root ) => {
4619- process . env . OPENCLAW_STATE_DIR = root ;
4620+ useTestStateDir ( root ) ;
46204621 resetTaskRegistryForTests ( ) ;
46214622 primeMainAgentRun ( ) ;
46224623
@@ -4675,7 +4676,7 @@ describe("gateway agent handler", () => {
46754676
46764677 it ( "logs a swallowed finalize error without blocking the background run" , async ( ) => {
46774678 await withTempDir ( { prefix : "openclaw-gateway-agent-finalize-throw-" } , async ( root ) => {
4678- process . env . OPENCLAW_STATE_DIR = root ;
4679+ useTestStateDir ( root ) ;
46794680 resetTaskRegistryForTests ( ) ;
46804681 primeMainAgentRun ( ) ;
46814682
@@ -5646,11 +5647,7 @@ describe("gateway agent handler", () => {
56465647
56475648describe ( "gateway agent handler chat.abort integration" , ( ) => {
56485649 function resetIntegrationState ( ) {
5649- if ( ORIGINAL_STATE_DIR === undefined ) {
5650- delete process . env . OPENCLAW_STATE_DIR ;
5651- } else {
5652- process . env . OPENCLAW_STATE_DIR = ORIGINAL_STATE_DIR ;
5653- }
5650+ envSnapshot . restore ( ) ;
56545651 resetDetachedTaskLifecycleRuntimeForTests ( ) ;
56555652 resetTaskRegistryForTests ( ) ;
56565653 mocks . agentCommand . mockReset ( ) ;
0 commit comments