import { assert, it } from "@effect/vitest";import { ProviderDriverKind, ProviderInstanceId } from "@t3tools/contracts"; import { CodexProviderCapabilitiesV2 } from "./Adapters/CodexAdapterV2.ts";import { decideProviderSessionTransition } from "./ProviderSessionTransitionPolicy.ts"; const driver = ProviderDriverKind.make("codex");const instanceId = ProviderInstanceId.make("codex");const base = { driver, continuationIdentity: { driverKind: driver, continuationKey: "codex:account:one" }, modelSelection: { instanceId, model: "gpt-5.1-codex" }, runtimeMode: "full-access" as const, interactionMode: "default" as const, workspace: "/repo", capabilities: CodexProviderCapabilitiesV2,}; it("reuses compatible sessions and treats interaction mode as turn-scoped", () => { assert.deepEqual( decideProviderSessionTransition({ current: base, target: { ...base, interactionMode: "plan", available: true }, }), { type: "reuse" }, );}); it("uses the adapter's selection transition classification", () => { assert.deepEqual( decideProviderSessionTransition({ current: base, target: { ...base, modelSelection: { ...base.modelSelection, model: "gpt-5.2-codex" }, available: true, }, selectionTransition: { type: "apply_on_next_turn" }, }), { type: "switch_model_in_session" }, ); assert.deepEqual( decideProviderSessionTransition({ current: { ...base, capabilities: { ...base.capabilities, sessions: { ...base.capabilities.sessions, supportsModelSwitchInSession: false }, }, }, target: { ...base, capabilities: { ...base.capabilities, sessions: { ...base.capabilities.sessions, supportsModelSwitchInSession: false }, }, modelSelection: { ...base.modelSelection, model: "gpt-5.2-codex" }, available: true, }, selectionTransition: { type: "restart_session" }, }), { type: "restart_and_resume" }, );}); it("treats provider option changes as selection changes", () => { assert.deepEqual( decideProviderSessionTransition({ current: { ...base, modelSelection: { ...base.modelSelection, options: [{ id: "reasoningEffort", value: "medium" }], }, }, target: { ...base, modelSelection: { ...base.modelSelection, options: [{ id: "reasoningEffort", value: "high" }], }, available: true, }, selectionTransition: { type: "apply_on_next_turn" }, }), { type: "switch_model_in_session" }, );}); it("restarts compatible instances for workspace or runtime changes", () => { assert.deepEqual( decideProviderSessionTransition({ current: base, target: { ...base, workspace: "/other", available: true }, }), { type: "restart_and_resume" }, );}); it("preserves a rejected selection when the workspace also changes", () => { assert.deepEqual( decideProviderSessionTransition({ current: base, target: { ...base, modelSelection: { ...base.modelSelection, model: "gpt-5.2-codex" }, workspace: "/other", available: true, }, selectionTransition: { type: "reject", reason: "The active session cannot apply that model.", }, }), { type: "reject", reason: "The active session cannot apply that model." }, );}); it("preserves handoff and missing-classification outcomes across workspace changes", () => { const target = { ...base, modelSelection: { ...base.modelSelection, model: "gpt-5.2-codex" }, workspace: "/other", available: true, }; assert.deepEqual( decideProviderSessionTransition({ current: base, target, selectionTransition: { type: "create_with_handoff" }, }), { type: "create_with_handoff" }, ); assert.deepEqual(decideProviderSessionTransition({ current: base, target }), { type: "reject", reason: "The provider adapter did not classify the selection change.", });}); it("uses portable handoff for incompatible continuation identities", () => { assert.deepEqual( decideProviderSessionTransition({ current: base, target: { ...base, modelSelection: { ...base.modelSelection, instanceId: ProviderInstanceId.make("codex_other"), }, continuationIdentity: { driverKind: driver, continuationKey: "codex:account:other" }, available: true, }, }), { type: "create_with_handoff" }, );}); it("uses portable handoff for cross-driver transitions", () => { const claudeDriver = ProviderDriverKind.make("claude"); assert.deepEqual( decideProviderSessionTransition({ current: base, target: { ...base, driver: claudeDriver, continuationIdentity: { driverKind: claudeDriver, continuationKey: "claude:account:one" }, modelSelection: { instanceId: ProviderInstanceId.make("claude"), model: "claude-opus-4-1", }, available: true, }, }), { type: "create_with_handoff" }, );});
import { assert, it } from "@effect/vitest";
import { ProviderDriverKind, ProviderInstanceId } from "@t3tools/contracts";
import { CodexProviderCapabilitiesV2 } from "./Adapters/CodexAdapterV2.ts";
import { decideProviderSessionTransition } from "./ProviderSessionTransitionPolicy.ts";
const driver = ProviderDriverKind.make("codex");
const instanceId = ProviderInstanceId.make("codex");
const base = {
driver,
continuationIdentity: { driverKind: driver, continuationKey: "codex:account:one" },
modelSelection: { instanceId, model: "gpt-5.1-codex" },
runtimeMode: "full-access" as const,
interactionMode: "default" as const,
workspace: "/repo",
capabilities: CodexProviderCapabilitiesV2,
};
it("reuses compatible sessions and treats interaction mode as turn-scoped", () => {
assert.deepEqual(
decideProviderSessionTransition({
current: base,
target: { ...base, interactionMode: "plan", available: true },
}),
{ type: "reuse" },
);
});
it("uses the adapter's selection transition classification", () => {
assert.deepEqual(
decideProviderSessionTransition({
current: base,
target: {
...base,
modelSelection: { ...base.modelSelection, model: "gpt-5.2-codex" },
available: true,
},
selectionTransition: { type: "apply_on_next_turn" },
}),
{ type: "switch_model_in_session" },
);
assert.deepEqual(
decideProviderSessionTransition({
current: {
...base,
capabilities: {
...base.capabilities,
sessions: { ...base.capabilities.sessions, supportsModelSwitchInSession: false },
},
},
target: {
...base,
capabilities: {
...base.capabilities,
sessions: { ...base.capabilities.sessions, supportsModelSwitchInSession: false },
},
modelSelection: { ...base.modelSelection, model: "gpt-5.2-codex" },
available: true,
},
selectionTransition: { type: "restart_session" },
}),
{ type: "restart_and_resume" },
);
});
it("treats provider option changes as selection changes", () => {
assert.deepEqual(
decideProviderSessionTransition({
current: {
...base,
modelSelection: {
...base.modelSelection,
options: [{ id: "reasoningEffort", value: "medium" }],
},
},
target: {
...base,
modelSelection: {
...base.modelSelection,
options: [{ id: "reasoningEffort", value: "high" }],
},
available: true,
},
selectionTransition: { type: "apply_on_next_turn" },
}),
{ type: "switch_model_in_session" },
);
});
it("restarts compatible instances for workspace or runtime changes", () => {
assert.deepEqual(
decideProviderSessionTransition({
current: base,
target: { ...base, workspace: "/other", available: true },
}),
{ type: "restart_and_resume" },
);
});
it("preserves a rejected selection when the workspace also changes", () => {
assert.deepEqual(
decideProviderSessionTransition({
current: base,
target: {
...base,
modelSelection: { ...base.modelSelection, model: "gpt-5.2-codex" },
workspace: "/other",
available: true,
},
selectionTransition: {
type: "reject",
reason: "The active session cannot apply that model.",
},
}),
{ type: "reject", reason: "The active session cannot apply that model." },
);
});
it("preserves handoff and missing-classification outcomes across workspace changes", () => {
const target = {
...base,
modelSelection: { ...base.modelSelection, model: "gpt-5.2-codex" },
workspace: "/other",
available: true,
};
assert.deepEqual(
decideProviderSessionTransition({
current: base,
target,
selectionTransition: { type: "create_with_handoff" },
}),
{ type: "create_with_handoff" },
);
assert.deepEqual(decideProviderSessionTransition({ current: base, target }), {
type: "reject",
reason: "The provider adapter did not classify the selection change.",
});
});
it("uses portable handoff for incompatible continuation identities", () => {
assert.deepEqual(
decideProviderSessionTransition({
current: base,
target: {
...base,
modelSelection: {
...base.modelSelection,
instanceId: ProviderInstanceId.make("codex_other"),
},
continuationIdentity: { driverKind: driver, continuationKey: "codex:account:other" },
available: true,
},
}),
{ type: "create_with_handoff" },
);
});
it("uses portable handoff for cross-driver transitions", () => {
const claudeDriver = ProviderDriverKind.make("claude");
assert.deepEqual(
decideProviderSessionTransition({
current: base,
target: {
...base,
driver: claudeDriver,
continuationIdentity: { driverKind: claudeDriver, continuationKey: "claude:account:one" },
modelSelection: {
instanceId: ProviderInstanceId.make("claude"),
model: "claude-opus-4-1",
},
available: true,
},
}),
{ type: "create_with_handoff" },
);
});