Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions apps/ade-cli/src/headlessLinearServices.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -420,7 +420,7 @@ describe("headlessLinearServices", () => {
});
expect(session.title).toBe("CTO Headless Session");
expect(session.model).toBe("gpt-5.5");
expect(session.modelId).toBe("openai/gpt-5.5-codex");
expect(session.modelId).toBe("openai/gpt-5.5");

Comment thread
coderabbitai[bot] marked this conversation as resolved.
services.dispose();
});
Expand All @@ -440,7 +440,7 @@ describe("headlessLinearServices", () => {
});

expect(codex.model).toBe("gpt-5.5");
expect(codex.modelId).toBe("openai/gpt-5.5-codex");
expect(codex.modelId).toBe("openai/gpt-5.5");
expect(claude.model).toBe("opus-1m");
expect(claude.modelId).toBe("anthropic/claude-opus-4-7-1m");

Expand Down
2 changes: 1 addition & 1 deletion apps/ade-cli/src/headlessLinearServices.ts
Original file line number Diff line number Diff line change
Expand Up @@ -396,7 +396,7 @@ function createHeadlessAgentChatService(projectRoot: string): HeadlessLinearServ
const identitySessionIds = new Map<string, string>();
const transcripts = new Map<string, HeadlessTranscriptEntry[]>();

const HEADLESS_MODEL_ID = "openai/gpt-5.5-codex";
const HEADLESS_MODEL_ID = "openai/gpt-5.5";

