Separate `aidaAvailability` section in hostConfig

Whether AIDA is available or not affects more than one DevTools
feature. Instead of repeating that info in multiple objects within `hostConfig`, move it to its own section instead.

This CL should land first, before landing the Chromium CL
(https://crrev.com/c/5783303) which updates the `hostConfig`'s shape
there. `hostConfigOldToNew()` in `devtools_compatibility.js` ensures
that DevTools is still able to handle receiving the old shape in the
meantime.

In addition, when remote debugging an older version of Chrome, a
DevTools version matching the remove Chrome is being executed. In
order to not break this older DevTools version, `hostConfigNewToOld()`
is added to convert the new `hostConfig` shape back to the old shape,
which the old DevTools will be able to handle.

Disable tests CL: https://crrev.com/c/5782922
Re-enable tests CL: https://crrev.com/c/5782872
Chromium CL: https://crrev.com/c/5783303
Doc: go/chrome-devtools:genai-availability (non-public)

Bug: b/348136212
Change-Id: I746330bd009bc03f06a5d2cdb40a8830fb200af3
Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/5782756
Reviewed-by: Ergün Erdoğmuş <[email protected]>
Reviewed-by: Alex Rudenko <[email protected]>
Commit-Queue: Wolfgang Beyer <[email protected]>
diff --git a/front_end/devtools_compatibility.js b/front_end/devtools_compatibility.js
index 8a44f34..6061e28 100644
--- a/front_end/devtools_compatibility.js
+++ b/front_end/devtools_compatibility.js
@@ -641,7 +641,85 @@
    * @param {function(Object<string, Object<string, string|boolean>>):void} callback
    */
   getHostConfig(callback) {
-    DevToolsAPI.sendMessageToEmbedder('getHostConfig', [], /** @type {function(?Object)} */ (callback));
+    DevToolsAPI.sendMessageToEmbedder('getHostConfig', [], hostConfig => {
+      const majorVersion = getRemoteMajorVersion();
+      if (majorVersion && majorVersion < 129 && hostConfig?.aidaAvailability) {
+        return callback(this.hostConfigNewToOld(hostConfig));
+      }
+      // TODO(crbug.com/348136212): Remove as soon as Chromium sends the new shape.
+      if (hostConfig && !hostConfig.aidaAvailability && hostConfig.devToolsConsoleInsights) {
+        return callback(this.hostConfigOldToNew(hostConfig));
+      }
+      return callback(hostConfig);
+    });
+  }
+
+  // TODO(crbug.com/348136212): Remove as soon as Chromium sends the new shape.
+  /**
+   * @param {Object<string, Object<string, string|boolean>>} oldConfig
+   */
+  hostConfigOldToNew(oldConfig) {
+    const aidaAvailability = {
+      // Not a perfect match, but good enough temporarily.
+      enabled: oldConfig.devToolsConsoleInsights?.enabled ?? false,
+      blockedByAge: oldConfig.devToolsConsoleInsights?.blockedByAge ?? true,
+      blockedByEnterprisePolicy: oldConfig.devToolsConsoleInsights?.blockedByEnterprisePolicy ?? true,
+      blockedByGeo: oldConfig.devToolsConsoleInsights?.blockedByGeo ?? true,
+      disallowLogging: oldConfig.devToolsConsoleInsights?.disallowLogging ?? true,
+    };
+    const devToolsConsoleInsights = {
+      enabled: oldConfig.devToolsConsoleInsights?.enabled ?? false,
+      modelId: oldConfig.devToolsConsoleInsights?.aidaModelId ?? '',
+      temperature: oldConfig.devToolsConsoleInsights?.aidaTemperature ?? 0,
+    };
+    const devToolsFreestylerDogfood = {
+      enabled: oldConfig.devToolsFreestylerDogfood?.enabled ?? false,
+      modelId: oldConfig.devToolsFreestylerDogfood?.aidaModelId ?? '',
+      temperature: oldConfig.devToolsFreestylerDogfood?.aidaTemperature ?? 0,
+    };
+    const devToolsExplainThisResourceDogfood = {
+      enabled: oldConfig.devToolsExplainThisResourceDogfood?.enabled ?? false,
+      modelId: oldConfig.devToolsExplainThisResourceDogfood?.aidaModelId ?? '',
+      temperature: oldConfig.devToolsExplainThisResourceDogfood?.aidaTemperature ?? 0,
+    };
+    return {
+      ...oldConfig,
+      aidaAvailability,
+      devToolsConsoleInsights,
+      devToolsExplainThisResourceDogfood,
+      devToolsFreestylerDogfood,
+    };
+  }
+
+  /**
+   * @param {Object<string, Object<string, string|boolean>>} newConfig
+   */
+  hostConfigNewToOld(newConfig) {
+    const devToolsConsoleInsights = {
+      enabled: (newConfig.devToolsConsoleInsights?.enabled && newConfig.aidaAvailability?.enabled) ?? false,
+      aidaModelId: newConfig.devToolsConsoleInsights?.modelId ?? '',
+      aidaTemperature: newConfig.devToolsConsoleInsights?.temperature ?? 0,
+      blockedByAge: newConfig.aidaAvailability?.blockedByAge ?? true,
+      blockedByEnterprisePolicy: newConfig.aidaAvailability?.blockedByEnterprisePolicy ?? true,
+      blockedByGeo: newConfig.aidaAvailability?.blockedByGeo ?? true,
+      blockedByRollout: false,
+      disallowLogging: newConfig.aidaAvailability?.disallowLogging ?? true,
+      optIn: false,
+    };
+    const devToolsFreestylerDogfood = {
+      enabled: (newConfig.devToolsFreestylerDogfood?.enabled && newConfig.aidaAvailability?.enabled) ?? false,
+      aidaModelId: newConfig.devToolsFreestylerDogfood?.modelId ?? '',
+      aidaTemperature: newConfig.devToolsFreestylerDogfood?.temperature ?? 0,
+      blockedByAge: newConfig.aidaAvailability?.blockedByAge ?? true,
+      blockedByEnterprisePolicy: newConfig.aidaAvailability?.blockedByEnterprisePolicy ?? true,
+      blockedByGeo: newConfig.aidaAvailability?.blockedByGeo ?? true,
+    };
+    return {
+      devToolsConsoleInsights,
+      devToolsFreestylerDogfood,
+      devToolsVeLogging: newConfig.devToolsVeLogging,
+      isOffTheRecord: newConfig.isOffTheRecord,
+    };
   }
 
   /**