





















@@ -92,6 +92,35 @@ async function readSessionFileJsonLines<T>(sessionFile: string): Promise<T[]> {
9292return entries;
9393}
949495+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", () => {
96125let tmpDir: string;
97126let storePath: string;
@@ -397,23 +426,26 @@ describe("CLI attempt execution", () => {
397426throw new Error("expected CLI transcript persistence to create a session file");
398427}
399428const entries = await readSessionFileEntries(sessionFile);
400-expect(entries[0]).toMatchObject({
429+expectRecordFields(requireRecord(entries[0], "session entry"), {
401430type: "session",
402431id: sessionEntry.sessionId,
403432cwd: 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"), {
407439type: "message",
408440parentId: entries[1]?.id,
409441});
410442const messages = await readSessionMessages(sessionFile);
411443expect(messages).toHaveLength(2);
412-expect(messages[0]).toMatchObject({
444+expectRecordFields(requireRecord(messages[0], "user message"), {
413445role: "user",
414446content: "persist this",
415447});
416-expect(messages[1]).toMatchObject({
448+expectRecordFields(requireRecord(messages[1], "assistant message"), {
417449role: "assistant",
418450api: "cli",
419451provider: "claude-cli",
@@ -456,7 +488,7 @@ describe("CLI attempt execution", () => {
456488457489let messages = await readSessionMessages(updatedFirst?.sessionFile ?? "");
458490expect(messages).toHaveLength(1);
459-expect(messages[0]).toMatchObject({
491+expectRecordFields(requireRecord(messages[0], "assistant message"), {
460492role: "assistant",
461493content: [{ type: "text", text: "already mirrored" }],
462494});
@@ -545,7 +577,7 @@ describe("CLI attempt execution", () => {
545577const messages = await readSessionMessages(sessionFile);
546578expect(messages).toHaveLength(3);
547579expect(messages.map((message) => message.role)).toEqual(["assistant", "user", "assistant"]);
548-expect(messages[2]).toMatchObject({
580+expectRecordFields(requireRecord(messages[2], "deduped assistant message"), {
549581content: [{ type: "text", text: "same answer" }],
550582});
551583});
@@ -580,7 +612,7 @@ describe("CLI attempt execution", () => {
580612});
581613582614const messages = await readSessionMessages(updatedEntry?.sessionFile ?? "");
583-expect(messages[0]).toMatchObject({
615+expectRecordFields(requireRecord(messages[0], "transcript user message"), {
584616role: "user",
585617content: "visible ask",
586618});
@@ -630,13 +662,11 @@ describe("CLI attempt execution", () => {
630662});
631663632664expect(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});
641671642672it("forwards runtime toolsAllow into CLI attempts so the CLI harness can fail closed", async () => {
@@ -682,12 +712,10 @@ describe("CLI attempt execution", () => {
682712sessionHasHistory: false,
683713});
684714685-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});
692720693721it("routes canonical Anthropic models through the configured Claude CLI runtime", async () => {
@@ -739,12 +767,10 @@ describe("CLI attempt execution", () => {
739767});
740768741769expect(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});
749775750776it("routes canonical OpenAI models through the configured Codex CLI runtime", async () => {
@@ -796,12 +822,10 @@ describe("CLI attempt execution", () => {
796822});
797823798824expect(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});
806830807831it("keeps one-shot model runs on the raw embedded provider path", async () => {
@@ -863,19 +887,17 @@ describe("CLI attempt execution", () => {
863887});
864888865889expect(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+});
879901expect(runEmbeddedPiAgentMock.mock.calls[0]?.[0]?.prompt).not.toContain(
880902"[Inter-session message]",
881903);
@@ -931,13 +953,11 @@ describe("CLI attempt execution", () => {
931953sessionHasHistory: false,
932954});
933955934-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});
942962943963it("forwards one-shot CLI cleanup to CLI providers", async () => {
@@ -984,12 +1004,10 @@ describe("CLI attempt execution", () => {
9841004sessionHasHistory: false,
9851005});
9861006987-expect(runCliAgentMock).toHaveBeenCalledWith(
988-expect.objectContaining({
989-cleanupBundleMcpOnRunEnd: true,
990-cleanupCliLiveSessionOnRunEnd: true,
991-}),
992-);
1007+expectMockArgFields(runCliAgentMock, {
1008+cleanupBundleMcpOnRunEnd: true,
1009+cleanupCliLiveSessionOnRunEnd: true,
1010+});
9931011expect(runEmbeddedPiAgentMock).not.toHaveBeenCalled();
9941012});
9951013});
@@ -1044,11 +1062,7 @@ describe("embedded attempt harness pinning", () => {
10441062sessionHasHistory: true,
10451063});
104610641047-expect(runEmbeddedPiAgent).toHaveBeenCalledWith(
1048-expect.objectContaining({
1049-agentHarnessId: undefined,
1050-}),
1051-);
1065+expectMockArgFields(runEmbeddedPiAgentMock, { agentHarnessId: undefined });
10521066});
1053106710541068it("ignores stale session Codex harness pins on non-OpenAI model switches", async () => {
@@ -1089,11 +1103,7 @@ describe("embedded attempt harness pinning", () => {
10891103sessionHasHistory: true,
10901104});
109111051092-expect(runEmbeddedPiAgent).toHaveBeenCalledWith(
1093-expect.objectContaining({
1094-agentHarnessId: undefined,
1095-}),
1096-);
1106+expectMockArgFields(runEmbeddedPiAgentMock, { agentHarnessId: undefined });
10971107});
1098110810991109it("forwards runtime toolsAllow into embedded attempts", async () => {
@@ -1136,11 +1146,7 @@ describe("embedded attempt harness pinning", () => {
11361146sessionHasHistory: false,
11371147});
113811481139-expect(runEmbeddedPiAgent).toHaveBeenCalledWith(
1140-expect.objectContaining({
1141-toolsAllow: ["read", "web_search"],
1142-}),
1143-);
1149+expectMockArgFields(runEmbeddedPiAgentMock, { toolsAllow: ["read", "web_search"] });
11441150});
1145115111461152it("lets provider/model runtime policy choose Codex without storing a session harness pin", async () => {
@@ -1190,11 +1196,7 @@ describe("embedded attempt harness pinning", () => {
11901196sessionHasHistory: true,
11911197});
119211981193-expect(runEmbeddedPiAgent).toHaveBeenCalledWith(
1194-expect.objectContaining({
1195-agentHarnessId: undefined,
1196-}),
1197-);
1199+expectMockArgFields(runEmbeddedPiAgentMock, { agentHarnessId: undefined });
11981200});
1199120112001202it("auto-forwards OpenAI Codex auth profiles to default Codex harness runs", async () => {
@@ -1249,13 +1251,11 @@ describe("embedded attempt harness pinning", () => {
12491251sessionHasHistory: true,
12501252});
125112531252-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});
1260126012611261it("pins a fresh OpenAI session to the Codex harness by default", async () => {
@@ -1295,11 +1295,7 @@ describe("embedded attempt harness pinning", () => {
12951295sessionHasHistory: false,
12961296});
129712971298-expect(runEmbeddedPiAgent).toHaveBeenCalledWith(
1299-expect.objectContaining({
1300-agentHarnessId: undefined,
1301-}),
1302-);
1298+expectMockArgFields(runEmbeddedPiAgentMock, { agentHarnessId: undefined });
13031299});
1304130013051301it("ignores stale OpenAI sessions pinned to PI and relies on default Codex routing", async () => {
@@ -1340,12 +1336,10 @@ describe("embedded attempt harness pinning", () => {
13401336sessionHasHistory: true,
13411337});
134213381343-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});
1350134413511345it("routes explicit OpenAI PI runs with Codex OAuth through the legacy Codex auth transport", async () => {
@@ -1397,15 +1391,13 @@ describe("embedded attempt harness pinning", () => {
13971391sessionHasHistory: false,
13981392});
139913931400-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});
1410140214111403it("does not pass CLI runtime aliases as embedded harness ids for fallback providers", async () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。