Sync typeshed (#21665)

Source commit:

https://github.com/python/typeshed/commit/b9090e99745ac1511d8efd828622b11a9a3623e8
diff --git a/mypy/typeshed/stdlib/VERSIONS b/mypy/typeshed/stdlib/VERSIONS
index e9c8d91..96eb981 100644
--- a/mypy/typeshed/stdlib/VERSIONS
+++ b/mypy/typeshed/stdlib/VERSIONS
@@ -245,8 +245,6 @@
 pprint: 3.0-
 profile: 3.0-
 profiling: 3.15-
-profiling.sampling: 3.15-
-profiling.tracing: 3.15-
 pstats: 3.0-
 pty: 3.0-
 pwd: 3.0-
diff --git a/mypy/typeshed/stdlib/_curses.pyi b/mypy/typeshed/stdlib/_curses.pyi
index 449cf75..fcd0da4 100644
--- a/mypy/typeshed/stdlib/_curses.pyi
+++ b/mypy/typeshed/stdlib/_curses.pyi
@@ -423,7 +423,7 @@
     def chgat(self, y: int, x: int, num: int, attr: int) -> None: ...
 
     def clear(self) -> None: ...
-    def clearok(self, yes: int) -> None: ...
+    def clearok(self, flag: bool, /) -> None: ...
     def clrtobot(self) -> None: ...
     def clrtoeol(self) -> None: ...
     def cursyncup(self) -> None: ...
@@ -480,9 +480,9 @@
     @overload
     def hline(self, y: int, x: int, ch: _ChType, n: int) -> None: ...
 
-    def idcok(self, flag: bool) -> None: ...
-    def idlok(self, yes: bool) -> None: ...
-    def immedok(self, flag: bool) -> None: ...
+    def idcok(self, flag: bool, /) -> None: ...
+    def idlok(self, flag: bool, /) -> None: ...
+    def immedok(self, flag: bool, /) -> None: ...
 
     @overload
     def inch(self) -> int: ...
@@ -494,7 +494,7 @@
     @overload
     def insch(self, y: int, x: int, ch: _ChType, attr: int = ...) -> None: ...
 
-    def insdelln(self, nlines: int) -> None: ...
+    def insdelln(self, nlines: int, /) -> None: ...
     def insertln(self) -> None: ...
 
     @overload
@@ -514,13 +514,13 @@
 
     def is_linetouched(self, line: int, /) -> bool: ...
     def is_wintouched(self) -> bool: ...
-    def keypad(self, yes: bool, /) -> None: ...
-    def leaveok(self, yes: bool) -> None: ...
-    def move(self, new_y: int, new_x: int) -> None: ...
-    def mvderwin(self, y: int, x: int) -> None: ...
-    def mvwin(self, new_y: int, new_x: int) -> None: ...
-    def nodelay(self, yes: bool) -> None: ...
-    def notimeout(self, yes: bool) -> None: ...
+    def keypad(self, flag: bool, /) -> None: ...
+    def leaveok(self, flag: bool, /) -> None: ...
+    def move(self, new_y: int, new_x: int, /) -> None: ...
+    def mvderwin(self, y: int, x: int, /) -> None: ...
+    def mvwin(self, new_y: int, new_x: int, /) -> None: ...
+    def nodelay(self, flag: bool, /) -> None: ...
+    def notimeout(self, flag: bool, /) -> None: ...
 
     @overload
     def noutrefresh(self) -> None: ...
@@ -550,9 +550,9 @@
     @overload
     def refresh(self, pminrow: int, pmincol: int, sminrow: int, smincol: int, smaxrow: int, smaxcol: int) -> None: ...
 
-    def resize(self, nlines: int, ncols: int) -> None: ...
+    def resize(self, nlines: int, ncols: int, /) -> None: ...
     def scroll(self, lines: int = 1) -> None: ...
-    def scrollok(self, flag: bool) -> None: ...
+    def scrollok(self, flag: bool, /) -> None: ...
     def setscrreg(self, top: int, bottom: int, /) -> None: ...
     def standend(self) -> None: ...
     def standout(self) -> None: ...
@@ -568,9 +568,9 @@
     def subwin(self, nlines: int, ncols: int, begin_y: int, begin_x: int) -> window: ...
 
     def syncdown(self) -> None: ...
-    def syncok(self, flag: bool) -> None: ...
+    def syncok(self, flag: bool, /) -> None: ...
     def syncup(self) -> None: ...
-    def timeout(self, delay: int) -> None: ...
+    def timeout(self, delay: int, /) -> None: ...
     def touchline(self, start: int, count: int, changed: bool = True) -> None: ...
     def touchwin(self) -> None: ...
     def untouchwin(self) -> None: ...
diff --git a/mypy/typeshed/stdlib/ast.pyi b/mypy/typeshed/stdlib/ast.pyi
index 14a98b9..a199377 100644
--- a/mypy/typeshed/stdlib/ast.pyi
+++ b/mypy/typeshed/stdlib/ast.pyi
@@ -956,14 +956,27 @@
     else:
         value: expr
     generators: list[comprehension]
-    if sys.version_info >= (3, 13):
+    if sys.version_info >= (3, 15):
+        def __init__(
+            self, key: expr, value: expr | None = None, generators: list[comprehension] = ..., **kwargs: Unpack[_Attributes]
+        ) -> None: ...
+    elif sys.version_info >= (3, 13):
         def __init__(
             self, key: expr, value: expr, generators: list[comprehension] = ..., **kwargs: Unpack[_Attributes]
         ) -> None: ...
     else:
         def __init__(self, key: expr, value: expr, generators: list[comprehension], **kwargs: Unpack[_Attributes]) -> None: ...
 
-    if sys.version_info >= (3, 14):
+    if sys.version_info >= (3, 15):
+        def __replace__(
+            self,
+            *,
+            key: expr = ...,
+            value: expr | None = ...,
+            generators: list[comprehension] = ...,
+            **kwargs: Unpack[_Attributes],
+        ) -> Self: ...
+    elif sys.version_info >= (3, 14):
         def __replace__(
             self, *, key: expr = ..., value: expr = ..., generators: list[comprehension] = ..., **kwargs: Unpack[_Attributes]
         ) -> Self: ...
@@ -2147,6 +2160,10 @@
         def visit_TypeVarTuple(self, node: TypeVarTuple) -> Any: ...
         def visit_TypeAlias(self, node: TypeAlias) -> Any: ...
 
+    if sys.version_info >= (3, 14):
+        def visit_TemplateStr(self, node: TemplateStr) -> Any: ...
+        def visit_Interpolation(self, node: Interpolation) -> Any: ...
+
     # visit methods for deprecated nodes
     def visit_ExtSlice(self, node: ExtSlice) -> Any: ...
     def visit_Index(self, node: Index) -> Any: ...
diff --git a/mypy/typeshed/stdlib/builtins.pyi b/mypy/typeshed/stdlib/builtins.pyi
index d773f98..7b659e5 100644
--- a/mypy/typeshed/stdlib/builtins.pyi
+++ b/mypy/typeshed/stdlib/builtins.pyi
@@ -33,7 +33,7 @@
 from collections.abc import Awaitable, Callable, Iterable, Iterator, MutableSet, Reversible, Set as AbstractSet, Sized
 from io import BufferedRandom, BufferedReader, BufferedWriter, FileIO, TextIOWrapper
 from os import PathLike
-from types import CellType, CodeType, EllipsisType, GenericAlias, NotImplementedType, TracebackType
+from types import CellType, CodeType, EllipsisType, GenericAlias, NotImplementedType, TracebackType, UnionType
 
 # mypy crashes if any of {ByteString, Sequence, MutableSequence, Mapping, MutableMapping}
 # are imported from collections.abc in builtins.pyi
@@ -2080,11 +2080,13 @@
     class sentinel:
         __name__: str
         __module__: str
-        def __new__(cls, name: str, /, *, repr: str | None = None) -> Self: ...
-        def __copy__(self, /) -> Self: ...
-        def __deepcopy__(self, memo: Any, /) -> Self: ...
-        def __or__(self, other: Any, /) -> Any: ...
-        def __ror__(self, other: Any, /) -> Any: ...
+        def __new__(cls, name: str, /, *, repr: str | None = None) -> sentinel: ...
+        def __copy__(self, /) -> sentinel: ...
+        def __deepcopy__(self, memo: Any, /) -> sentinel: ...
+        # `other` can be any legal form for unions.
+        # `x | x` creates a `sentinel` instance if `x` is a sentinel, not a `UnionType` instance.
+        def __or__(self, other: Any, /) -> UnionType | sentinel: ...
+        def __ror__(self, other: Any, /) -> UnionType | sentinel: ...
 
 @overload
 def sorted(
diff --git a/mypy/typeshed/stdlib/fnmatch.pyi b/mypy/typeshed/stdlib/fnmatch.pyi
index 345c457..018139d 100644
--- a/mypy/typeshed/stdlib/fnmatch.pyi
+++ b/mypy/typeshed/stdlib/fnmatch.pyi
@@ -1,15 +1,16 @@
 import sys
 from collections.abc import Iterable
+from os import PathLike
 from typing import AnyStr
 
 __all__ = ["filter", "fnmatch", "fnmatchcase", "translate"]
 if sys.version_info >= (3, 14):
     __all__ += ["filterfalse"]
 
-def fnmatch(name: AnyStr, pat: AnyStr) -> bool: ...
+def fnmatch(name: AnyStr | PathLike[AnyStr], pat: AnyStr | PathLike[AnyStr]) -> bool: ...
 def fnmatchcase(name: AnyStr, pat: AnyStr) -> bool: ...
-def filter(names: Iterable[AnyStr], pat: AnyStr) -> list[AnyStr]: ...
+def filter(names: Iterable[AnyStr | PathLike[AnyStr]], pat: AnyStr | PathLike[AnyStr]) -> list[AnyStr]: ...
 def translate(pat: str) -> str: ...
 
 if sys.version_info >= (3, 14):
-    def filterfalse(names: Iterable[AnyStr], pat: AnyStr) -> list[AnyStr]: ...
+    def filterfalse(names: Iterable[AnyStr | PathLike[AnyStr]], pat: AnyStr | PathLike[AnyStr]) -> list[AnyStr]: ...
diff --git a/mypy/typeshed/stdlib/html/__init__.pyi b/mypy/typeshed/stdlib/html/__init__.pyi
index 8ad72f1..71e971d 100644
--- a/mypy/typeshed/stdlib/html/__init__.pyi
+++ b/mypy/typeshed/stdlib/html/__init__.pyi
@@ -1,4 +1,7 @@
+import re
+
 __all__ = ["escape", "unescape"]
 
 def escape(s: str, quote: bool = True) -> str: ...
 def unescape(s: str) -> str: ...
+def _replace_charref(s: re.Match[str]) -> str: ...
diff --git a/mypy/typeshed/stdlib/inspect.pyi b/mypy/typeshed/stdlib/inspect.pyi
index 003ecc1..1bd2b9d 100644
--- a/mypy/typeshed/stdlib/inspect.pyi
+++ b/mypy/typeshed/stdlib/inspect.pyi
@@ -38,7 +38,7 @@
     overload,
     type_check_only,
 )
-from typing_extensions import Self, TypeIs, deprecated, disjoint_base
+from typing_extensions import Never, Self, TypeIs, deprecated, disjoint_base
 
 if sys.version_info >= (3, 14):
     from annotationlib import Format
@@ -217,7 +217,7 @@
 
 def getmodulename(path: StrPath) -> str | None: ...
 def ismodule(object: object) -> TypeIs[ModuleType]: ...
-def isclass(object: object) -> TypeIs[type[Any]]: ...
+def isclass(object: object) -> TypeIs[type[object]]: ...
 def ismethod(object: object) -> TypeIs[MethodType]: ...
 
 if sys.version_info >= (3, 14):
@@ -245,7 +245,7 @@
 @overload
 def iscoroutinefunction(obj: object) -> TypeGuard[Callable[..., CoroutineType[Any, Any, Any]]]: ...
 
-def isgenerator(object: object) -> TypeIs[GeneratorType[Any, Any, Any]]: ...
+def isgenerator(object: object) -> TypeIs[GeneratorType[object, Never, object]]: ...
 def iscoroutine(object: object) -> TypeIs[CoroutineType[Any, Any, Any]]: ...
 def isawaitable(object: object) -> TypeIs[Awaitable[Any]]: ...
 
@@ -264,7 +264,7 @@
 class _SupportsDelete(Protocol[_T_contra]):
     def __delete__(self, instance: _T_contra, /) -> None: ...
 
-def isasyncgen(object: object) -> TypeIs[AsyncGeneratorType[Any, Any]]: ...
+def isasyncgen(object: object) -> TypeIs[AsyncGeneratorType[object, Never]]: ...
 def istraceback(object: object) -> TypeIs[TracebackType]: ...
 def isframe(object: object) -> TypeIs[FrameType]: ...
 def iscode(object: object) -> TypeIs[CodeType]: ...
@@ -289,7 +289,7 @@
 def ismemberdescriptor(object: object) -> TypeIs[MemberDescriptorType]: ...
 def isabstract(object: object) -> bool: ...
 def isgetsetdescriptor(object: object) -> TypeIs[GetSetDescriptorType]: ...
-def isdatadescriptor(object: object) -> TypeIs[_SupportsSet[Any, Any] | _SupportsDelete[Any]]: ...
+def isdatadescriptor(object: object) -> TypeIs[_SupportsSet[Never, Never] | _SupportsDelete[Never]]: ...
 
 #
 # Retrieving source code
diff --git a/mypy/typeshed/stdlib/profiling/sampling/gecko_collector.pyi b/mypy/typeshed/stdlib/profiling/sampling/gecko_collector.pyi
index 6072d4f..666fd42 100644
--- a/mypy/typeshed/stdlib/profiling/sampling/gecko_collector.pyi
+++ b/mypy/typeshed/stdlib/profiling/sampling/gecko_collector.pyi
@@ -1,11 +1,109 @@
-from _typeshed import StrOrBytesPath
-from collections.abc import Sequence
+from _typeshed import Incomplete, StrOrBytesPath, StrPath
+from collections.abc import Generator, Sequence
+from tempfile import TemporaryDirectory
+from typing import Any, ClassVar, Final, TypedDict, type_check_only
 
 from _remote_debugging import AwaitedInfo, InterpreterInfo
 
 from .collector import Collector, _Timestamps
 
+@type_check_only
+class _GeckoCategory(TypedDict):
+    name: str
+    color: str
+    subcategories: list[str]
+
+THREAD_STATUS_HAS_GIL: Final[int]
+THREAD_STATUS_ON_CPU: Final[int]
+THREAD_STATUS_UNKNOWN: Final[int]
+THREAD_STATUS_GIL_REQUESTED: Final[int]
+THREAD_STATUS_HAS_EXCEPTION: Final[int]
+THREAD_STATUS_MAIN_THREAD: Final[int]
+
+GECKO_CATEGORIES: Final[list[_GeckoCategory]]
+
+CATEGORY_OTHER: Final = 0
+CATEGORY_PYTHON: Final = 1
+CATEGORY_NATIVE: Final = 2
+CATEGORY_GC: Final = 3
+CATEGORY_GIL: Final = 4
+CATEGORY_CPU: Final = 5
+CATEGORY_CODE_TYPE: Final = 6
+CATEGORY_OPCODES: Final = 7
+CATEGORY_EXCEPTION: Final = 8
+
+DEFAULT_SUBCATEGORY: Final = 0
+
+GECKO_FORMAT_VERSION: Final = 32
+GECKO_PREPROCESSED_VERSION: Final = 57
+
+RESOURCE_TYPE_LIBRARY: Final = 1
+
+FRAME_ADDRESS_NONE: Final = -1
+FRAME_INLINE_DEPTH_ROOT: Final = 0
+
+PROCESS_TYPE_MAIN: Final = 0
+STACKWALK_DISABLED: Final = 0
+
+DEFAULT_SPILL_BUFFER_BYTES: Final[int]
+
+class SpillColumn:
+    path: str
+    buffer: bytearray
+
+    def __init__(self, directory: StrPath, basename: StrPath, *, buffer_bytes: int | None = None) -> None: ...
+    # "value" accepts the same types as json.JSONEncoder.encode()
+    def append(self, value: Any) -> None: ...
+    def flush(self) -> None: ...
+    def iter_tokens(self) -> Generator[str]: ...
+
+class GeckoThreadSpill:
+    sample_count: int
+    marker_count: int
+    def __init__(self, directory: StrPath, tid: int) -> None: ...
+    def append_sample(self, stack_index: int, time_ms: float) -> None: ...
+    def append_marker(
+        self, name_idx: int, start_time: float, end_time: float, phase: int, category: int, data: dict[str, Any]
+    ) -> None: ...
+    def prepare_read(self) -> None: ...
+
 class GeckoCollector(Collector):
+    aggregating: ClassVar[bool]
+
+    sample_interval_usec: int
+    skip_idle: bool
+    opcodes_enabled: bool
+    start_time: float
+
+    global_strings: list[str]
+    global_string_map: dict[str, int]
+
+    threads: dict[int, dict[str, Any]]
+    spill_dir: TemporaryDirectory[str] | None
+    exported: bool
+
+    libs: list[Incomplete]
+
+    sample_count: int
+    last_sample_time: float
+    interval: float
+
+    has_gil_start: dict[Incomplete, Incomplete]
+    no_gil_start: dict[Incomplete, Incomplete]
+    on_cpu_start: dict[Incomplete, Incomplete]
+    off_cpu_start: dict[Incomplete, Incomplete]
+    python_code_start: dict[Incomplete, Incomplete]
+    native_code_start: dict[Incomplete, Incomplete]
+    gil_wait_start: dict[Incomplete, Incomplete]
+    exception_start: dict[Incomplete, Incomplete]
+    no_exception_start: dict[Incomplete, Incomplete]
+
+    gc_start_per_thread: dict[int, float]
+
+    initialized_threads: set[Incomplete]
+
+    opcode_state: dict[int, tuple[Incomplete, int, int, str, str, float]]
+
     def __init__(self, sample_interval_usec: int, *, skip_idle: bool = False, opcodes: bool = False) -> None: ...
     def collect(
         self, stack_frames: Sequence[InterpreterInfo] | Sequence[AwaitedInfo], timestamps_us: _Timestamps = None
diff --git a/mypy/typeshed/stdlib/types.pyi b/mypy/typeshed/stdlib/types.pyi
index b9771ff..68b6b3f 100644
--- a/mypy/typeshed/stdlib/types.pyi
+++ b/mypy/typeshed/stdlib/types.pyi
@@ -703,8 +703,10 @@
         @property
         def __typing_unpacked_tuple_args__(self) -> tuple[Any, ...] | None: ...
 
-    def __or__(self, value: Any, /) -> UnionType: ...
-    def __ror__(self, value: Any, /) -> UnionType: ...
+    # `other` can be any legal form for unions.
+    # `list[int] | list[int]` creates a `GenericAlias` instance, not a `UnionType` instance
+    def __or__(self, value: Any, /) -> UnionType | GenericAlias: ...
+    def __ror__(self, value: Any, /) -> UnionType | GenericAlias: ...
 
     # GenericAlias delegates attr access to `__origin__`
     def __getattr__(self, name: str) -> Any: ...
diff --git a/mypy/typeshed/stdlib/typing_extensions.pyi b/mypy/typeshed/stdlib/typing_extensions.pyi
index fdbba49..8034117 100644
--- a/mypy/typeshed/stdlib/typing_extensions.pyi
+++ b/mypy/typeshed/stdlib/typing_extensions.pyi
@@ -59,7 +59,6 @@
     Tuple as Tuple,
     Type as Type,
     TypeAlias as TypeAlias,
-    TypedDict as TypedDict,
     TypeGuard as TypeGuard,
     TypeVar as _TypeVar,
     Union as Union,
@@ -72,6 +71,9 @@
     type_check_only,
 )
 
+if sys.version_info >= (3, 14):
+    from _typeshed import EvaluateFunc
+
 # Please keep order the same as at runtime.
 __all__ = [
     # Super-special typing primitives.
@@ -143,6 +145,7 @@
     "override",
     "Protocol",
     "Sentinel",
+    "sentinel",
     "reveal_type",
     "runtime",
     "runtime_checkable",
@@ -232,6 +235,11 @@
 
 def IntVar(name: str) -> Any: ...  # returns a new TypeVar
 
+# Kept as a distinct symbol to `typing.TypedDict` so that type checkers can more easily
+# distinguish between the two on Python 3.14, on which `typing_extensions.TypedDict`
+# exposes `__closed__` and `__extra_items__` but `typing.TypedDict` does not
+TypedDict: _SpecialForm
+
 # Internal mypy fallback type for all typed dicts (does not exist at runtime)
 # N.B. Keep this mostly in sync with typing._TypedDict/mypy_extensions._TypedDict
 @type_check_only
@@ -456,7 +464,6 @@
         ReadOnly as ReadOnly,
         TypeIs as TypeIs,
         TypeVar as TypeVar,
-        TypeVarTuple as TypeVarTuple,
         get_protocol_members as get_protocol_members,
         is_protocol as is_protocol,
     )
@@ -545,19 +552,58 @@
         def has_default(self) -> bool: ...
         def __typing_prepare_subst__(self, alias: Any, args: Any) -> tuple[Any, ...]: ...
 
+    ReadOnly: _SpecialForm
+    TypeIs: _SpecialForm
+
+if sys.version_info >= (3, 15):
+    from typing import TypeVarTuple as TypeVarTuple
+else:
     @final
     class TypeVarTuple:
         @property
         def __name__(self) -> str: ...
         @property
+        def __bound__(self) -> AnnotationForm | None: ...
+        @property
+        def __covariant__(self) -> bool: ...
+        @property
+        def __contravariant__(self) -> bool: ...
+        @property
+        def __infer_variance__(self) -> bool: ...
+        @property
         def __default__(self) -> AnnotationForm: ...
-        def __init__(self, name: str, *, default: AnnotationForm = ...) -> None: ...
+        if sys.version_info >= (3, 11):
+            def __new__(
+                cls,
+                name: str,
+                *,
+                bound: AnnotationForm | None = None,
+                covariant: bool = False,
+                contravariant: bool = False,
+                infer_variance: bool = False,
+                default: AnnotationForm = ...,
+            ) -> Self: ...
+        else:
+            def __init__(
+                self,
+                name: str,
+                *,
+                bound: AnnotationForm | None = None,
+                covariant: bool = False,
+                contravariant: bool = False,
+                infer_variance: bool = False,
+                default: AnnotationForm = ...,
+            ) -> None: ...
+
         def __iter__(self) -> Any: ...  # Unpack[Self]
         def has_default(self) -> bool: ...
-        def __typing_prepare_subst__(self, alias: Any, args: Any) -> tuple[Any, ...]: ...
+        if sys.version_info >= (3, 11):
+            def __typing_subst__(self, arg: Never, /) -> Never: ...
 
-    ReadOnly: _SpecialForm
-    TypeIs: _SpecialForm
+        def __typing_prepare_subst__(self, alias: Any, args: Any, /) -> tuple[Any, ...]: ...
+        if sys.version_info >= (3, 14):
+            @property
+            def evaluate_default(self) -> EvaluateFunc | None: ...
 
 # TypeAliasType was added in Python 3.12, but had significant changes in 3.14.
 if sys.version_info >= (3, 14):
@@ -680,11 +726,21 @@
     def type_repr(value: object) -> str: ...
 
 # PEP 661
-class Sentinel:
-    def __init__(self, name: str, repr: str | None = None) -> None: ...
-    if sys.version_info >= (3, 14):
-        def __or__(self, other: Any) -> UnionType: ...  # other can be any type form legal for unions
-        def __ror__(self, other: Any) -> UnionType: ...  # other can be any type form legal for unions
-    else:
-        def __or__(self, other: Any) -> _SpecialForm: ...  # other can be any type form legal for unions
-        def __ror__(self, other: Any) -> _SpecialForm: ...  # other can be any type form legal for unions
+if sys.version_info >= (3, 15):
+    from builtins import sentinel as sentinel
+else:
+    class sentinel:
+        def __init__(self, name: str, /, *, repr: str | None = None) -> None: ...
+        __name__: str
+        __module__: str
+        if sys.version_info >= (3, 14):
+            # `other`` can be any type form legal for unions.
+            # `x | x` creates a `sentinel` instance if `x` is a sentinel, not a `UnionType` instance
+            def __or__(self, other: Any) -> UnionType | sentinel: ...
+            def __ror__(self, other: Any) -> UnionType | sentinel: ...
+        else:
+            # other can be any type form legal for unions
+            def __or__(self, other: Any) -> _SpecialForm: ...
+            def __ror__(self, other: Any) -> _SpecialForm: ...
+
+Sentinel = sentinel