






















@@ -3791,6 +3791,11 @@ describe("runCodexAppServerAttempt", () => {
37913791"features.codex_hooks": true,
37923792"hooks.PreToolUse": [],
37933793};
3794+const expectedConfig = {
3795+ ...config,
3796+"features.code_mode": true,
3797+"features.code_mode_only": true,
3798+};
3794379937953800await startOrResumeThread({
37963801client: { request } as never,
@@ -3811,8 +3816,8 @@ describe("runCodexAppServerAttempt", () => {
3811381638123817const requestCalls = request.mock.calls as unknown as Array<[string, { config?: unknown }]>;
38133818expect(requestCalls.map(([method]) => method)).toEqual(["thread/start", "thread/resume"]);
3814-expect(requestCalls[0]?.[1].config).toEqual(config);
3815-expect(requestCalls[1]?.[1].config).toEqual(config);
3819+expect(requestCalls[0]?.[1].config).toEqual(expectedConfig);
3820+expect(requestCalls[1]?.[1].config).toEqual(expectedConfig);
38163821});
3817382238183823it("merges native hook relay config with plugin app config when starting a thread", async () => {
@@ -3856,6 +3861,8 @@ describe("runCodexAppServerAttempt", () => {
38563861expect(requestCalls.map(([method]) => method)).toEqual(["thread/start"]);
38573862expect(requestCalls[0]?.[1].config).toEqual({
38583863"features.codex_hooks": true,
3864+"features.code_mode": true,
3865+"features.code_mode_only": true,
38593866hooks: { PreToolUse: [] },
38603867 ...createPluginAppConfigPatch(),
38613868});
@@ -3921,9 +3928,15 @@ describe("runCodexAppServerAttempt", () => {
39213928expect(requestCalls.map(([method]) => method)).toEqual(["thread/start", "thread/resume"]);
39223929expect(requestCalls[0]?.[1].config).toEqual({
39233930"features.codex_hooks": true,
3931+"features.code_mode": true,
3932+"features.code_mode_only": true,
39243933 ...createPluginAppConfigPatch(),
39253934});
3926-expect(requestCalls[1]?.[1].config).toEqual({ "features.codex_hooks": true });
3935+expect(requestCalls[1]?.[1].config).toEqual({
3936+"features.codex_hooks": true,
3937+"features.code_mode": true,
3938+"features.code_mode_only": true,
3939+});
39273940});
3928394139293942it("starts a new plugin app thread when full binding revalidation removes an app", async () => {
@@ -3979,6 +3992,8 @@ describe("runCodexAppServerAttempt", () => {
39793992const requestCalls = request.mock.calls as unknown as Array<[string, { config?: unknown }]>;
39803993expect(requestCalls.map(([method]) => method)).toEqual(["thread/start"]);
39813994expect(requestCalls[0]?.[1].config).toEqual({
3995+"features.code_mode": true,
3996+"features.code_mode_only": true,
39823997apps: {
39833998_default: {
39843999enabled: false,
@@ -4030,7 +4045,10 @@ describe("runCodexAppServerAttempt", () => {
4030404540314046const requestCalls = request.mock.calls as unknown as Array<[string, { config?: unknown }]>;
40324047expect(requestCalls.map(([method]) => method)).toEqual(["thread/resume"]);
4033-expect("config" in (requestCalls[0]?.[1] ?? {})).toBe(false);
4048+expect(requestCalls[0]?.[1].config).toEqual({
4049+"features.code_mode": true,
4050+"features.code_mode_only": true,
4051+});
40344052const binding = await readCodexAppServerBinding(sessionFile);
40354053expect(binding?.threadId).toBe("thread-existing");
40364054expect(binding?.pluginAppsFingerprint).toBe("plugin-apps-config-1");
@@ -4081,7 +4099,11 @@ describe("runCodexAppServerAttempt", () => {
40814099expect(buildPluginThreadConfig).toHaveBeenCalledTimes(1);
40824100const requestCalls = request.mock.calls as unknown as Array<[string, { config?: unknown }]>;
40834101expect(requestCalls.map(([method]) => method)).toEqual(["thread/start"]);
4084-expect(requestCalls[0]?.[1].config).toEqual(createPluginAppConfigPatch());
4102+expect(requestCalls[0]?.[1].config).toEqual({
4103+ ...createPluginAppConfigPatch(),
4104+"features.code_mode": true,
4105+"features.code_mode_only": true,
4106+});
40854107const binding = await readCodexAppServerBinding(sessionFile);
40864108expect(binding?.threadId).toBe("thread-recovered");
40874109expect(binding?.pluginAppsFingerprint).toBe("plugin-apps-config-1");
@@ -4139,7 +4161,10 @@ describe("runCodexAppServerAttempt", () => {
41394161expect(buildPluginThreadConfig).toHaveBeenCalledTimes(1);
41404162const requestCalls = request.mock.calls as unknown as Array<[string, { config?: unknown }]>;
41414163expect(requestCalls.map(([method]) => method)).toEqual(["thread/resume"]);
4142-expect("config" in (requestCalls[0]?.[1] ?? {})).toBe(false);
4164+expect(requestCalls[0]?.[1].config).toEqual({
4165+"features.code_mode": true,
4166+"features.code_mode_only": true,
4167+});
41434168});
4144416941454170it("rebuilds a partial plugin app binding after another plugin recovers", async () => {
@@ -4186,7 +4211,11 @@ describe("runCodexAppServerAttempt", () => {
41864211expect(buildPluginThreadConfig).toHaveBeenCalledTimes(1);
41874212const requestCalls = request.mock.calls as unknown as Array<[string, { config?: unknown }]>;
41884213expect(requestCalls.map(([method]) => method)).toEqual(["thread/start"]);
4189-expect(requestCalls[0]?.[1].config).toEqual(createTwoPluginAppConfigPatch());
4214+expect(requestCalls[0]?.[1].config).toEqual({
4215+ ...createTwoPluginAppConfigPatch(),
4216+"features.code_mode": true,
4217+"features.code_mode_only": true,
4218+});
41904219const binding = await readCodexAppServerBinding(sessionFile);
41914220expect(binding?.threadId).toBe("thread-recovered");
41924221expect(binding?.pluginAppsFingerprint).toBe("plugin-apps-config-2");
@@ -4242,7 +4271,11 @@ describe("runCodexAppServerAttempt", () => {
42424271expect(buildPluginThreadConfig).toHaveBeenCalledTimes(1);
42434272const requestCalls = request.mock.calls as unknown as Array<[string, { config?: unknown }]>;
42444273expect(requestCalls.map(([method]) => method)).toEqual(["thread/start"]);
4245-expect(requestCalls[0]?.[1].config).toEqual(createTwoCalendarAppConfigPatch());
4274+expect(requestCalls[0]?.[1].config).toEqual({
4275+ ...createTwoCalendarAppConfigPatch(),
4276+"features.code_mode": true,
4277+"features.code_mode_only": true,
4278+});
42464279const binding = await readCodexAppServerBinding(sessionFile);
42474280expect(binding?.threadId).toBe("thread-recovered");
42484281expect(binding?.pluginAppsFingerprint).toBe("plugin-apps-config-calendar-2");
@@ -4285,7 +4318,11 @@ describe("runCodexAppServerAttempt", () => {
4285431842864319const requestCalls = request.mock.calls as unknown as Array<[string, { config?: unknown }]>;
42874320expect(requestCalls.map(([method]) => method)).toEqual(["thread/start"]);
4288-expect(requestCalls[0]?.[1].config).toEqual(createPluginAppConfigPatch());
4321+expect(requestCalls[0]?.[1].config).toEqual({
4322+ ...createPluginAppConfigPatch(),
4323+"features.code_mode": true,
4324+"features.code_mode_only": true,
4325+});
42894326const binding = await readCodexAppServerBinding(sessionFile);
42904327expect(binding?.threadId).toBe("thread-plugins");
42914328expect(binding?.pluginAppsFingerprint).toBe("plugin-apps-config-1");
@@ -4349,6 +4386,11 @@ describe("runCodexAppServerAttempt", () => {
43494386model: "gpt-5.4-codex",
43504387approvalPolicy: "on-request",
43514388approvalsReviewer: "guardian_subagent",
4389+config: expect.objectContaining({
4390+"features.codex_hooks": true,
4391+"features.code_mode": true,
4392+"features.code_mode_only": true,
4393+}),
43524394sandbox: "danger-full-access",
43534395serviceTier: "priority",
43544396developerInstructions: expect.stringContaining(CODEX_GPT5_BEHAVIOR_CONTRACT),
@@ -4451,6 +4493,10 @@ describe("runCodexAppServerAttempt", () => {
44514493model: "gpt-5.4-codex",
44524494approvalPolicy: "on-request",
44534495approvalsReviewer: "guardian_subagent",
4496+config: {
4497+"features.code_mode": true,
4498+"features.code_mode_only": true,
4499+},
44544500sandbox: "danger-full-access",
44554501serviceTier: "flex",
44564502developerInstructions: expect.stringContaining(CODEX_GPT5_BEHAVIOR_CONTRACT),
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。