const clipText = (value: string, maxChars: number): string => {
const trimmed = value.trim();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -296,14 +296,14 @@ describe("aiIntegrationService", () => {
taskType: "review",
prompt: "Evaluate this step",
cwd: "/tmp",
model: "openai/gpt-5.4-codex",
model: "openai/gpt-5.4",
sessionId: "carry-forward-session",
permissionMode: "read-only",
});

expect(mockState.runProviderTask).toHaveBeenCalledWith(expect.objectContaining({
sessionId: "carry-forward-session",
descriptor: expect.objectContaining({ id: "openai/gpt-5.4-codex" }),
descriptor: expect.objectContaining({ id: "openai/gpt-5.4" }),
permissionMode: "read-only",
}));
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ const DEFAULT_AI_FEATURE_FLAGS: Record<AiFeatureKey, boolean> = {
};

const DEFAULT_CLAUDE_TASK_MODEL_ID = getDefaultModelDescriptor("claude")?.id ?? "anthropic/claude-sonnet-4-6";
const DEFAULT_CODEX_TASK_MODEL_ID = getDefaultModelDescriptor("codex")?.id ?? "openai/gpt-5.5-codex";
const DEFAULT_CODEX_TASK_MODEL_ID = getDefaultModelDescriptor("codex")?.id ?? "openai/gpt-5.5";

const TASK_DEFAULTS: Record<AiTaskType, RuntimeTaskDefaults> = {
planning: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -763,7 +763,7 @@ export function createCtoOperatorTools(deps: CtoOperatorToolDeps): Record<string
"Create a native ADE work chat session — the primary way to launch an AI agent in ADE. " +
"IMPORTANT: Always pass modelId when the user specifies a model. Use the full model ID " +
"(e.g. 'anthropic/claude-opus-4-7' for Opus, 'anthropic/claude-sonnet-4-6' for Sonnet, " +
"'anthropic/claude-haiku-4-5' for Haiku, 'openai/gpt-5.5-codex' for GPT-5.5). " +
"'anthropic/claude-haiku-4-5' for Haiku, 'openai/gpt-5.5' for GPT-5.5). " +
"If no modelId is passed, the CTO's default model preference is used. " +
"Set initialPrompt to seed the chat with a task description — the agent will begin working immediately. " +
"This creates a full ADE chat with UI, streaming, tool approval, and service integration. " +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1144,7 +1144,7 @@ describe("automationService integration", () => {
triggers: [{ type: "manual" as const }],
executor: { mode: "automation-bot", targetId: null },
modelConfig: {
orchestratorModel: { modelId: "openai/gpt-5.4-codex", thinkingLevel: "low" },
orchestratorModel: { modelId: "openai/gpt-5.4", thinkingLevel: "low" },
},
permissionConfig: { providers: { codex: "default" as const, opencode: "edit" as const } },
toolPalette: [] as const,
Expand Down Expand Up @@ -1242,7 +1242,7 @@ describe("automationService integration", () => {
},
modelConfig: {
orchestratorModel: {
modelId: "openai/gpt-5.4-codex",
modelId: "openai/gpt-5.4",
thinkingLevel: "medium",
},
},
Expand Down
31 changes: 18 additions & 13 deletions apps/desktop/src/main/services/chat/agentChatService.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5456,7 +5456,7 @@ describe("createAgentChatService", () => {
| { mode?: unknown; settings?: { model?: unknown; reasoning_effort?: unknown; developer_instructions?: unknown } }
| undefined;

expect(params?.approvalPolicy).toBe("untrusted");
expect(params?.approvalPolicy).toBe("unlessTrusted");
expect(params?.sandboxPolicy?.type).toBe("readOnly");
expect(params?.effort).toBe("medium");
expect(collaborationMode?.mode).toBe("plan");
Expand Down Expand Up @@ -5509,7 +5509,7 @@ describe("createAgentChatService", () => {
} | undefined;
const collaborationMode = params?.collaborationMode as { mode?: unknown } | undefined;

expect(params?.approvalPolicy).toBe("on-request");
expect(params?.approvalPolicy).toBe("onRequest");
expect(params?.sandboxPolicy?.type).toBe("workspaceWrite");
expect(params?.effort).toBe("medium");
expect(collaborationMode?.mode).toBe("default");
Expand Down Expand Up @@ -5573,8 +5573,8 @@ describe("createAgentChatService", () => {
reasoningEffort?: unknown;
} | undefined;
expect(params?.approvalPolicy).toBe("never");
expect(params?.sandbox).toBe("danger-full-access");
expect(params?.reasoningEffort).toBeUndefined();
expect(params?.sandbox).toBe("dangerFullAccess");
expect(params?.reasoningEffort).toBe("medium");

const turnStartRequest = mockState.codexRequestPayloads.find((payload) => payload.method === "turn/start");
const turnStartParams = turnStartRequest?.params as {
Expand All @@ -5587,10 +5587,10 @@ describe("createAgentChatService", () => {
expect(turnStartParams?.effort).toBe("medium");
});

it("uses the app-server's effective Codex policy for subsequent turn/start overrides", async () => {
it("persists the runtime-confirmed Codex reasoning effort while applying effective thread policy", async () => {
mockState.codexResponseOverrides.set("thread/start", () => ({
thread: { id: "thread-effective-start" },
approvalPolicy: "on-failure",
approvalPolicy: "onFailure",
sandbox: {
type: "workspaceWrite",
writableRoots: [],
Expand All @@ -5607,6 +5607,7 @@ describe("createAgentChatService", () => {
laneId: "lane-1",
provider: "codex",
model: "gpt-5.4",
reasoningEffort: "xhigh",
});

await service.sendMessage({
Expand All @@ -5618,13 +5619,15 @@ describe("createAgentChatService", () => {
expect(mockState.codexRequestPayloads.some((payload) => payload.method === "turn/start")).toBe(true);
});

const threadStartRequest = mockState.codexRequestPayloads.find((payload) => payload.method === "thread/start");
expect((threadStartRequest?.params as { reasoningEffort?: unknown } | undefined)?.reasoningEffort).toBe("xhigh");
const turnStartRequest = mockState.codexRequestPayloads.find((payload) => payload.method === "turn/start");
const turnStartParams = turnStartRequest?.params as {
approvalPolicy?: unknown;
sandboxPolicy?: { type?: unknown };
effort?: unknown;
} | undefined;
expect(turnStartParams?.approvalPolicy).toBe("on-failure");
expect(turnStartParams?.approvalPolicy).toBe("onFailure");
expect(turnStartParams?.sandboxPolicy?.type).toBe("workspaceWrite");
expect(turnStartParams?.effort).toBe("high");

Expand Down Expand Up @@ -5706,8 +5709,8 @@ describe("createAgentChatService", () => {
reasoningEffort?: unknown;
} | undefined;
expect(params?.approvalPolicy).toBe("never");
expect(params?.sandbox).toBe("danger-full-access");
expect(params?.reasoningEffort).toBeUndefined();
expect(params?.sandbox).toBe("dangerFullAccess");
expect(params?.reasoningEffort).toBe("medium");

const turnStartRequest = mockState.codexRequestPayloads.find((payload) => payload.method === "turn/start");
const turnStartParams = turnStartRequest?.params as {
Expand Down Expand Up @@ -5785,7 +5788,7 @@ describe("createAgentChatService", () => {
const resumeRequest = mockState.codexRequestPayloads.find((payload) => payload.method === "thread/resume");
const resumeParams = resumeRequest?.params as { approvalPolicy?: unknown; sandbox?: unknown } | undefined;
expect(resumeParams?.approvalPolicy).toBe("never");
expect(resumeParams?.sandbox).toBe("danger-full-access");
expect(resumeParams?.sandbox).toBe("dangerFullAccess");
});

it("does not auto-upgrade default Codex chats into plan mode", async () => {
Expand Down Expand Up @@ -5862,10 +5865,10 @@ describe("createAgentChatService", () => {
expect(sessionService.reopen).toHaveBeenCalledWith(session.id);
});

it("trusts the app-server's effective Codex policy on resume", async () => {
it("persists runtime-confirmed Codex reasoning effort while applying effective policy on resume", async () => {
mockState.codexResponseOverrides.set("thread/resume", () => ({
thread: { id: "thread-effective-resume" },
approvalPolicy: "on-failure",
approvalPolicy: "onFailure",
sandbox: { type: "workspaceWrite" },
reasoningEffort: "high",
}));
Expand All @@ -5886,11 +5889,13 @@ describe("createAgentChatService", () => {
codexApprovalPolicy: "never",
codexSandbox: "danger-full-access",
codexConfigSource: "flags",
reasoningEffort: "medium",
reasoningEffort: "xhigh",
});

const resumed = await service.resumeSession({ sessionId: session.id });

const resumeRequest = mockState.codexRequestPayloads.find((payload) => payload.method === "thread/resume");
expect((resumeRequest?.params as { reasoningEffort?: unknown } | undefined)?.reasoningEffort).toBe("xhigh");
expect(resumed.codexApprovalPolicy).toBe("on-failure");
expect(resumed.codexSandbox).toBe("workspace-write");
expect(resumed.permissionMode).toBe("default");
Expand Down
Loading
Loading