Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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