Skip to content

Openapi/JsonSchema: Add missing nullables in schemas#1066

Merged
spinillos merged 4 commits intomainfrom
openapi/add-missing-nullables
Apr 9, 2026
Merged

Openapi/JsonSchema: Add missing nullables in schemas#1066
spinillos merged 4 commits intomainfrom
openapi/add-missing-nullables

Conversation

@spinillos
Copy link
Copy Markdown
Member

We didn't parse nullables in OpenAPI/JsonSchema specs 🤡.

  • JSONSchema: If a field is nullable, the type and the nullable should be inside anyOf
  • OpenAPI: nullable could be inline except for references (reference has to be inside allOf)

@spinillos spinillos self-assigned this Apr 8, 2026
@spinillos spinillos requested a review from a team as a code owner April 8, 2026 17:04
@spinillos spinillos added bug Something isn't working area:jennies labels Apr 8, 2026
@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 8, 2026

Note: the diff show code changes that would be introduced by this PR to the output of the Grafana Foundation SDK codegen pipeline.

See full diff.

🔎 Changes to Grafana Foundation SDK

diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/jsonschema/athena.jsonschema.json /tmp/foundation-workspace-current/foundation-sdk/jsonschema/athena.jsonschema.json
--- /tmp/foundation-workspace-main/foundation-sdk/jsonschema/athena.jsonschema.json	2026-04-08 17:10:49.501133258 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/jsonschema/athena.jsonschema.json	2026-04-08 17:10:09.334487881 +0000
@@ -27,7 +27,14 @@
           "type": "string"
         },
         "refId": {
-          "type": "string",
+          "anyOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "null"
+            }
+          ],
           "description": "A unique identifier for the query within the list of targets.\nIn server side expressions, the refId is used as a variable name to identify results.\nBy default, the UI will assign A-\u003eZ; however setting meaningful names may be useful."
         },
         "hide": {
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/jsonschema/azuremonitor.jsonschema.json /tmp/foundation-workspace-current/foundation-sdk/jsonschema/azuremonitor.jsonschema.json
--- /tmp/foundation-workspace-main/foundation-sdk/jsonschema/azuremonitor.jsonschema.json	2026-04-08 17:10:49.501334314 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/jsonschema/azuremonitor.jsonschema.json	2026-04-08 17:10:09.332727697 +0000
@@ -7,7 +7,14 @@
       "additionalProperties": false,
       "properties": {
         "refId": {
-          "type": "string",
+          "anyOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "null"
+            }
+          ],
           "description": "A unique identifier for the query within the list of targets.\nIn server side expressions, the refId is used as a variable name to identify results.\nBy default, the UI will assign A-\u003eZ; however setting meaningful names may be useful."
         },
         "hide": {
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/jsonschema/bigquery.jsonschema.json /tmp/foundation-workspace-current/foundation-sdk/jsonschema/bigquery.jsonschema.json
--- /tmp/foundation-workspace-main/foundation-sdk/jsonschema/bigquery.jsonschema.json	2026-04-08 17:10:49.501229098 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/jsonschema/bigquery.jsonschema.json	2026-04-08 17:10:09.332798399 +0000
@@ -56,7 +56,14 @@
           "$ref": "#/definitions/SQLExpression"
         },
         "refId": {
-          "type": "string",
+          "anyOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "null"
+            }
+          ],
           "description": "A unique identifier for the query within the list of targets.\nIn server side expressions, the refId is used as a variable name to identify results.\nBy default, the UI will assign A-\u003eZ; however setting meaningful names may be useful."
         },
         "hide": {
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/jsonschema/cloudwatch.jsonschema.json /tmp/foundation-workspace-current/foundation-sdk/jsonschema/cloudwatch.jsonschema.json
--- /tmp/foundation-workspace-main/foundation-sdk/jsonschema/cloudwatch.jsonschema.json	2026-04-08 17:10:49.501293909 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/jsonschema/cloudwatch.jsonschema.json	2026-04-08 17:10:09.332901011 +0000
@@ -112,7 +112,14 @@
           "description": "When the metric query type is set to `Insights`, this field is used to specify the query string."
         },
         "refId": {
-          "type": "string",
+          "anyOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "null"
+            }
+          ],
           "description": "A unique identifier for the query within the list of targets.\nIn server side expressions, the refId is used as a variable name to identify results.\nBy default, the UI will assign A-\u003eZ; however setting meaningful names may be useful."
         },
         "hide": {
@@ -537,7 +544,14 @@
           "description": "@deprecated use logGroups"
         },
         "refId": {
-          "type": "string",
+          "anyOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "null"
+            }
+          ],
           "description": "A unique identifier for the query within the list of targets.\nIn server side expressions, the refId is used as a variable name to identify results.\nBy default, the UI will assign A-\u003eZ; however setting meaningful names may be useful."
         },
         "hide": {
@@ -608,7 +622,14 @@
           "description": "Use this parameter to filter the results of the operation to only those alarms\nthat use a certain alarm action. For example, you could specify the ARN of\nan SNS topic to find all alarms that send notifications to that topic.\ne.g. `arn:aws:sns:us-east-1:123456789012:my-app-` would match `arn:aws:sns:us-east-1:123456789012:my-app-action`\nbut not match `arn:aws:sns:us-east-1:123456789012:your-app-action`"
         },
         "refId": {
-          "type": "string",
+          "anyOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "null"
+            }
+          ],
           "description": "A unique identifier for the query within the list of targets.\nIn server side expressions, the refId is used as a variable name to identify results.\nBy default, the UI will assign A-\u003eZ; however setting meaningful names may be useful."
         },
         "hide": {
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/jsonschema/common.jsonschema.json /tmp/foundation-workspace-current/foundation-sdk/jsonschema/common.jsonschema.json
--- /tmp/foundation-workspace-main/foundation-sdk/jsonschema/common.jsonschema.json	2026-04-08 17:10:49.501372255 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/jsonschema/common.jsonschema.json	2026-04-08 17:10:09.332940265 +0000
@@ -1669,7 +1669,14 @@
           "description": "This field is deprecated in favor of using cellOptions"
         },
         "cellOptions": {
-          "$ref": "#/definitions/TableCellOptions"
+          "anyOf": [
+            {
+              "$ref": "#/definitions/TableCellOptions"
+            },
+            {
+              "type": "null"
+            }
+          ]
         },
         "hidden": {
           "type": "boolean",
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/jsonschema/dashboard.jsonschema.json /tmp/foundation-workspace-current/foundation-sdk/jsonschema/dashboard.jsonschema.json
--- /tmp/foundation-workspace-main/foundation-sdk/jsonschema/dashboard.jsonschema.json	2026-04-08 17:10:49.502871161 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/jsonschema/dashboard.jsonschema.json	2026-04-08 17:10:09.333016718 +0000
@@ -130,7 +130,14 @@
       ],
       "properties": {
         "id": {
-          "type": "integer",
+          "anyOf": [
+            {
+              "type": "integer"
+            },
+            {
+              "type": "null"
+            }
+          ],
           "description": "Unique numeric identifier for the dashboard.\n`id` is internal to a specific Grafana instance. `uid` should be used to identify a dashboard across Grafana instances.\nTODO eliminate this null option"
         },
         "uid": {
@@ -927,11 +934,25 @@
           ],
           "properties": {
             "from": {
-              "type": "number",
+              "anyOf": [
+                {
+                  "type": "number"
+                },
+                {
+                  "type": "null"
+                }
+              ],
               "description": "Min value of the range. It can be null which means -Infinity"
             },
             "to": {
-              "type": "number",
+              "anyOf": [
+                {
+                  "type": "number"
+                },
+                {
+                  "type": "null"
+                }
+              ],
               "description": "Max value of the range. It can be null which means +Infinity"
             },
             "result": {
@@ -1070,7 +1091,14 @@
       ],
       "properties": {
         "value": {
-          "type": "number",
+          "anyOf": [
+            {
+              "type": "number"
+            },
+            {
+              "type": "null"
+            }
+          ],
           "description": "Value represents a specified metric for the threshold, which triggers a visual change in the dashboard when this value is met or exceeded.\nNulls currently appear here when serializing -Infinity to JSON."
         },
         "color": {
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/jsonschema/dashboardv2beta1.jsonschema.json /tmp/foundation-workspace-current/foundation-sdk/jsonschema/dashboardv2beta1.jsonschema.json
--- /tmp/foundation-workspace-main/foundation-sdk/jsonschema/dashboardv2beta1.jsonschema.json	2026-04-08 17:10:49.501415026 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/jsonschema/dashboardv2beta1.jsonschema.json	2026-04-08 17:10:09.333135690 +0000
@@ -199,8 +199,15 @@
           "description": "New type for datasource reference\nNot creating a new type until we figure out how to handle DS refs for group by, adhoc, and every place that uses DataSourceRef in TS."
         },
         "spec": {
-          "type": "object",
-          "additionalProperties": {}
+          "anyOf": [
+            {
+              "type": "object",
+              "additionalProperties": {}
+            },
+            {
+              "type": "null"
+            }
+          ]
         }
       }
     },
@@ -547,8 +554,15 @@
       ],
       "properties": {
         "options": {
-          "type": "object",
-          "additionalProperties": {}
+          "anyOf": [
+            {
+              "type": "object",
+              "additionalProperties": {}
+            },
+            {
+              "type": "null"
+            }
+          ]
         },
         "fieldConfig": {
           "$ref": "#/definitions/FieldConfigSource"
@@ -676,8 +690,15 @@
           "description": "Alternative to empty string"
         },
         "custom": {
-          "type": "object",
-          "additionalProperties": {},
+          "anyOf": [
+            {
+              "type": "object",
+              "additionalProperties": {}
+            },
+            {
+              "type": "null"
+            }
+          ],
           "description": "custom is specified by the FieldConfig field\nin panel plugin schemas."
         }
       },
