@@ -92,6 +92,35 @@ async function readSessionFileJsonLines<T>(sessionFile: string): Promise<T[]> {
9292 return entries ;
9393}
9494
95+ function requireRecord ( value : unknown , label : string ) : Record < string , unknown > {
96+ expect ( typeof value ) . toBe ( "object" ) ;
97+ expect ( value ) . not . toBeNull ( ) ;
98+ if ( typeof value !== "object" || value === null ) {
99+ throw new Error ( `${ label } was not an object` ) ;
100+ }
101+ return value as Record < string , unknown > ;
102+ }
103+
104+ function expectRecordFields ( record : Record < string , unknown > , fields : Record < string , unknown > ) {
105+ for ( const [ key , value ] of Object . entries ( fields ) ) {
106+ expect ( record [ key ] ) . toEqual ( value ) ;
107+ }
108+ }
109+
110+ function requireMockArg ( mock : typeof runCliAgentMock , callIndex : number , label : string ) {
111+ const arg = mock . mock . calls [ callIndex ] ?. [ 0 ] ;
112+ expect ( arg ) . toBeDefined ( ) ;
113+ return requireRecord ( arg , label ) ;
114+ }
115+
116+ function expectMockArgFields (
117+ mock : typeof runCliAgentMock ,
118+ fields : Record < string , unknown > ,
119+ callIndex = 0 ,
120+ ) {
121+ expectRecordFields ( requireMockArg ( mock , callIndex , "mock call argument" ) , fields ) ;
122+ }
123+
95124describe ( "CLI attempt execution" , ( ) => {
96125 let tmpDir : string ;
97126 let storePath : string ;
@@ -397,23 +426,26 @@ describe("CLI attempt execution", () => {
397426 throw new Error ( "expected CLI transcript persistence to create a session file" ) ;
398427 }
399428 const entries = await readSessionFileEntries ( sessionFile ) ;
400- expect ( entries [ 0 ] ) . toMatchObject ( {
429+ expectRecordFields ( requireRecord ( entries [ 0 ] , "session entry" ) , {
401430 type : "session" ,
402431 id : sessionEntry . sessionId ,
403432 cwd : tmpDir ,
404433 } ) ;
405- expect ( entries [ 1 ] ) . toMatchObject ( { type : "message" , parentId : null } ) ;
406- expect ( entries [ 2 ] ) . toMatchObject ( {
434+ expectRecordFields ( requireRecord ( entries [ 1 ] , "user transcript entry" ) , {
435+ type : "message" ,
436+ parentId : null ,
437+ } ) ;
438+ expectRecordFields ( requireRecord ( entries [ 2 ] , "assistant transcript entry" ) , {
407439 type : "message" ,
408440 parentId : entries [ 1 ] ?. id ,
409441 } ) ;
410442 const messages = await readSessionMessages ( sessionFile ) ;
411443 expect ( messages ) . toHaveLength ( 2 ) ;
412- expect ( messages [ 0 ] ) . toMatchObject ( {
444+ expectRecordFields ( requireRecord ( messages [ 0 ] , "user message" ) , {
413445 role : "user" ,
414446 content : "persist this" ,
415447 } ) ;
416- expect ( messages [ 1 ] ) . toMatchObject ( {
448+ expectRecordFields ( requireRecord ( messages [ 1 ] , "assistant message" ) , {
417449 role : "assistant" ,
418450 api : "cli" ,
419451 provider : "claude-cli" ,
@@ -456,7 +488,7 @@ describe("CLI attempt execution", () => {
456488
457489 let messages = await readSessionMessages ( updatedFirst ?. sessionFile ?? "" ) ;
458490 expect ( messages ) . toHaveLength ( 1 ) ;
459- expect ( messages [ 0 ] ) . toMatchObject ( {
491+ expectRecordFields ( requireRecord ( messages [ 0 ] , "assistant message" ) , {
460492 role : "assistant" ,
461493 content : [ { type : "text" , text : "already mirrored" } ] ,
462494 } ) ;
@@ -545,7 +577,7 @@ describe("CLI attempt execution", () => {
545577 const messages = await readSessionMessages ( sessionFile ) ;
546578 expect ( messages ) . toHaveLength ( 3 ) ;
547579 expect ( messages . map ( ( message ) => message . role ) ) . toEqual ( [ "assistant" , "user" , "assistant" ] ) ;
548- expect ( messages [ 2 ] ) . toMatchObject ( {
580+ expectRecordFields ( requireRecord ( messages [ 2 ] , "deduped assistant message" ) , {
549581 content : [ { type : "text" , text : "same answer" } ] ,
550582 } ) ;
551583 } ) ;
@@ -580,7 +612,7 @@ describe("CLI attempt execution", () => {
580612 } ) ;
581613
582614 const messages = await readSessionMessages ( updatedEntry ?. sessionFile ?? "" ) ;
583- expect ( messages [ 0 ] ) . toMatchObject ( {
615+ expectRecordFields ( requireRecord ( messages [ 0 ] , "transcript user message" ) , {
584616 role : "user" ,
585617 content : "visible ask" ,
586618 } ) ;
@@ -630,13 +662,11 @@ describe("CLI attempt execution", () => {
630662 } ) ;
631663
632664 expect ( runCliAgentMock ) . toHaveBeenCalledTimes ( 1 ) ;
633- expect ( runCliAgentMock ) . toHaveBeenCalledWith (
634- expect . objectContaining ( {
635- trigger : "user" ,
636- messageChannel : "discord" ,
637- messageProvider : "discord-voice" ,
638- } ) ,
639- ) ;
665+ expectMockArgFields ( runCliAgentMock , {
666+ trigger : "user" ,
667+ messageChannel : "discord" ,
668+ messageProvider : "discord-voice" ,
669+ } ) ;
640670 } ) ;
641671
642672 it ( "forwards runtime toolsAllow into CLI attempts so the CLI harness can fail closed" , async ( ) => {
@@ -682,12 +712,10 @@ describe("CLI attempt execution", () => {
682712 sessionHasHistory : false ,
683713 } ) ;
684714
685- expect ( runCliAgentMock ) . toHaveBeenCalledWith (
686- expect . objectContaining ( {
687- provider : "claude-cli" ,
688- toolsAllow : [ "read" , "web_search" ] ,
689- } ) ,
690- ) ;
715+ expectMockArgFields ( runCliAgentMock , {
716+ provider : "claude-cli" ,
717+ toolsAllow : [ "read" , "web_search" ] ,
718+ } ) ;
691719 } ) ;
692720
693721 it ( "routes canonical Anthropic models through the configured Claude CLI runtime" , async ( ) => {
@@ -739,12 +767,10 @@ describe("CLI attempt execution", () => {
739767 } ) ;
740768
741769 expect ( runEmbeddedPiAgentMock ) . not . toHaveBeenCalled ( ) ;
742- expect ( runCliAgentMock ) . toHaveBeenCalledWith (
743- expect . objectContaining ( {
744- provider : "claude-cli" ,
745- model : "claude-opus-4-7" ,
746- } ) ,
747- ) ;
770+ expectMockArgFields ( runCliAgentMock , {
771+ provider : "claude-cli" ,
772+ model : "claude-opus-4-7" ,
773+ } ) ;
748774 } ) ;
749775
750776 it ( "routes canonical OpenAI models through the configured Codex CLI runtime" , async ( ) => {
@@ -796,12 +822,10 @@ describe("CLI attempt execution", () => {
796822 } ) ;
797823
798824 expect ( runEmbeddedPiAgentMock ) . not . toHaveBeenCalled ( ) ;
799- expect ( runCliAgentMock ) . toHaveBeenCalledWith (
800- expect . objectContaining ( {
801- provider : "codex-cli" ,
802- model : "gpt-5.4" ,
803- } ) ,
804- ) ;
825+ expectMockArgFields ( runCliAgentMock , {
826+ provider : "codex-cli" ,
827+ model : "gpt-5.4" ,
828+ } ) ;
805829 } ) ;
806830
807831 it ( "keeps one-shot model runs on the raw embedded provider path" , async ( ) => {
@@ -863,19 +887,17 @@ describe("CLI attempt execution", () => {
863887 } ) ;
864888
865889 expect ( runCliAgentMock ) . not . toHaveBeenCalled ( ) ;
866- expect ( runEmbeddedPiAgentMock ) . toHaveBeenCalledWith (
867- expect . objectContaining ( {
868- provider : "anthropic" ,
869- model : "claude-opus-4-7" ,
870- agentHarnessId : "pi" ,
871- prompt : "raw prompt" ,
872- messageChannel : "discord" ,
873- messageProvider : "discord-voice" ,
874- modelRun : true ,
875- promptMode : "none" ,
876- disableTools : true ,
877- } ) ,
878- ) ;
890+ expectMockArgFields ( runEmbeddedPiAgentMock , {
891+ provider : "anthropic" ,
892+ model : "claude-opus-4-7" ,
893+ agentHarnessId : "pi" ,
894+ prompt : "raw prompt" ,
895+ messageChannel : "discord" ,
896+ messageProvider : "discord-voice" ,
897+ modelRun : true ,
898+ promptMode : "none" ,
899+ disableTools : true ,
900+ } ) ;
879901 expect ( runEmbeddedPiAgentMock . mock . calls [ 0 ] ?. [ 0 ] ?. prompt ) . not . toContain (
880902 "[Inter-session message]" ,
881903 ) ;
@@ -931,13 +953,11 @@ describe("CLI attempt execution", () => {
931953 sessionHasHistory : false ,
932954 } ) ;
933955
934- expect ( runEmbeddedPiAgentMock ) . toHaveBeenCalledWith (
935- expect . objectContaining ( {
936- provider : "openai" ,
937- model : "gpt-5.4" ,
938- bashElevated,
939- } ) ,
940- ) ;
956+ expectMockArgFields ( runEmbeddedPiAgentMock , {
957+ provider : "openai" ,
958+ model : "gpt-5.4" ,
959+ bashElevated,
960+ } ) ;
941961 } ) ;
942962
943963 it ( "forwards one-shot CLI cleanup to CLI providers" , async ( ) => {
@@ -984,12 +1004,10 @@ describe("CLI attempt execution", () => {
9841004 sessionHasHistory : false ,
9851005 } ) ;
9861006
987- expect ( runCliAgentMock ) . toHaveBeenCalledWith (
988- expect . objectContaining ( {
989- cleanupBundleMcpOnRunEnd : true ,
990- cleanupCliLiveSessionOnRunEnd : true ,
991- } ) ,
992- ) ;
1007+ expectMockArgFields ( runCliAgentMock , {
1008+ cleanupBundleMcpOnRunEnd : true ,
1009+ cleanupCliLiveSessionOnRunEnd : true ,
1010+ } ) ;
9931011 expect ( runEmbeddedPiAgentMock ) . not . toHaveBeenCalled ( ) ;
9941012 } ) ;
9951013} ) ;
@@ -1044,11 +1062,7 @@ describe("embedded attempt harness pinning", () => {
10441062 sessionHasHistory : true ,
10451063 } ) ;
10461064
1047- expect ( runEmbeddedPiAgent ) . toHaveBeenCalledWith (
1048- expect . objectContaining ( {
1049- agentHarnessId : undefined ,
1050- } ) ,
1051- ) ;
1065+ expectMockArgFields ( runEmbeddedPiAgentMock , { agentHarnessId : undefined } ) ;
10521066 } ) ;
10531067
10541068 it ( "ignores stale session Codex harness pins on non-OpenAI model switches" , async ( ) => {
@@ -1089,11 +1103,7 @@ describe("embedded attempt harness pinning", () => {
10891103 sessionHasHistory : true ,
10901104 } ) ;
10911105
1092- expect ( runEmbeddedPiAgent ) . toHaveBeenCalledWith (
1093- expect . objectContaining ( {
1094- agentHarnessId : undefined ,
1095- } ) ,
1096- ) ;
1106+ expectMockArgFields ( runEmbeddedPiAgentMock , { agentHarnessId : undefined } ) ;
10971107 } ) ;
10981108
10991109 it ( "forwards runtime toolsAllow into embedded attempts" , async ( ) => {
@@ -1136,11 +1146,7 @@ describe("embedded attempt harness pinning", () => {
11361146 sessionHasHistory : false ,
11371147 } ) ;
11381148
1139- expect ( runEmbeddedPiAgent ) . toHaveBeenCalledWith (
1140- expect . objectContaining ( {
1141- toolsAllow : [ "read" , "web_search" ] ,
1142- } ) ,
1143- ) ;
1149+ expectMockArgFields ( runEmbeddedPiAgentMock , { toolsAllow : [ "read" , "web_search" ] } ) ;
11441150 } ) ;
11451151
11461152 it ( "lets provider/model runtime policy choose Codex without storing a session harness pin" , async ( ) => {
@@ -1190,11 +1196,7 @@ describe("embedded attempt harness pinning", () => {
11901196 sessionHasHistory : true ,
11911197 } ) ;
11921198
1193- expect ( runEmbeddedPiAgent ) . toHaveBeenCalledWith (
1194- expect . objectContaining ( {
1195- agentHarnessId : undefined ,
1196- } ) ,
1197- ) ;
1199+ expectMockArgFields ( runEmbeddedPiAgentMock , { agentHarnessId : undefined } ) ;
11981200 } ) ;
11991201
12001202 it ( "auto-forwards OpenAI Codex auth profiles to default Codex harness runs" , async ( ) => {
@@ -1249,13 +1251,11 @@ describe("embedded attempt harness pinning", () => {
12491251 sessionHasHistory : true ,
12501252 } ) ;
12511253
1252- expect ( runEmbeddedPiAgent ) . toHaveBeenCalledWith (
1253- expect . objectContaining ( {
1254- agentHarnessId : undefined ,
1255- authProfileId : "openai-codex:work" ,
1256- authProfileIdSource : "auto" ,
1257- } ) ,
1258- ) ;
1254+ expectMockArgFields ( runEmbeddedPiAgentMock , {
1255+ agentHarnessId : undefined ,
1256+ authProfileId : "openai-codex:work" ,
1257+ authProfileIdSource : "auto" ,
1258+ } ) ;
12591259 } ) ;
12601260
12611261 it ( "pins a fresh OpenAI session to the Codex harness by default" , async ( ) => {
@@ -1295,11 +1295,7 @@ describe("embedded attempt harness pinning", () => {
12951295 sessionHasHistory : false ,
12961296 } ) ;
12971297
1298- expect ( runEmbeddedPiAgent ) . toHaveBeenCalledWith (
1299- expect . objectContaining ( {
1300- agentHarnessId : undefined ,
1301- } ) ,
1302- ) ;
1298+ expectMockArgFields ( runEmbeddedPiAgentMock , { agentHarnessId : undefined } ) ;
13031299 } ) ;
13041300
13051301 it ( "ignores stale OpenAI sessions pinned to PI and relies on default Codex routing" , async ( ) => {
@@ -1340,12 +1336,10 @@ describe("embedded attempt harness pinning", () => {
13401336 sessionHasHistory : true ,
13411337 } ) ;
13421338
1343- expect ( runEmbeddedPiAgentMock ) . toHaveBeenCalledWith (
1344- expect . objectContaining ( {
1345- provider : "openai" ,
1346- agentHarnessId : undefined ,
1347- } ) ,
1348- ) ;
1339+ expectMockArgFields ( runEmbeddedPiAgentMock , {
1340+ provider : "openai" ,
1341+ agentHarnessId : undefined ,
1342+ } ) ;
13491343 } ) ;
13501344
13511345 it ( "routes explicit OpenAI PI runs with Codex OAuth through the legacy Codex auth transport" , async ( ) => {
@@ -1397,15 +1391,13 @@ describe("embedded attempt harness pinning", () => {
13971391 sessionHasHistory : false ,
13981392 } ) ;
13991393
1400- expect ( runEmbeddedPiAgentMock ) . toHaveBeenCalledWith (
1401- expect . objectContaining ( {
1402- provider : "openai-codex" ,
1403- model : "gpt-5.4" ,
1404- agentHarnessId : undefined ,
1405- authProfileId : "openai-codex:work" ,
1406- authProfileIdSource : "user" ,
1407- } ) ,
1408- ) ;
1394+ expectMockArgFields ( runEmbeddedPiAgentMock , {
1395+ provider : "openai-codex" ,
1396+ model : "gpt-5.4" ,
1397+ agentHarnessId : undefined ,
1398+ authProfileId : "openai-codex:work" ,
1399+ authProfileIdSource : "user" ,
1400+ } ) ;
14091401 } ) ;
14101402
14111403 it ( "does not pass CLI runtime aliases as embedded harness ids for fallback providers" , async ( ) => {
0 commit comments