MCP servers may return inputSchema as { type: "object" } without a
properties field, or with properties set to undefined/null. The
hasTopLevelObjectSchema guard only checked 'properties' in schemaRecord
(key existence) without verifying the value is a real object. This caused
such schemas to pass through unnormalized, resulting in OpenAI rejecting
them with 'object schema missing properties'.
Fix: tighten hasTopLevelObjectSchema to require properties to be a
non-null object, and broaden isTypedSchemaMissingProperties to catch
properties keys with undefined/null values.
Regression of #60158 (originally fixed by #60176).