@@ -143,8 +143,22 @@ async function runValidateJsonAndGetPayload() {
143143 } ;
144144}
145145
146+ function firstWrittenConfig ( ) : OpenClawConfig {
147+ const written = mockWriteConfigFile . mock . calls . at ( 0 ) ?. [ 0 ] ;
148+ if ( ! written ) {
149+ throw new Error ( "expected written config" ) ;
150+ }
151+ return written ;
152+ }
153+
154+ function firstWriteConfigOptions ( ) :
155+ | { unsetPaths ?: string [ ] [ ] ; explicitSetPaths ?: string [ ] [ ] }
156+ | undefined {
157+ return mockWriteConfigFile . mock . calls . at ( 0 ) ?. [ 1 ] ;
158+ }
159+
146160function requireWriteOptions ( ) : { unsetPaths ?: string [ ] [ ] ; explicitSetPaths ?: string [ ] [ ] } {
147- const options = mockWriteConfigFile . mock . calls [ 0 ] ?. [ 1 ] ;
161+ const options = firstWriteConfigOptions ( ) ;
148162 if ( ! options ) {
149163 throw new Error ( "expected write options" ) ;
150164 }
@@ -251,7 +265,7 @@ describe("config cli", () => {
251265 await runConfigCommand ( [ "config" , "set" , "gateway.auth.mode" , "token" ] ) ;
252266
253267 expect ( mockWriteConfigFile ) . toHaveBeenCalledTimes ( 1 ) ;
254- const written = mockWriteConfigFile . mock . calls [ 0 ] ?. [ 0 ] ;
268+ const written = firstWrittenConfig ( ) ;
255269 expect ( written . gateway ?. auth ) . toEqual ( { mode : "token" } ) ;
256270 expect ( written . gateway ?. port ) . toBe ( 18789 ) ;
257271 expect ( written . agents ) . toEqual ( resolved . agents ) ;
@@ -339,7 +353,7 @@ describe("config cli", () => {
339353 await runConfigCommand ( [ "config" , "set" , "gateway.auth.mode" , "token" ] ) ;
340354
341355 expect ( mockWriteConfigFile ) . toHaveBeenCalledTimes ( 1 ) ;
342- const written = mockWriteConfigFile . mock . calls [ 0 ] ?. [ 0 ] ;
356+ const written = firstWrittenConfig ( ) ;
343357 expect ( written ) . not . toHaveProperty ( "agents.defaults.model" ) ;
344358 expect ( written ) . not . toHaveProperty ( "agents.defaults.contextWindow" ) ;
345359 expect ( written ) . not . toHaveProperty ( "agents.defaults.maxTokens" ) ;
@@ -370,7 +384,7 @@ describe("config cli", () => {
370384 ] ) ;
371385
372386 expect ( mockWriteConfigFile ) . toHaveBeenCalledTimes ( 1 ) ;
373- const written = mockWriteConfigFile . mock . calls [ 0 ] ?. [ 0 ] ;
387+ const written = firstWrittenConfig ( ) ;
374388 expect ( written . agents ?. defaults ?. model ) . toBe ( "openai/gpt-5.4" ) ;
375389 expect ( written . agents ?. defaults ?. imageGenerationModel ) . toEqual ( {
376390 primary : "openai/gpt-image-1" ,
@@ -403,7 +417,7 @@ describe("config cli", () => {
403417 ] ) ;
404418
405419 expect ( mockWriteConfigFile ) . toHaveBeenCalledTimes ( 1 ) ;
406- const written = mockWriteConfigFile . mock . calls [ 0 ] ?. [ 0 ] ;
420+ const written = firstWrittenConfig ( ) ;
407421 expect ( written . agents ?. defaults ?. model ) . toEqual ( {
408422 primary : "google/gemini-3.1-pro-preview" ,
409423 fallbacks : [ "google/gemini-3.1-pro-preview" ] ,
@@ -433,7 +447,7 @@ describe("config cli", () => {
433447 ] ) ;
434448
435449 expect ( mockWriteConfigFile ) . toHaveBeenCalledTimes ( 1 ) ;
436- const written = mockWriteConfigFile . mock . calls [ 0 ] ?. [ 0 ] ;
450+ const written = firstWrittenConfig ( ) ;
437451 expect ( written . agents ?. defaults ?. models ) . toEqual ( {
438452 "google/gemini-3.1-pro-preview" : { alias : "gemini" } ,
439453 } ) ;
@@ -508,7 +522,7 @@ describe("config cli", () => {
508522 ] ) ;
509523
510524 expect ( mockWriteConfigFile ) . toHaveBeenCalledTimes ( 1 ) ;
511- const written = mockWriteConfigFile . mock . calls [ 0 ] ?. [ 0 ] ;
525+ const written = firstWrittenConfig ( ) ;
512526 expect ( written . agents ?. defaults ?. models ) . toEqual ( {
513527 "openai/gpt-5.4" : { alias : "GPT" } ,
514528 "anthropic/claude-sonnet-4-6" : { alias : "Sonnet" } ,
@@ -541,7 +555,7 @@ describe("config cli", () => {
541555 ] ) ;
542556
543557 expect ( mockWriteConfigFile ) . toHaveBeenCalledTimes ( 1 ) ;
544- const written = mockWriteConfigFile . mock . calls [ 0 ] ?. [ 0 ] ;
558+ const written = firstWrittenConfig ( ) ;
545559 expect ( written . models ?. providers ?. ollama ?. models ) . toEqual ( [
546560 { id : "llama3.2" , name : "Llama 3.2 latest" , contextWindow : 131072 } ,
547561 { id : "qwen3" , name : "Qwen 3" } ,
@@ -565,7 +579,7 @@ describe("config cli", () => {
565579 await runConfigCommand ( [ "config" , "set" , "gateway.auth.mode" , "token" ] ) ;
566580
567581 expect ( mockWriteConfigFile ) . toHaveBeenCalledTimes ( 1 ) ;
568- const written = mockWriteConfigFile . mock . calls [ 0 ] ?. [ 0 ] ;
582+ const written = firstWrittenConfig ( ) ;
569583 expect ( written . gateway ?. auth ) . toEqual ( {
570584 mode : "token" ,
571585 token : "token-keep" ,
@@ -589,7 +603,7 @@ describe("config cli", () => {
589603 await runConfigCommand ( [ "config" , "set" , "gateway.auth.mode" , "password" ] ) ;
590604
591605 expect ( mockWriteConfigFile ) . toHaveBeenCalledTimes ( 1 ) ;
592- const written = mockWriteConfigFile . mock . calls [ 0 ] ?. [ 0 ] ;
606+ const written = firstWrittenConfig ( ) ;
593607 expect ( written . gateway ?. auth ) . toEqual ( {
594608 mode : "password" ,
595609 password : "password-keep" , // pragma: allowlist secret
@@ -617,7 +631,7 @@ describe("config cli", () => {
617631 ] ) ;
618632
619633 expect ( mockWriteConfigFile ) . toHaveBeenCalledTimes ( 1 ) ;
620- const written = mockWriteConfigFile . mock . calls [ 0 ] ?. [ 0 ] ;
634+ const written = firstWrittenConfig ( ) ;
621635 expect ( written . gateway ?. auth ) . toEqual ( {
622636 mode : "token" ,
623637 token : "token-keep" ,
@@ -824,7 +838,7 @@ describe("config cli", () => {
824838 await runConfigCommand ( [ "config" , "set" , "gateway.auth.mode" , "{bad" ] ) ;
825839
826840 expect ( mockWriteConfigFile ) . toHaveBeenCalledTimes ( 1 ) ;
827- const written = mockWriteConfigFile . mock . calls [ 0 ] ?. [ 0 ] ;
841+ const written = firstWrittenConfig ( ) ;
828842 expect ( written . gateway ?. auth ) . toEqual ( { mode : "{bad" } ) ;
829843 } ) ;
830844
@@ -870,7 +884,7 @@ describe("config cli", () => {
870884 ] ) ;
871885
872886 expect ( mockWriteConfigFile ) . toHaveBeenCalledTimes ( 1 ) ;
873- const written = mockWriteConfigFile . mock . calls [ 0 ] ?. [ 0 ] ;
887+ const written = firstWrittenConfig ( ) ;
874888 expect ( written . gateway ?. auth ) . toEqual ( { mode : "token" } ) ;
875889 } ) ;
876890
@@ -926,7 +940,7 @@ describe("config cli", () => {
926940 ] ) ;
927941
928942 expect ( mockWriteConfigFile ) . toHaveBeenCalledTimes ( 1 ) ;
929- const written = mockWriteConfigFile . mock . calls [ 0 ] ?. [ 0 ] ;
943+ const written = firstWrittenConfig ( ) ;
930944 expect ( written . channels ?. discord ?. token ) . toEqual ( {
931945 source : "env" ,
932946 provider : "default" ,
@@ -1000,7 +1014,7 @@ describe("config cli", () => {
10001014 ] ) ;
10011015
10021016 expect ( mockWriteConfigFile ) . toHaveBeenCalledTimes ( 1 ) ;
1003- const written = mockWriteConfigFile . mock . calls [ 0 ] ?. [ 0 ] ;
1017+ const written = firstWrittenConfig ( ) ;
10041018 expect ( written . secrets ?. providers ?. vaultfile ) . toEqual ( {
10051019 source : "file" ,
10061020 path : "/tmp/vault.json" ,
@@ -1358,7 +1372,7 @@ describe("config cli", () => {
13581372 ] ) ;
13591373
13601374 expect ( mockWriteConfigFile ) . toHaveBeenCalledTimes ( 1 ) ;
1361- const written = mockWriteConfigFile . mock . calls [ 0 ] ?. [ 0 ] ;
1375+ const written = firstWrittenConfig ( ) ;
13621376 expect ( written . channels ?. googlechat ?. serviceAccountRef ) . toEqual ( {
13631377 source : "file" ,
13641378 provider : "vaultfile" ,
@@ -1424,7 +1438,7 @@ describe("config cli", () => {
14241438 }
14251439
14261440 expect ( mockWriteConfigFile ) . toHaveBeenCalledTimes ( 1 ) ;
1427- const written = mockWriteConfigFile . mock . calls [ 0 ] ?. [ 0 ] ;
1441+ const written = firstWrittenConfig ( ) ;
14281442 expect ( written . gateway ?. auth ) . toEqual ( { mode : "token" } ) ;
14291443 } ) ;
14301444
@@ -1467,7 +1481,7 @@ describe("config cli", () => {
14671481 }
14681482
14691483 expect ( mockWriteConfigFile ) . toHaveBeenCalledTimes ( 1 ) ;
1470- const written = mockWriteConfigFile . mock . calls [ 0 ] ?. [ 0 ] ;
1484+ const written = firstWrittenConfig ( ) ;
14711485 expect ( written . agents ?. defaults ?. models ) . toEqual ( resolved . agents ?. defaults ?. models ) ;
14721486 expect ( written . agents ?. defaults ?. model ) . toEqual ( resolved . agents ?. defaults ?. model ) ;
14731487 expect ( written . agents ?. defaults ?. memorySearch ) . toEqual ( {
@@ -1553,7 +1567,7 @@ describe("config cli", () => {
15531567 }
15541568
15551569 expect ( mockWriteConfigFile ) . toHaveBeenCalledTimes ( 1 ) ;
1556- const written = mockWriteConfigFile . mock . calls [ 0 ] ?. [ 0 ] as Record < string , unknown > ;
1570+ const written = firstWrittenConfig ( ) as Record < string , unknown > ;
15571571 expect (
15581572 ( ( written . agents as Record < string , unknown > ) . defaults as Record < string , unknown > ) . models ,
15591573 ) . toEqual ( {
@@ -1601,7 +1615,7 @@ describe("config cli", () => {
16011615 fs . rmSync ( pathname , { force : true } ) ;
16021616 }
16031617
1604- const written = mockWriteConfigFile . mock . calls [ 0 ] ?. [ 0 ] as Record < string , unknown > ;
1618+ const written = firstWrittenConfig ( ) as Record < string , unknown > ;
16051619 expect (
16061620 ( ( written . agents as Record < string , unknown > ) . defaults as Record < string , unknown > ) . models ,
16071621 ) . toEqual ( {
@@ -1632,7 +1646,7 @@ describe("config cli", () => {
16321646 fs . rmSync ( pathname , { force : true } ) ;
16331647 }
16341648
1635- const written = mockWriteConfigFile . mock . calls [ 0 ] ?. [ 0 ] as Record < string , unknown > ;
1649+ const written = firstWrittenConfig ( ) as Record < string , unknown > ;
16361650 expect ( ( written . channels as Record < string , unknown > ) . slack ) . toEqual ( {
16371651 enabled : true ,
16381652 mode : "socket" ,
@@ -1838,7 +1852,7 @@ describe("config cli", () => {
18381852 fs . rmSync ( pathname , { force : true } ) ;
18391853 }
18401854
1841- const written = mockWriteConfigFile . mock . calls [ 0 ] ?. [ 0 ] as Record < string , unknown > ;
1855+ const written = firstWrittenConfig ( ) as Record < string , unknown > ;
18421856 const channels = ( written . channels as Record < string , unknown > ) . discord as Record <
18431857 string ,
18441858 unknown
@@ -2276,14 +2290,14 @@ describe("config cli", () => {
22762290 await runConfigCommand ( [ "config" , "unset" , "tools.alsoAllow" ] ) ;
22772291
22782292 expect ( mockWriteConfigFile ) . toHaveBeenCalledTimes ( 1 ) ;
2279- const written = mockWriteConfigFile . mock . calls [ 0 ] ?. [ 0 ] ;
2293+ const written = firstWrittenConfig ( ) ;
22802294 expect ( written . tools ) . not . toHaveProperty ( "alsoAllow" ) ;
22812295 expect ( written . agents ) . not . toHaveProperty ( "defaults" ) ;
22822296 expect ( written . agents ?. list ) . toEqual ( resolved . agents ?. list ) ;
22832297 expect ( written . gateway ) . toEqual ( resolved . gateway ) ;
22842298 expect ( written . tools ?. profile ) . toBe ( "coding" ) ;
22852299 expect ( written . logging ) . toEqual ( resolved . logging ) ;
2286- expect ( mockWriteConfigFile . mock . calls [ 0 ] ?. [ 1 ] ) . toEqual ( {
2300+ expect ( firstWriteConfigOptions ( ) ) . toEqual ( {
22872301 unsetPaths : [ [ "tools" , "alsoAllow" ] ] ,
22882302 } ) ;
22892303 } ) ;
@@ -2302,9 +2316,9 @@ describe("config cli", () => {
23022316 await runConfigCommand ( [ "config" , "unset" , "agents.list[1]" ] ) ;
23032317
23042318 expect ( mockWriteConfigFile ) . toHaveBeenCalledTimes ( 1 ) ;
2305- const written = mockWriteConfigFile . mock . calls [ 0 ] ?. [ 0 ] ;
2319+ const written = firstWrittenConfig ( ) ;
23062320 expect ( written . agents ?. list ) . toEqual ( [ { id : "agent-a" } , { id : "agent-c" } ] ) ;
2307- expect ( mockWriteConfigFile . mock . calls [ 0 ] ?. [ 1 ] ) . toBeUndefined ( ) ;
2321+ expect ( firstWriteConfigOptions ( ) ) . toBeUndefined ( ) ;
23082322 } ) ;
23092323
23102324 it ( "preserves write-level unset handling for numeric object keys" , async ( ) => {
@@ -2323,13 +2337,13 @@ describe("config cli", () => {
23232337 await runConfigCommand ( [ "config" , "unset" , "channels.discord.guilds.123" ] ) ;
23242338
23252339 expect ( mockWriteConfigFile ) . toHaveBeenCalledTimes ( 1 ) ;
2326- const written = mockWriteConfigFile . mock . calls [ 0 ] ?. [ 0 ] as {
2340+ const written = firstWrittenConfig ( ) as {
23272341 channels ?: { discord ?: { guilds ?: Record < string , unknown > } } ;
23282342 } ;
23292343 expect ( written . channels ?. discord ?. guilds ) . toEqual ( {
23302344 "456" : { channels : [ "alerts" ] } ,
23312345 } ) ;
2332- expect ( mockWriteConfigFile . mock . calls [ 0 ] ?. [ 1 ] ) . toEqual ( {
2346+ expect ( firstWriteConfigOptions ( ) ) . toEqual ( {
23332347 unsetPaths : [ [ "channels" , "discord" , "guilds" , "123" ] ] ,
23342348 } ) ;
23352349 } ) ;
0 commit comments