Browse Source

fix(foreground-fallback): only disable chain on explicit /model switch

Track which agents have ever been model-switched (model != chain primary).
Once marked, permanently disable fallback — even if user switches back to
chain[0]. Static config in opencode.json no longer disables fallback.
Michael Henke 1 month ago
parent
commit
8a150ec3c1
1 changed files with 12 additions and 6 deletions
  1. 12 6
      src/index.ts

+ 12 - 6
src/index.ts

@@ -139,6 +139,7 @@ const OhMyOpenCodeLite: Plugin = async (ctx) => {
   let agents: ReturnType<typeof getAgentConfigs>;
   let agents: ReturnType<typeof getAgentConfigs>;
   let mcps: ReturnType<typeof createBuiltinMcps>;
   let mcps: ReturnType<typeof createBuiltinMcps>;
   let modelArrayMap: Record<string, Array<{ id: string; variant?: string }>>;
   let modelArrayMap: Record<string, Array<{ id: string; variant?: string }>>;
+  let everModelSwitched: Set<string>;
   let runtimeChains: Record<string, string[]>;
   let runtimeChains: Record<string, string[]>;
   let multiplexerConfig: MultiplexerConfig;
   let multiplexerConfig: MultiplexerConfig;
   let multiplexerEnabled: boolean;
   let multiplexerEnabled: boolean;
@@ -213,6 +214,7 @@ const OhMyOpenCodeLite: Plugin = async (ctx) => {
       string,
       string,
       Array<{ id: string; variant?: string }>
       Array<{ id: string; variant?: string }>
     >;
     >;
+    everModelSwitched = new Set<string>();
     runtimeChains = {} as Record<string, string[]>;
     runtimeChains = {} as Record<string, string[]>;
     for (const agentDef of agentDefs) {
     for (const agentDef of agentDefs) {
       if (agentDef._modelArray?.length) {
       if (agentDef._modelArray?.length) {
@@ -561,13 +563,17 @@ const OhMyOpenCodeLite: Plugin = async (ctx) => {
           const existing = (opencodeConfig.agent as Record<string, unknown>)[
           const existing = (opencodeConfig.agent as Record<string, unknown>)[
             name
             name
           ] as Record<string, unknown> | undefined;
           ] as Record<string, unknown> | undefined;
-          // User picked a model via /model → disable fallback for that agent.
+          // User explicitly picked a model via /model → disable fallback.
+          // Only marks the agent if the model differs from the chain primary.
+          // Once marked, stays disabled even if user switches back to chain[0].
           if (existing && typeof existing.model === 'string') {
           if (existing && typeof existing.model === 'string') {
-            foregroundFallback.disableChain(name);
-            log('[plugin] disabled fallback chain for model-switched agent', {
-              agent: name,
-              model: existing.model,
-            });
+            const primary = modelArrayMap[name]?.[0]?.id;
+            if (primary && existing.model !== primary) {
+              everModelSwitched.add(name);
+            }
+            if (everModelSwitched.has(name)) {
+              foregroundFallback.disableChain(name);
+            }
           }
           }
           if (existing) {
           if (existing) {
             // Shallow merge: plugin defaults first, user overrides win
             // Shallow merge: plugin defaults first, user overrides win