1import {
2 DEFAULT_PROVIDER_INTERACTION_MODE,
3 type ProviderInteractionMode,
4 type ServerProvider,
5} from "@t3tools/contracts";
6
7type InteractionModeProvider = Pick<ServerProvider, "showInteractionModeToggle">;
8
9/** Normalize saved T3 mode choices without changing native slash commands. */
10export function resolveProviderInteractionMode(
11 provider: InteractionModeProvider | null | undefined,
12 interactionMode: ProviderInteractionMode | null | undefined,
13): ProviderInteractionMode {
14 return provider?.showInteractionModeToggle === false
15 ? DEFAULT_PROVIDER_INTERACTION_MODE
16 : (interactionMode ?? DEFAULT_PROVIDER_INTERACTION_MODE);
17}
18
19export function resolveLegacyPlanModeEnabled(input: {
20 readonly loaded: boolean;
21 readonly preference: boolean | undefined;
22}): boolean {
23 return input.loaded && input.preference === true;
24}
25
26export function resolvePendingTaskInteractionMode(input: {
27 readonly preferenceLoaded: boolean;
28 readonly planModeEnabled: boolean;
29 readonly draftInteractionMode: ProviderInteractionMode | undefined;
30 readonly queuedInteractionMode: ProviderInteractionMode | undefined;
31 readonly provider?: InteractionModeProvider | null;
32}): ProviderInteractionMode {
33 if (input.provider?.showInteractionModeToggle === false) {
34 return DEFAULT_PROVIDER_INTERACTION_MODE;
35 }
36 if (input.planModeEnabled) {
37 return input.draftInteractionMode ?? DEFAULT_PROVIDER_INTERACTION_MODE;
38 }
39 if (!input.preferenceLoaded) {
40 // Only an existing queued task may retain its previous mode while the
41 // preference is unknown. A fresh draft still defaults to Build so a stale
42 // persisted Plan selection cannot bypass a disabled preference at launch.
43 return input.queuedInteractionMode ?? DEFAULT_PROVIDER_INTERACTION_MODE;
44 }
45 return DEFAULT_PROVIDER_INTERACTION_MODE;
46}