@@ -784,11 +805,25 @@
           ],
           "properties": {
             "from": {
-              "type": "number",
+              "anyOf": [
+                {
+                  "type": "number"
+                },
+                {
+                  "type": "null"
+                }
+              ],
               "description": "Min value of the range. It can be null which means -Infinity"
             },
             "to": {
-              "type": "number",
+              "anyOf": [
+                {
+                  "type": "number"
+                },
+                {
+                  "type": "null"
+                }
+              ],
               "description": "Max value of the range. It can be null which means +Infinity"
             },
             "result": {
@@ -3034,7 +3069,14 @@
       ],
       "properties": {
         "formatter": {
-          "type": "string",
+          "anyOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "null"
+            }
+          ],
           "description": "The format name or function used in the expression"
         }
       },
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/jsonschema/datasource.jsonschema.json /tmp/foundation-workspace-current/foundation-sdk/jsonschema/datasource.jsonschema.json
--- /tmp/foundation-workspace-main/foundation-sdk/jsonschema/datasource.jsonschema.json	2026-04-08 17:10:49.501471200 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/jsonschema/datasource.jsonschema.json	2026-04-08 17:10:09.333103069 +0000
@@ -15,7 +15,14 @@
           "description": "Panel ID from wich the queries will be reused."
         },
         "refId": {
-          "type": "string",
+          "anyOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "null"
+            }
+          ],
           "description": "A unique identifier for the query within the list of targets.\nIn server side expressions, the refId is used as a variable name to identify results.\nBy default, the UI will assign A-\u003eZ; however setting meaningful names may be useful."
         },
         "hide": {
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/jsonschema/elasticsearch.jsonschema.json /tmp/foundation-workspace-current/foundation-sdk/jsonschema/elasticsearch.jsonschema.json
--- /tmp/foundation-workspace-main/foundation-sdk/jsonschema/elasticsearch.jsonschema.json	2026-04-08 17:10:49.501595664 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/jsonschema/elasticsearch.jsonschema.json	2026-04-08 17:10:09.333227602 +0000
@@ -1653,7 +1653,14 @@
           "description": "List of metric aggregations"
         },
         "refId": {
-          "type": "string",
+          "anyOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "null"
+            }
+          ],
           "description": "A unique identifier for the query within the list of targets.\nIn server side expressions, the refId is used as a variable name to identify results.\nBy default, the UI will assign A-\u003eZ; however setting meaningful names may be useful."
         },
         "hide": {
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/jsonschema/expr.jsonschema.json /tmp/foundation-workspace-current/foundation-sdk/jsonschema/expr.jsonschema.json
--- /tmp/foundation-workspace-main/foundation-sdk/jsonschema/expr.jsonschema.json	2026-04-08 17:10:49.501639375 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/jsonschema/expr.jsonschema.json	2026-04-08 17:10:09.333276164 +0000
@@ -58,7 +58,14 @@
           "description": "QueryType is an optional identifier for the type of query.\nIt can be used to distinguish different types of queries."
         },
         "refId": {
-          "type": "string",
+          "anyOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "null"
+            }
+          ],
           "description": "RefID is the unique identifier of the query, set by the frontend call."
         },
         "resultAssertions": {
@@ -174,7 +181,14 @@
           "description": "The reducer\nPossible enum values:\n - `\"sum\"` \n - `\"mean\"` \n - `\"min\"` \n - `\"max\"` \n - `\"count\"` \n - `\"last\"` \n - `\"median\"` "
         },
         "refId": {
-          "type": "string",
+          "anyOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "null"
+            }
+          ],
           "description": "RefID is the unique identifier of the query, set by the frontend call."
         },
         "resultAssertions": {
@@ -314,7 +328,14 @@
           "description": "QueryType is an optional identifier for the type of query.\nIt can be used to distinguish different types of queries."
         },
         "refId": {
-          "type": "string",
+          "anyOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "null"
+            }
+          ],
           "description": "RefID is the unique identifier of the query, set by the frontend call."
         },
         "resultAssertions": {
@@ -504,7 +525,14 @@
           "description": "QueryType is an optional identifier for the type of query.\nIt can be used to distinguish different types of queries."
         },
         "refId": {
-          "type": "string",
+          "anyOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "null"
+            }
+          ],
           "description": "RefID is the unique identifier of the query, set by the frontend call."
         },
         "resultAssertions": {
@@ -688,7 +716,14 @@
           "description": "QueryType is an optional identifier for the type of query.\nIt can be used to distinguish different types of queries."
         },
         "refId": {
-          "type": "string",
+          "anyOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "null"
+            }
+          ],
           "description": "RefID is the unique identifier of the query, set by the frontend call."
         },
         "resultAssertions": {
@@ -793,7 +828,14 @@
           "description": "QueryType is an optional identifier for the type of query.\nIt can be used to distinguish different types of queries."
         },
         "refId": {
-          "type": "string",
+          "anyOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "null"
+            }
+          ],
           "description": "RefID is the unique identifier of the query, set by the frontend call."
         },
         "resultAssertions": {
@@ -866,22 +908,64 @@
       "additionalProperties": false,
       "properties": {
         "TypeMath": {
-          "$ref": "#/definitions/TypeMath"
+          "anyOf": [
+            {
+              "$ref": "#/definitions/TypeMath"
+            },
+            {
+              "type": "null"
+            }
+          ]
         },
         "TypeReduce": {
-          "$ref": "#/definitions/TypeReduce"
+          "anyOf": [
+            {
+              "$ref": "#/definitions/TypeReduce"
+            },
+            {
+              "type": "null"
+            }
+          ]
         },
         "TypeResample": {
-          "$ref": "#/definitions/TypeResample"
+          "anyOf": [
+            {
+              "$ref": "#/definitions/TypeResample"
+            },
+            {
+              "type": "null"
+            }
+          ]
         },
         "TypeClassicConditions": {
-          "$ref": "#/definitions/TypeClassicConditions"
+          "anyOf": [
+            {
+              "$ref": "#/definitions/TypeClassicConditions"
+            },
+            {
+              "type": "null"
+            }
+          ]
         },
         "TypeThreshold": {
-          "$ref": "#/definitions/TypeThreshold"
+          "anyOf": [
+            {
+              "$ref": "#/definitions/TypeThreshold"
+            },
+            {
+              "type": "null"
+            }
+          ]
         },
         "TypeSql": {
-          "$ref": "#/definitions/TypeSql"
+          "anyOf": [
+            {
+              "$ref": "#/definitions/TypeSql"
+            },
+            {
+              "type": "null"
+            }
+          ]
         }
       }
     },
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/jsonschema/googlecloudmonitoring.jsonschema.json /tmp/foundation-workspace-current/foundation-sdk/jsonschema/googlecloudmonitoring.jsonschema.json
--- /tmp/foundation-workspace-main/foundation-sdk/jsonschema/googlecloudmonitoring.jsonschema.json	2026-04-08 17:10:49.502028203 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/jsonschema/googlecloudmonitoring.jsonschema.json	2026-04-08 17:10:09.333597134 +0000
@@ -7,7 +7,14 @@
       "additionalProperties": false,
       "properties": {
         "refId": {
-          "type": "string",
+          "anyOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "null"
+            }
+          ],
           "description": "A unique identifier for the query within the list of targets.\nIn server side expressions, the refId is used as a variable name to identify results.\nBy default, the UI will assign A-\u003eZ; however setting meaningful names may be useful."
         },
         "hide": {
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/jsonschema/grafanapyroscope.jsonschema.json /tmp/foundation-workspace-current/foundation-sdk/jsonschema/grafanapyroscope.jsonschema.json
--- /tmp/foundation-workspace-main/foundation-sdk/jsonschema/grafanapyroscope.jsonschema.json	2026-04-08 17:10:49.501773236 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/jsonschema/grafanapyroscope.jsonschema.json	2026-04-08 17:10:09.333381881 +0000
@@ -51,7 +51,14 @@
           "description": "Sets the maximum number of nodes in the flamegraph."
         },
         "refId": {
-          "type": "string",
+          "anyOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "null"
+            }
+          ],
           "description": "A unique identifier for the query within the list of targets.\nIn server side expressions, the refId is used as a variable name to identify results.\nBy default, the UI will assign A-\u003eZ; however setting meaningful names may be useful."
         },
         "hide": {
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/jsonschema/librarypanel.jsonschema.json /tmp/foundation-workspace-current/foundation-sdk/jsonschema/librarypanel.jsonschema.json
--- /tmp/foundation-workspace-main/foundation-sdk/jsonschema/librarypanel.jsonschema.json	2026-04-08 17:10:49.501865659 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/jsonschema/librarypanel.jsonschema.json	2026-04-08 17:10:09.333523126 +0000
@@ -690,11 +690,25 @@
           ],
           "properties": {
             "from": {
-              "type": "number",
+              "anyOf": [
+                {
+                  "type": "number"
+                },
+                {
+                  "type": "null"
+                }
+              ],
               "description": "Min value of the range. It can be null which means -Infinity"
             },
             "to": {
-              "type": "number",
+              "anyOf": [
+                {
+                  "type": "number"
+                },
+                {
+                  "type": "null"
+                }
+              ],
               "description": "Max value of the range. It can be null which means +Infinity"
             },
             "result": {
@@ -799,7 +813,14 @@
       ],
       "properties": {
         "value": {
-          "type": "number",
+          "anyOf": [
+            {
+              "type": "number"
+            },
+            {
+              "type": "null"
+            }
+          ],
           "description": "Value represents a specified metric for the threshold, which triggers a visual change in the dashboard when this value is met or exceeded.\nNulls currently appear here when serializing -Infinity to JSON."
         },
         "color": {
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/jsonschema/loki.jsonschema.json /tmp/foundation-workspace-current/foundation-sdk/jsonschema/loki.jsonschema.json
--- /tmp/foundation-workspace-main/foundation-sdk/jsonschema/loki.jsonschema.json	2026-04-08 17:10:49.501938405 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/jsonschema/loki.jsonschema.json	2026-04-08 17:10:09.333639403 +0000
@@ -73,7 +73,14 @@
           "description": "Used to set step value for range queries."
         },
         "refId": {
-          "type": "string",
+          "anyOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "null"
+            }
+          ],
           "description": "A unique identifier for the query within the list of targets.\nIn server side expressions, the refId is used as a variable name to identify results.\nBy default, the UI will assign A-\u003eZ; however setting meaningful names may be useful."
         },
         "hide": {
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/jsonschema/parca.jsonschema.json /tmp/foundation-workspace-current/foundation-sdk/jsonschema/parca.jsonschema.json
--- /tmp/foundation-workspace-main/foundation-sdk/jsonschema/parca.jsonschema.json	2026-04-08 17:10:49.501997596 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/jsonschema/parca.jsonschema.json	2026-04-08 17:10:09.333700688 +0000
@@ -28,7 +28,14 @@
           "description": "Specifies the type of profile to query."
         },
         "refId": {
-          "type": "string",
+          "anyOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "null"
+            }
+          ],
           "description": "A unique identifier for the query within the list of targets.\nIn server side expressions, the refId is used as a variable name to identify results.\nBy default, the UI will assign A-\u003eZ; however setting meaningful names may be useful."
         },
         "hide": {
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/jsonschema/piechart.jsonschema.json /tmp/foundation-workspace-current/foundation-sdk/jsonschema/piechart.jsonschema.json
--- /tmp/foundation-workspace-main/foundation-sdk/jsonschema/piechart.jsonschema.json	2026-04-08 17:10:49.502067206 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/jsonschema/piechart.jsonschema.json	2026-04-08 17:10:09.333737427 +0000
@@ -90,10 +90,17 @@
           "$ref": "#/definitions/PieChartType"
         },
         "displayLabels": {
-          "type": "array",
-          "items": {
-            "$ref": "#/definitions/PieChartLabels"
-          }
+          "anyOf": [
+            {
+              "type": "array",
+              "items": {
+                "$ref": "#/definitions/PieChartLabels"
+              }
+            },
+            {
+              "type": "null"
+            }
+          ]
         },
         "tooltip": {
           "$ref": "#/definitions/VizTooltipOptions"
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/jsonschema/prometheus.jsonschema.json /tmp/foundation-workspace-current/foundation-sdk/jsonschema/prometheus.jsonschema.json
--- /tmp/foundation-workspace-main/foundation-sdk/jsonschema/prometheus.jsonschema.json	2026-04-08 17:10:49.502192721 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/jsonschema/prometheus.jsonschema.json	2026-04-08 17:10:09.333992845 +0000
@@ -57,7 +57,14 @@
           "description": "@deprecated Used to specify how many times to divide max data points by. We use max data points under query options\nSee https://github.com/grafana/grafana/issues/48081"
         },
         "refId": {
-          "type": "string",
+          "anyOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "null"
+            }
+          ],
           "description": "A unique identifier for the query within the list of targets.\nIn server side expressions, the refId is used as a variable name to identify results.\nBy default, the UI will assign A-\u003eZ; however setting meaningful names may be useful."
         },
         "hide": {
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/jsonschema/table.jsonschema.json /tmp/foundation-workspace-current/foundation-sdk/jsonschema/table.jsonschema.json
--- /tmp/foundation-workspace-main/foundation-sdk/jsonschema/table.jsonschema.json	2026-04-08 17:10:49.502414396 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/jsonschema/table.jsonschema.json	2026-04-08 17:10:09.334058808 +0000
@@ -134,7 +134,14 @@
           "description": "This field is deprecated in favor of using cellOptions"
         },
         "cellOptions": {
-          "$ref": "#/definitions/TableCellOptions"
+          "anyOf": [
+            {
+              "$ref": "#/definitions/TableCellOptions"
+            },
+            {
+              "type": "null"
+            }
+          ]
         },
         "hidden": {
           "type": "boolean",
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/jsonschema/tempo.jsonschema.json /tmp/foundation-workspace-current/foundation-sdk/jsonschema/tempo.jsonschema.json
--- /tmp/foundation-workspace-main/foundation-sdk/jsonschema/tempo.jsonschema.json	2026-04-08 17:10:49.502483235 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/jsonschema/tempo.jsonschema.json	2026-04-08 17:10:09.334128829 +0000
@@ -10,7 +10,14 @@
       ],
       "properties": {
         "refId": {
-          "type": "string",
+          "anyOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "null"
+            }
+          ],
           "description": "A unique identifier for the query within the list of targets.\nIn server side expressions, the refId is used as a variable name to identify results.\nBy default, the UI will assign A-\u003eZ; however setting meaningful names may be useful."
         },
         "hide": {
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/jsonschema/testdata.jsonschema.json /tmp/foundation-workspace-current/foundation-sdk/jsonschema/testdata.jsonschema.json
--- /tmp/foundation-workspace-main/foundation-sdk/jsonschema/testdata.jsonschema.json	2026-04-08 17:10:49.502518050 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/jsonschema/testdata.jsonschema.json	2026-04-08 17:10:09.334163815 +0000
@@ -328,7 +328,14 @@
           "type": "string"
         },
         "refId": {
-          "type": "string",
+          "anyOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "null"
+            }
+          ],
           "description": "RefID is the unique identifier of the query, set by the frontend call."
         },
         "resultAssertions": {
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/openapi/athena.openapi.json /tmp/foundation-workspace-current/foundation-sdk/openapi/athena.openapi.json
--- /tmp/foundation-workspace-main/foundation-sdk/openapi/athena.openapi.json	2026-04-08 17:10:49.493761811 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/openapi/athena.openapi.json	2026-04-08 17:10:09.324785792 +0000
@@ -36,6 +36,7 @@
           },
           "refId": {
             "type": "string",
+            "nullable": true,
             "description": "A unique identifier for the query within the list of targets.\nIn server side expressions, the refId is used as a variable name to identify results.\nBy default, the UI will assign A-\u003eZ; however setting meaningful names may be useful."
           },
           "hide": {
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/openapi/azuremonitor.openapi.json /tmp/foundation-workspace-current/foundation-sdk/openapi/azuremonitor.openapi.json
--- /tmp/foundation-workspace-main/foundation-sdk/openapi/azuremonitor.openapi.json	2026-04-08 17:10:49.493821753 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/openapi/azuremonitor.openapi.json	2026-04-08 17:10:09.324914222 +0000
@@ -16,6 +16,7 @@
         "properties": {
           "refId": {
             "type": "string",
+            "nullable": true,
             "description": "A unique identifier for the query within the list of targets.\nIn server side expressions, the refId is used as a variable name to identify results.\nBy default, the UI will assign A-\u003eZ; however setting meaningful names may be useful."
           },
           "hide": {
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/openapi/bigquery.openapi.json /tmp/foundation-workspace-current/foundation-sdk/openapi/bigquery.openapi.json
--- /tmp/foundation-workspace-main/foundation-sdk/openapi/bigquery.openapi.json	2026-04-08 17:10:49.493935676 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/openapi/bigquery.openapi.json	2026-04-08 17:10:09.324985826 +0000
@@ -65,6 +65,7 @@
           },
           "refId": {
             "type": "string",
+            "nullable": true,
             "description": "A unique identifier for the query within the list of targets.\nIn server side expressions, the refId is used as a variable name to identify results.\nBy default, the UI will assign A-\u003eZ; however setting meaningful names may be useful."
           },
           "hide": {
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/openapi/cloudwatch.openapi.json /tmp/foundation-workspace-current/foundation-sdk/openapi/cloudwatch.openapi.json
--- /tmp/foundation-workspace-main/foundation-sdk/openapi/cloudwatch.openapi.json	2026-04-08 17:10:49.494039821 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/openapi/cloudwatch.openapi.json	2026-04-08 17:10:09.325054194 +0000
@@ -121,6 +121,7 @@
           },
           "refId": {
             "type": "string",
+            "nullable": true,
             "description": "A unique identifier for the query within the list of targets.\nIn server side expressions, the refId is used as a variable name to identify results.\nBy default, the UI will assign A-\u003eZ; however setting meaningful names may be useful."
           },
           "hide": {
@@ -546,6 +547,7 @@
           },
           "refId": {
             "type": "string",
+            "nullable": true,
             "description": "A unique identifier for the query within the list of targets.\nIn server side expressions, the refId is used as a variable name to identify results.\nBy default, the UI will assign A-\u003eZ; however setting meaningful names may be useful."
           },
           "hide": {
@@ -617,6 +619,7 @@
           },
           "refId": {
             "type": "string",
+            "nullable": true,
             "description": "A unique identifier for the query within the list of targets.\nIn server side expressions, the refId is used as a variable name to identify results.\nBy default, the UI will assign A-\u003eZ; however setting meaningful names may be useful."
           },
           "hide": {
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/openapi/common.openapi.json /tmp/foundation-workspace-current/foundation-sdk/openapi/common.openapi.json
--- /tmp/foundation-workspace-main/foundation-sdk/openapi/common.openapi.json	2026-04-08 17:10:49.494080808 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/openapi/common.openapi.json	2026-04-08 17:10:09.325095381 +0000
@@ -1677,7 +1677,12 @@
             "description": "This field is deprecated in favor of using cellOptions"
           },
           "cellOptions": {
-            "$ref": "#/components/schemas/TableCellOptions"
+            "nullable": true,
+            "allOf": [
+              {
+                "$ref": "#/components/schemas/TableCellOptions"
+              }
+            ]
           },
           "hidden": {
             "type": "boolean",
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/openapi/dashboard.openapi.json /tmp/foundation-workspace-current/foundation-sdk/openapi/dashboard.openapi.json
--- /tmp/foundation-workspace-main/foundation-sdk/openapi/dashboard.openapi.json	2026-04-08 17:10:49.494125842 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/openapi/dashboard.openapi.json	2026-04-08 17:10:09.325140856 +0000
@@ -138,6 +138,7 @@
         "properties": {
           "id": {
             "type": "integer",
+            "nullable": true,
             "description": "Unique numeric identifier for the dashboard.\n`id` is internal to a specific Grafana instance. `uid` should be used to identify a dashboard across Grafana instances.\nTODO eliminate this null option"
           },
           "uid": {
@@ -939,10 +940,12 @@
             "properties": {
               "from": {
                 "type": "number",
+                "nullable": true,
                 "description": "Min value of the range. It can be null which means -Infinity"
               },
               "to": {
                 "type": "number",
+                "nullable": true,
                 "description": "Max value of the range. It can be null which means +Infinity"
               },
               "result": {
@@ -1082,6 +1085,7 @@
         "properties": {
           "value": {
             "type": "number",
+            "nullable": true,
             "description": "Value represents a specified metric for the threshold, which triggers a visual change in the dashboard when this value is met or exceeded.\nNulls currently appear here when serializing -Infinity to JSON."
           },
           "color": {
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/openapi/dashboardv2beta1.openapi.json /tmp/foundation-workspace-current/foundation-sdk/openapi/dashboardv2beta1.openapi.json
--- /tmp/foundation-workspace-main/foundation-sdk/openapi/dashboardv2beta1.openapi.json	2026-04-08 17:10:49.494207234 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/openapi/dashboardv2beta1.openapi.json	2026-04-08 17:10:09.325262574 +0000
@@ -204,7 +204,8 @@
           },
           "spec": {
             "type": "object",
-            "additionalProperties": {}
+            "additionalProperties": {},
+            "nullable": true
           }
         }
       },
@@ -552,7 +553,8 @@
         "properties": {
           "options": {
             "type": "object",
-            "additionalProperties": {}
+            "additionalProperties": {},
+            "nullable": true
           },
           "fieldConfig": {
             "$ref": "#/components/schemas/FieldConfigSource"
@@ -682,6 +684,7 @@
           "custom": {
             "type": "object",
             "additionalProperties": {},
+            "nullable": true,
             "description": "custom is specified by the FieldConfig field\nin panel plugin schemas."
           }
         },
@@ -789,10 +792,12 @@
             "properties": {
               "from": {
                 "type": "number",
+                "nullable": true,
                 "description": "Min value of the range. It can be null which means -Infinity"
               },
               "to": {
                 "type": "number",
+                "nullable": true,
                 "description": "Max value of the range. It can be null which means +Infinity"
               },
               "result": {
@@ -3039,6 +3044,7 @@
         "properties": {
           "formatter": {
             "type": "string",
+            "nullable": true,
             "description": "The format name or function used in the expression"
           }
         },
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/openapi/datasource.openapi.json /tmp/foundation-workspace-current/foundation-sdk/openapi/datasource.openapi.json
--- /tmp/foundation-workspace-main/foundation-sdk/openapi/datasource.openapi.json	2026-04-08 17:10:49.494296441 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/openapi/datasource.openapi.json	2026-04-08 17:10:09.325356369 +0000
@@ -24,6 +24,7 @@
           },
           "refId": {
             "type": "string",
+            "nullable": true,
             "description": "A unique identifier for the query within the list of targets.\nIn server side expressions, the refId is used as a variable name to identify results.\nBy default, the UI will assign A-\u003eZ; however setting meaningful names may be useful."
           },
           "hide": {
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/openapi/elasticsearch.openapi.json /tmp/foundation-workspace-current/foundation-sdk/openapi/elasticsearch.openapi.json
--- /tmp/foundation-workspace-main/foundation-sdk/openapi/elasticsearch.openapi.json	2026-04-08 17:10:49.494357556 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/openapi/elasticsearch.openapi.json	2026-04-08 17:10:09.325416492 +0000
@@ -1659,6 +1659,7 @@
           },
           "refId": {
             "type": "string",
+            "nullable": true,
             "description": "A unique identifier for the query within the list of targets.\nIn server side expressions, the refId is used as a variable name to identify results.\nBy default, the UI will assign A-\u003eZ; however setting meaningful names may be useful."
           },
           "hide": {
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/openapi/expr.openapi.json /tmp/foundation-workspace-current/foundation-sdk/openapi/expr.openapi.json
--- /tmp/foundation-workspace-main/foundation-sdk/openapi/expr.openapi.json	2026-04-08 17:10:49.494404153 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/openapi/expr.openapi.json	2026-04-08 17:10:09.325461136 +0000
@@ -67,6 +67,7 @@
           },
           "refId": {
             "type": "string",
+            "nullable": true,
             "description": "RefID is the unique identifier of the query, set by the frontend call."
           },
           "resultAssertions": {
@@ -183,6 +184,7 @@
           },
           "refId": {
             "type": "string",
+            "nullable": true,
             "description": "RefID is the unique identifier of the query, set by the frontend call."
           },
           "resultAssertions": {
@@ -323,6 +325,7 @@
           },
           "refId": {
             "type": "string",
+            "nullable": true,
             "description": "RefID is the unique identifier of the query, set by the frontend call."
           },
           "resultAssertions": {
@@ -513,6 +516,7 @@
           },
           "refId": {
             "type": "string",
+            "nullable": true,
             "description": "RefID is the unique identifier of the query, set by the frontend call."
           },
           "resultAssertions": {
@@ -697,6 +701,7 @@
           },
           "refId": {
             "type": "string",
+            "nullable": true,
             "description": "RefID is the unique identifier of the query, set by the frontend call."
           },
           "resultAssertions": {
@@ -802,6 +807,7 @@
           },
           "refId": {
             "type": "string",
+            "nullable": true,
             "description": "RefID is the unique identifier of the query, set by the frontend call."
           },
           "resultAssertions": {
@@ -874,22 +880,52 @@
         "additionalProperties": false,
         "properties": {
           "TypeMath": {
-            "$ref": "#/components/schemas/TypeMath"
+            "nullable": true,
+            "allOf": [
+              {
+                "$ref": "#/components/schemas/TypeMath"
+              }
+            ]
           },
           "TypeReduce": {
-            "$ref": "#/components/schemas/TypeReduce"
+            "nullable": true,
+            "allOf": [
+              {
+                "$ref": "#/components/schemas/TypeReduce"
+              }
+            ]
           },
           "TypeResample": {
-            "$ref": "#/components/schemas/TypeResample"
+            "nullable": true,
+            "allOf": [
+              {
+                "$ref": "#/components/schemas/TypeResample"
+              }
+            ]
           },
           "TypeClassicConditions": {
-            "$ref": "#/components/schemas/TypeClassicConditions"
+            "nullable": true,
+            "allOf": [
+              {
+                "$ref": "#/components/schemas/TypeClassicConditions"
+              }
+            ]
           },
           "TypeThreshold": {
-            "$ref": "#/components/schemas/TypeThreshold"
+            "nullable": true,
+            "allOf": [
+              {
+                "$ref": "#/components/schemas/TypeThreshold"
+              }
+            ]
           },
           "TypeSql": {
-            "$ref": "#/components/schemas/TypeSql"
+            "nullable": true,
+            "allOf": [
+              {
+                "$ref": "#/components/schemas/TypeSql"
+              }
+            ]
           }
         }
       },
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/openapi/googlecloudmonitoring.openapi.json /tmp/foundation-workspace-current/foundation-sdk/openapi/googlecloudmonitoring.openapi.json
--- /tmp/foundation-workspace-main/foundation-sdk/openapi/googlecloudmonitoring.openapi.json	2026-04-08 17:10:49.495608658 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/openapi/googlecloudmonitoring.openapi.json	2026-04-08 17:10:09.325644108 +0000
@@ -16,6 +16,7 @@
         "properties": {
           "refId": {
             "type": "string",
+            "nullable": true,
             "description": "A unique identifier for the query within the list of targets.\nIn server side expressions, the refId is used as a variable name to identify results.\nBy default, the UI will assign A-\u003eZ; however setting meaningful names may be useful."
           },
           "hide": {
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/openapi/grafanapyroscope.openapi.json /tmp/foundation-workspace-current/foundation-sdk/openapi/grafanapyroscope.openapi.json
--- /tmp/foundation-workspace-main/foundation-sdk/openapi/grafanapyroscope.openapi.json	2026-04-08 17:10:49.494538524 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/openapi/grafanapyroscope.openapi.json	2026-04-08 17:10:09.325682330 +0000
@@ -60,6 +60,7 @@
           },
           "refId": {
             "type": "string",
+            "nullable": true,
             "description": "A unique identifier for the query within the list of targets.\nIn server side expressions, the refId is used as a variable name to identify results.\nBy default, the UI will assign A-\u003eZ; however setting meaningful names may be useful."
           },
           "hide": {
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/openapi/librarypanel.openapi.json /tmp/foundation-workspace-current/foundation-sdk/openapi/librarypanel.openapi.json
--- /tmp/foundation-workspace-main/foundation-sdk/openapi/librarypanel.openapi.json	2026-04-08 17:10:49.494678707 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/openapi/librarypanel.openapi.json	2026-04-08 17:10:09.325759424 +0000
@@ -698,10 +698,12 @@
             "properties": {
               "from": {
                 "type": "number",
+                "nullable": true,
                 "description": "Min value of the range. It can be null which means -Infinity"
               },
               "to": {
                 "type": "number",
+                "nullable": true,
                 "description": "Max value of the range. It can be null which means +Infinity"
               },
               "result": {
@@ -807,6 +809,7 @@
         "properties": {
           "value": {
             "type": "number",
+            "nullable": true,
             "description": "Value represents a specified metric for the threshold, which triggers a visual change in the dashboard when this value is met or exceeded.\nNulls currently appear here when serializing -Infinity to JSON."
           },
           "color": {
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/openapi/loki.openapi.json /tmp/foundation-workspace-current/foundation-sdk/openapi/loki.openapi.json
--- /tmp/foundation-workspace-main/foundation-sdk/openapi/loki.openapi.json	2026-04-08 17:10:49.494753337 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/openapi/loki.openapi.json	2026-04-08 17:10:09.325835216 +0000
@@ -82,6 +82,7 @@
           },
           "refId": {
             "type": "string",
+            "nullable": true,
             "description": "A unique identifier for the query within the list of targets.\nIn server side expressions, the refId is used as a variable name to identify results.\nBy default, the UI will assign A-\u003eZ; however setting meaningful names may be useful."
           },
           "hide": {
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/openapi/parca.openapi.json /tmp/foundation-workspace-current/foundation-sdk/openapi/parca.openapi.json
--- /tmp/foundation-workspace-main/foundation-sdk/openapi/parca.openapi.json	2026-04-08 17:10:49.494847152 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/openapi/parca.openapi.json	2026-04-08 17:10:09.325926256 +0000
@@ -37,6 +37,7 @@
           },
           "refId": {
             "type": "string",
+            "nullable": true,
             "description": "A unique identifier for the query within the list of targets.\nIn server side expressions, the refId is used as a variable name to identify results.\nBy default, the UI will assign A-\u003eZ; however setting meaningful names may be useful."
           },
           "hide": {
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/openapi/piechart.openapi.json /tmp/foundation-workspace-current/foundation-sdk/openapi/piechart.openapi.json
--- /tmp/foundation-workspace-main/foundation-sdk/openapi/piechart.openapi.json	2026-04-08 17:10:49.494877629 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/openapi/piechart.openapi.json	2026-04-08 17:10:09.325957465 +0000
@@ -102,7 +102,8 @@
             "type": "array",
             "items": {
               "$ref": "#/components/schemas/PieChartLabels"
-            }
+            },
+            "nullable": true
           },
           "tooltip": {
             "$ref": "#/components/schemas/VizTooltipOptions"
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/openapi/prometheus.openapi.json /tmp/foundation-workspace-current/foundation-sdk/openapi/prometheus.openapi.json
--- /tmp/foundation-workspace-main/foundation-sdk/openapi/prometheus.openapi.json	2026-04-08 17:10:49.495015597 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/openapi/prometheus.openapi.json	2026-04-08 17:10:09.326093479 +0000
@@ -66,6 +66,7 @@
           },
           "refId": {
             "type": "string",
+            "nullable": true,
             "description": "A unique identifier for the query within the list of targets.\nIn server side expressions, the refId is used as a variable name to identify results.\nBy default, the UI will assign A-\u003eZ; however setting meaningful names may be useful."
           },
           "hide": {
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/openapi/table.openapi.json /tmp/foundation-workspace-current/foundation-sdk/openapi/table.openapi.json
--- /tmp/foundation-workspace-main/foundation-sdk/openapi/table.openapi.json	2026-04-08 17:10:49.495210282 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/openapi/table.openapi.json	2026-04-08 17:10:09.326259911 +0000
@@ -143,7 +143,12 @@
             "description": "This field is deprecated in favor of using cellOptions"
           },
           "cellOptions": {
-            "$ref": "#/components/schemas/TableCellOptions"
+            "nullable": true,
+            "allOf": [
+              {
+                "$ref": "#/components/schemas/TableCellOptions"
+              }
+            ]
           },
           "hidden": {
             "type": "boolean",
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/openapi/tempo.openapi.json /tmp/foundation-workspace-current/foundation-sdk/openapi/tempo.openapi.json
--- /tmp/foundation-workspace-main/foundation-sdk/openapi/tempo.openapi.json	2026-04-08 17:10:49.495280223 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/openapi/tempo.openapi.json	2026-04-08 17:10:09.326329721 +0000
@@ -19,6 +19,7 @@
         "properties": {
           "refId": {
             "type": "string",
+            "nullable": true,
             "description": "A unique identifier for the query within the list of targets.\nIn server side expressions, the refId is used as a variable name to identify results.\nBy default, the UI will assign A-\u003eZ; however setting meaningful names may be useful."
           },
           "hide": {
diff --new-file --unidirectional-new-file '--color=never' --unified --recursive '--exclude=.git' '--exclude=gradle.properties' '--exclude=pyproject.toml' '--exclude=package.json' '--exclude=*.md' /tmp/foundation-workspace-main/foundation-sdk/openapi/testdata.openapi.json /tmp/foundation-workspace-current/foundation-sdk/openapi/testdata.openapi.json
--- /tmp/foundation-workspace-main/foundation-sdk/openapi/testdata.openapi.json	2026-04-08 17:10:49.495315198 +0000
+++ /tmp/foundation-workspace-current/foundation-sdk/openapi/testdata.openapi.json	2026-04-08 17:10:09.326366179 +0000
@@ -337,6 +337,7 @@
           },
           "refId": {
             "type": "string",
+            "nullable": true,
             "description": "RefID is the unique identifier of the query, set by the frontend call."
           },
           "resultAssertions": {

@spinillos spinillos merged commit c0eb3b7 into main Apr 9, 2026
15 checks passed
@spinillos spinillos deleted the openapi/add-missing-nullables branch April 9, 2026 13:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:jennies bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants