diff --git a/.changeset/calm-tools-work.md b/.changeset/calm-tools-work.md
new file mode 100644
index 00000000000..75f04056919
--- /dev/null
+++ b/.changeset/calm-tools-work.md
@@ -0,0 +1,5 @@
+---
+'@tanstack/octane-query': minor
+---
+
+Add the official TanStack Query adapter for Octane.
diff --git a/.changeset/config.json b/.changeset/config.json
index 984e1d89f1c..b3e26951bdf 100644
--- a/.changeset/config.json
+++ b/.changeset/config.json
@@ -13,6 +13,7 @@
"@tanstack/angular-query-experimental",
"@tanstack/angular-query-persist-client",
"@tanstack/eslint-plugin-query",
+ "@tanstack/octane-query",
"@tanstack/preact-query",
"@tanstack/preact-query-devtools",
"@tanstack/preact-query-persist-client",
diff --git a/docs/config.json b/docs/config.json
index a68832565dc..d8a0a39f6d7 100644
--- a/docs/config.json
+++ b/docs/config.json
@@ -217,6 +217,23 @@
"to": "framework/preact/graphql"
}
]
+ },
+ {
+ "label": "octane",
+ "children": [
+ {
+ "label": "Overview",
+ "to": "framework/octane/overview"
+ },
+ {
+ "label": "Installation",
+ "to": "framework/octane/installation"
+ },
+ {
+ "label": "Quick Start",
+ "to": "framework/octane/quick-start"
+ }
+ ]
}
]
},
@@ -949,6 +966,19 @@
"to": "framework/preact/guides/does-this-replace-client-state"
}
]
+ },
+ {
+ "label": "octane",
+ "children": [
+ {
+ "label": "Suspense and Error Boundaries",
+ "to": "framework/octane/guides/suspense"
+ },
+ {
+ "label": "Server Rendering and Hydration",
+ "to": "framework/octane/guides/ssr"
+ }
+ ]
}
]
},
@@ -1427,6 +1457,15 @@
"to": "framework/preact/reference/functions/HydrationBoundary"
}
]
+ },
+ {
+ "label": "octane",
+ "children": [
+ {
+ "label": "Octane Reference",
+ "to": "framework/octane/reference/index"
+ }
+ ]
}
]
},
diff --git a/docs/framework/octane/guides/ssr.md b/docs/framework/octane/guides/ssr.md
new file mode 100644
index 00000000000..ba6b18a410d
--- /dev/null
+++ b/docs/framework/octane/guides/ssr.md
@@ -0,0 +1,63 @@
+---
+id: ssr
+title: Server Rendering and Hydration
+---
+
+Octane Query supports both prefetched hydration and render-time Suspense on the
+server. The binding re-exports Query Core's `dehydrate` and `hydrate` functions,
+and `HydrationBoundary` accepts dehydrated queries, including pending queries
+that resolve in a later stream chunk.
+
+## Per-request clients
+
+Create a new `QueryClient` for every server request. Never share one server
+client between users.
+
+```ts
+import { QueryClient, dehydrate, hydrate } from '@tanstack/octane-query'
+
+export async function loadQueryState() {
+ const queryClient = new QueryClient({
+ defaultOptions: {
+ queries: { staleTime: 60_000 },
+ },
+ })
+
+ await queryClient.prefetchQuery({
+ queryKey: ['todos'],
+ queryFn: fetchTodos,
+ })
+
+ return {
+ queryClient,
+ state: dehydrate(queryClient),
+ }
+}
+
+export function restoreQueryState(state: unknown) {
+ const queryClient = new QueryClient()
+ hydrate(queryClient, state)
+ return queryClient
+}
+```
+
+Serialize the dehydrated state through the application's SSR pipeline, restore
+it before the browser renders query consumers, and provide the browser client
+with `QueryClientProvider`. Use `HydrationBoundary` when only a subtree owns a
+dehydrated state payload.
+
+The adapter owns Query's Octane binding and hydration behavior. Routing,
+serialization, and response streaming remain responsibilities of the
+application's TanStack Start or other SSR pipeline.
+
+## Render-time Suspense
+
+Suspense hooks can start a query during server rendering. Octane tracks each
+thenable with the compiler-provided hook slot, so sequential suspense calls and
+streamed continuations resume at the correct call site. Wrap those consumers in
+an Octane Suspense boundary and let the SSR renderer stream the resolved
+content.
+
+For persisted browser caches, wrap consumers in `IsRestoringProvider` while the
+restore is in progress. Query observers will avoid fetching until restoration
+finishes.
diff --git a/docs/framework/octane/guides/suspense.md b/docs/framework/octane/guides/suspense.md
new file mode 100644
index 00000000000..219b64fb975
--- /dev/null
+++ b/docs/framework/octane/guides/suspense.md
@@ -0,0 +1,43 @@
+---
+id: suspense
+title: Suspense and Error Boundaries
+---
+
+Use `useSuspenseQuery`, `useSuspenseInfiniteQuery`, or
+`useSuspenseQueries` when pending work should be handled by an Octane Suspense
+boundary. These hooks integrate with Octane's `use(thenable)` behavior and
+return results whose `data` is defined after the boundary resolves.
+
+```tsrx
+import { ErrorBoundary, Suspense } from 'octane'
+import { useSuspenseQuery } from '@tanstack/octane-query'
+
+function Profile() @{
+ const profile = useSuspenseQuery({
+ queryKey: ['profile'],
+ queryFn: fetchProfile,
+ })
+
+
{profile.data.name}
+}
+
+function Page() @{
+ {error.message}
}>
+ {'Loading...'}}>
+
+
+
+}
+```
+
+Octane's `@pending` and `@catch` directives can be used instead of the
+component boundaries.
+
+By default, a suspense query only throws an error when no cached data is
+available. Set `throwOnError` on non-suspense queries or mutations when their
+errors should reach the nearest error boundary.
+
+Use `QueryErrorResetBoundary` or `useQueryErrorResetBoundary` to coordinate a
+boundary retry with the Query cache. Reset the Query boundary when the Octane
+error boundary retries so the failed query can fetch again instead of
+immediately throwing the same error.
diff --git a/docs/framework/octane/installation.md b/docs/framework/octane/installation.md
new file mode 100644
index 00000000000..5b43e44d5ba
--- /dev/null
+++ b/docs/framework/octane/installation.md
@@ -0,0 +1,24 @@
+---
+id: installation
+title: Installation
+---
+
+Install the official adapter and Octane:
+
+```bash
+pnpm add @tanstack/octane-query octane
+```
+
+Or use the equivalent command for npm, Yarn, or Bun.
+
+`octane` is a peer dependency. `@tanstack/query-core` is included by the
+adapter and all of its public APIs are re-exported from
+`@tanstack/octane-query`.
+
+## Compiler requirement
+
+The adapter publishes TSRX source so Octane can compile the correct client and
+server output. Use Octane's standard Vite integration in the consuming app.
+The package is not a precompiled Node.js runtime entry point.
+
+The adapter requires Node.js 22 or newer for its package tooling.
diff --git a/docs/framework/octane/overview.md b/docs/framework/octane/overview.md
new file mode 100644
index 00000000000..0d3c3bfdeb1
--- /dev/null
+++ b/docs/framework/octane/overview.md
@@ -0,0 +1,52 @@
+---
+id: overview
+title: Overview
+---
+
+`@tanstack/octane-query` is the official Octane adapter for TanStack Query. It
+uses `@tanstack/query-core` unchanged and binds Query observers to Octane's
+hooks, context, Suspense, and component lifecycle.
+
+Most binding-level code can move from React Query by changing the import. The
+adapter includes queries, infinite queries, parallel queries, mutations,
+prefetch hooks, cache status hooks, Suspense hooks, error reset boundaries,
+restoration state, and hydration. It also re-exports every Query Core API.
+
+```tsrx
+import {
+ QueryClient,
+ QueryClientProvider,
+ useQuery,
+} from '@tanstack/octane-query'
+
+const queryClient = new QueryClient()
+
+function Todos() @{
+ const query = useQuery({
+ queryKey: ['todos'],
+ queryFn: fetchTodos,
+ })
+
+ @if (query.isPending) {
+ {'Loading'}
+ } @else if (query.isError) {
+ {query.error.message}
+ } @else {
+
+ }
+}
+
+function App() @{
+
+
+
+}
+```
+
+Octane hooks receive compiler-injected call-site slots. The adapter derives
+stable sub-slots for the Query observer, subscription, and effects, so call the
+hooks normally and let the Octane compiler transform them.
+
+Start with [Installation](./installation.md), then [Quick Start](./quick-start.md).
+See [Suspense and Error Boundaries](./guides/suspense.md) and [Server Rendering
+and Hydration](./guides/ssr.md) for the framework-specific behavior.
diff --git a/docs/framework/octane/quick-start.md b/docs/framework/octane/quick-start.md
new file mode 100644
index 00000000000..e96fa509900
--- /dev/null
+++ b/docs/framework/octane/quick-start.md
@@ -0,0 +1,60 @@
+---
+id: quick-start
+title: Quick Start
+---
+
+Create one `QueryClient` for the browser application, provide it above query
+consumers, and call the Octane hooks from component bodies.
+
+```tsrx
+import {
+ QueryClient,
+ QueryClientProvider,
+ useMutation,
+ useQuery,
+ useQueryClient,
+} from '@tanstack/octane-query'
+import { addTodo, getTodos } from './api'
+
+const queryClient = new QueryClient()
+
+function Todos() @{
+ const client = useQueryClient()
+ const todos = useQuery({
+ queryKey: ['todos'],
+ queryFn: getTodos,
+ })
+ const addTodoMutation = useMutation({
+ mutationFn: addTodo,
+ onSuccess: async () => {
+ await client.invalidateQueries({ queryKey: ['todos'] })
+ },
+ })
+
+ @if (todos.isPending) {
+ {'Loading...'}
+ } @else if (todos.isError) {
+ {todos.error.message}
+ } @else {
+
+ {todos.data.map((todo) => {todo.title} )}
+
+ addTodoMutation.mutate({ title: 'Read the Query docs' })}
+ >
+ {'Add todo'}
+
+ }
+}
+
+function App() @{
+
+
+
+}
+```
+
+Query option objects, keys, invalidation, retries, caching, and mutations use
+the same TanStack Query contracts as the other framework adapters. The Octane
+adapter changes the rendering and subscription layer, not Query Core.
diff --git a/docs/framework/octane/reference/functions/infiniteQueryOptions.md b/docs/framework/octane/reference/functions/infiniteQueryOptions.md
new file mode 100644
index 00000000000..564cc27340a
--- /dev/null
+++ b/docs/framework/octane/reference/functions/infiniteQueryOptions.md
@@ -0,0 +1,126 @@
+---
+id: infiniteQueryOptions
+title: infiniteQueryOptions
+---
+
+# Function: infiniteQueryOptions()
+
+## Call Signature
+
+```ts
+function infiniteQueryOptions(options): UseInfiniteQueryOptions & object & object;
+```
+
+Defined in: packages/octane-query/src/infiniteQueryOptions.ts:76
+
+### Type Parameters
+
+#### TQueryFnData
+
+`TQueryFnData`
+
+#### TError
+
+`TError` = `Error`
+
+#### TData
+
+`TData` = `InfiniteData`\<`TQueryFnData`, `unknown`\>
+
+#### TQueryKey
+
+`TQueryKey` *extends* readonly `unknown`[] = readonly `unknown`[]
+
+#### TPageParam
+
+`TPageParam` = `unknown`
+
+### Parameters
+
+#### options
+
+[`DefinedInitialDataInfiniteOptions`](../type-aliases/DefinedInitialDataInfiniteOptions.md)\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`, `TPageParam`\>
+
+### Returns
+
+[`UseInfiniteQueryOptions`](../interfaces/UseInfiniteQueryOptions.md)\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`, `TPageParam`\> & `object` & `object`
+
+## Call Signature
+
+```ts
+function infiniteQueryOptions(options): OmitKeyof, "queryFn"> & object & object;
+```
+
+Defined in: packages/octane-query/src/infiniteQueryOptions.ts:100
+
+### Type Parameters
+
+#### TQueryFnData
+
+`TQueryFnData`
+
+#### TError
+
+`TError` = `Error`
+
+#### TData
+
+`TData` = `InfiniteData`\<`TQueryFnData`, `unknown`\>
+
+#### TQueryKey
+
+`TQueryKey` *extends* readonly `unknown`[] = readonly `unknown`[]
+
+#### TPageParam
+
+`TPageParam` = `unknown`
+
+### Parameters
+
+#### options
+
+[`UnusedSkipTokenInfiniteOptions`](../type-aliases/UnusedSkipTokenInfiniteOptions.md)\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`, `TPageParam`\>
+
+### Returns
+
+`OmitKeyof`\<[`UseInfiniteQueryOptions`](../interfaces/UseInfiniteQueryOptions.md)\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`, `TPageParam`\>, `"queryFn"`\> & `object` & `object`
+
+## Call Signature
+
+```ts
+function infiniteQueryOptions(options): UseInfiniteQueryOptions & object & object;
+```
+
+Defined in: packages/octane-query/src/infiniteQueryOptions.ts:124
+
+### Type Parameters
+
+#### TQueryFnData
+
+`TQueryFnData`
+
+#### TError
+
+`TError` = `Error`
+
+#### TData
+
+`TData` = `InfiniteData`\<`TQueryFnData`, `unknown`\>
+
+#### TQueryKey
+
+`TQueryKey` *extends* readonly `unknown`[] = readonly `unknown`[]
+
+#### TPageParam
+
+`TPageParam` = `unknown`
+
+### Parameters
+
+#### options
+
+[`UndefinedInitialDataInfiniteOptions`](../type-aliases/UndefinedInitialDataInfiniteOptions.md)\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`, `TPageParam`\>
+
+### Returns
+
+[`UseInfiniteQueryOptions`](../interfaces/UseInfiniteQueryOptions.md)\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`, `TPageParam`\> & `object` & `object`
diff --git a/docs/framework/octane/reference/functions/mutationOptions.md b/docs/framework/octane/reference/functions/mutationOptions.md
new file mode 100644
index 00000000000..c297d4a9dbe
--- /dev/null
+++ b/docs/framework/octane/reference/functions/mutationOptions.md
@@ -0,0 +1,78 @@
+---
+id: mutationOptions
+title: mutationOptions
+---
+
+# Function: mutationOptions()
+
+## Call Signature
+
+```ts
+function mutationOptions(options): WithRequired, "mutationKey">;
+```
+
+Defined in: packages/octane-query/src/mutationOptions.ts:5
+
+### Type Parameters
+
+#### TData
+
+`TData` = `unknown`
+
+#### TError
+
+`TError` = `Error`
+
+#### TVariables
+
+`TVariables` = `void`
+
+#### TOnMutateResult
+
+`TOnMutateResult` = `unknown`
+
+### Parameters
+
+#### options
+
+`WithRequired`\<[`UseMutationOptions`](../interfaces/UseMutationOptions.md)\<`TData`, `TError`, `TVariables`, `TOnMutateResult`\>, `"mutationKey"`\>
+
+### Returns
+
+`WithRequired`\<[`UseMutationOptions`](../interfaces/UseMutationOptions.md)\<`TData`, `TError`, `TVariables`, `TOnMutateResult`\>, `"mutationKey"`\>
+
+## Call Signature
+
+```ts
+function mutationOptions(options): Omit, "mutationKey">;
+```
+
+Defined in: packages/octane-query/src/mutationOptions.ts:19
+
+### Type Parameters
+
+#### TData
+
+`TData` = `unknown`
+
+#### TError
+
+`TError` = `Error`
+
+#### TVariables
+
+`TVariables` = `void`
+
+#### TOnMutateResult
+
+`TOnMutateResult` = `unknown`
+
+### Parameters
+
+#### options
+
+`Omit`\<[`UseMutationOptions`](../interfaces/UseMutationOptions.md)\<`TData`, `TError`, `TVariables`, `TOnMutateResult`\>, `"mutationKey"`\>
+
+### Returns
+
+`Omit`\<[`UseMutationOptions`](../interfaces/UseMutationOptions.md)\<`TData`, `TError`, `TVariables`, `TOnMutateResult`\>, `"mutationKey"`\>
diff --git a/docs/framework/octane/reference/functions/queryOptions.md b/docs/framework/octane/reference/functions/queryOptions.md
new file mode 100644
index 00000000000..0eaa0dd323a
--- /dev/null
+++ b/docs/framework/octane/reference/functions/queryOptions.md
@@ -0,0 +1,114 @@
+---
+id: queryOptions
+title: queryOptions
+---
+
+# Function: queryOptions()
+
+## Call Signature
+
+```ts
+function queryOptions(options): Omit, "queryFn"> & object & object;
+```
+
+Defined in: packages/octane-query/src/queryOptions.ts:53
+
+### Type Parameters
+
+#### TQueryFnData
+
+`TQueryFnData` = `unknown`
+
+#### TError
+
+`TError` = `Error`
+
+#### TData
+
+`TData` = `TQueryFnData`
+
+#### TQueryKey
+
+`TQueryKey` *extends* readonly `unknown`[] = readonly `unknown`[]
+
+### Parameters
+
+#### options
+
+[`DefinedInitialDataOptions`](../type-aliases/DefinedInitialDataOptions.md)\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`\>
+
+### Returns
+
+`Omit`\<[`UseQueryOptions`](../interfaces/UseQueryOptions.md)\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`\>, `"queryFn"`\> & `object` & `object`
+
+## Call Signature
+
+```ts
+function queryOptions(options): OmitKeyof, "queryFn"> & object & object;
+```
+
+Defined in: packages/octane-query/src/queryOptions.ts:64
+
+### Type Parameters
+
+#### TQueryFnData
+
+`TQueryFnData` = `unknown`
+
+#### TError
+
+`TError` = `Error`
+
+#### TData
+
+`TData` = `TQueryFnData`
+
+#### TQueryKey
+
+`TQueryKey` *extends* readonly `unknown`[] = readonly `unknown`[]
+
+### Parameters
+
+#### options
+
+[`UnusedSkipTokenOptions`](../type-aliases/UnusedSkipTokenOptions.md)\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`\>
+
+### Returns
+
+`OmitKeyof`\<[`UseQueryOptions`](../interfaces/UseQueryOptions.md)\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`\>, `"queryFn"`\> & `object` & `object`
+
+## Call Signature
+
+```ts
+function queryOptions(options): UseQueryOptions & object & object;
+```
+
+Defined in: packages/octane-query/src/queryOptions.ts:75
+
+### Type Parameters
+
+#### TQueryFnData
+
+`TQueryFnData` = `unknown`
+
+#### TError
+
+`TError` = `Error`
+
+#### TData
+
+`TData` = `TQueryFnData`
+
+#### TQueryKey
+
+`TQueryKey` *extends* readonly `unknown`[] = readonly `unknown`[]
+
+### Parameters
+
+#### options
+
+[`UndefinedInitialDataOptions`](../type-aliases/UndefinedInitialDataOptions.md)\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`\>
+
+### Returns
+
+[`UseQueryOptions`](../interfaces/UseQueryOptions.md)\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`\> & `object` & `object`
diff --git a/docs/framework/octane/reference/functions/useInfiniteQuery.md b/docs/framework/octane/reference/functions/useInfiniteQuery.md
new file mode 100644
index 00000000000..2d90a95204f
--- /dev/null
+++ b/docs/framework/octane/reference/functions/useInfiniteQuery.md
@@ -0,0 +1,138 @@
+---
+id: useInfiniteQuery
+title: useInfiniteQuery
+---
+
+# Function: useInfiniteQuery()
+
+## Call Signature
+
+```ts
+function useInfiniteQuery(options, queryClient?): DefinedUseInfiniteQueryResult;
+```
+
+Defined in: packages/octane-query/src/useInfiniteQuery.ts:21
+
+### Type Parameters
+
+#### TQueryFnData
+
+`TQueryFnData`
+
+#### TError
+
+`TError` = `Error`
+
+#### TData
+
+`TData` = `InfiniteData`\<`TQueryFnData`, `unknown`\>
+
+#### TQueryKey
+
+`TQueryKey` *extends* readonly `unknown`[] = readonly `unknown`[]
+
+#### TPageParam
+
+`TPageParam` = `unknown`
+
+### Parameters
+
+#### options
+
+[`DefinedInitialDataInfiniteOptions`](../type-aliases/DefinedInitialDataInfiniteOptions.md)\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`, `TPageParam`\>
+
+#### queryClient?
+
+`QueryClient`
+
+### Returns
+
+[`DefinedUseInfiniteQueryResult`](../type-aliases/DefinedUseInfiniteQueryResult.md)\<`TData`, `TError`\>
+
+## Call Signature
+
+```ts
+function useInfiniteQuery(options, queryClient?): UseInfiniteQueryResult;
+```
+
+Defined in: packages/octane-query/src/useInfiniteQuery.ts:38
+
+### Type Parameters
+
+#### TQueryFnData
+
+`TQueryFnData`
+
+#### TError
+
+`TError` = `Error`
+
+#### TData
+
+`TData` = `InfiniteData`\<`TQueryFnData`, `unknown`\>
+
+#### TQueryKey
+
+`TQueryKey` *extends* readonly `unknown`[] = readonly `unknown`[]
+
+#### TPageParam
+
+`TPageParam` = `unknown`
+
+### Parameters
+
+#### options
+
+[`UndefinedInitialDataInfiniteOptions`](../type-aliases/UndefinedInitialDataInfiniteOptions.md)\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`, `TPageParam`\>
+
+#### queryClient?
+
+`QueryClient`
+
+### Returns
+
+[`UseInfiniteQueryResult`](../type-aliases/UseInfiniteQueryResult.md)\<`TData`, `TError`\>
+
+## Call Signature
+
+```ts
+function useInfiniteQuery(options, queryClient?): UseInfiniteQueryResult;
+```
+
+Defined in: packages/octane-query/src/useInfiniteQuery.ts:55
+
+### Type Parameters
+
+#### TQueryFnData
+
+`TQueryFnData`
+
+#### TError
+
+`TError` = `Error`
+
+#### TData
+
+`TData` = `InfiniteData`\<`TQueryFnData`, `unknown`\>
+
+#### TQueryKey
+
+`TQueryKey` *extends* readonly `unknown`[] = readonly `unknown`[]
+
+#### TPageParam
+
+`TPageParam` = `unknown`
+
+### Parameters
+
+#### options
+
+[`UseInfiniteQueryOptions`](../interfaces/UseInfiniteQueryOptions.md)\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`, `TPageParam`\>
+
+#### queryClient?
+
+`QueryClient`
+
+### Returns
+
+[`UseInfiniteQueryResult`](../type-aliases/UseInfiniteQueryResult.md)\<`TData`, `TError`\>
diff --git a/docs/framework/octane/reference/functions/useIsFetching.md b/docs/framework/octane/reference/functions/useIsFetching.md
new file mode 100644
index 00000000000..3b027d771ae
--- /dev/null
+++ b/docs/framework/octane/reference/functions/useIsFetching.md
@@ -0,0 +1,26 @@
+---
+id: useIsFetching
+title: useIsFetching
+---
+
+# Function: useIsFetching()
+
+```ts
+function useIsFetching(filters?, queryClient?): number;
+```
+
+Defined in: packages/octane-query/src/useIsFetching.ts:8
+
+## Parameters
+
+### filters?
+
+`QueryFilters`\
+
+### queryClient?
+
+`QueryClient`
+
+## Returns
+
+`number`
diff --git a/docs/framework/octane/reference/functions/useIsMutating.md b/docs/framework/octane/reference/functions/useIsMutating.md
new file mode 100644
index 00000000000..b31853f334d
--- /dev/null
+++ b/docs/framework/octane/reference/functions/useIsMutating.md
@@ -0,0 +1,26 @@
+---
+id: useIsMutating
+title: useIsMutating
+---
+
+# Function: useIsMutating()
+
+```ts
+function useIsMutating(filters?, queryClient?): number;
+```
+
+Defined in: packages/octane-query/src/useMutationState.ts:73
+
+## Parameters
+
+### filters?
+
+`MutationFilters`\<`unknown`, `Error`, `unknown`, `unknown`\>
+
+### queryClient?
+
+`QueryClient`
+
+## Returns
+
+`number`
diff --git a/docs/framework/octane/reference/functions/useIsRestoring.md b/docs/framework/octane/reference/functions/useIsRestoring.md
new file mode 100644
index 00000000000..148632fb7d3
--- /dev/null
+++ b/docs/framework/octane/reference/functions/useIsRestoring.md
@@ -0,0 +1,16 @@
+---
+id: useIsRestoring
+title: useIsRestoring
+---
+
+# Function: useIsRestoring()
+
+```ts
+function useIsRestoring(): boolean;
+```
+
+Defined in: packages/octane-query/src/isRestoring.ts:8
+
+## Returns
+
+`boolean`
diff --git a/docs/framework/octane/reference/functions/useMutation.md b/docs/framework/octane/reference/functions/useMutation.md
new file mode 100644
index 00000000000..613975227e8
--- /dev/null
+++ b/docs/framework/octane/reference/functions/useMutation.md
@@ -0,0 +1,44 @@
+---
+id: useMutation
+title: useMutation
+---
+
+# Function: useMutation()
+
+```ts
+function useMutation(options, queryClient?): UseMutationResult;
+```
+
+Defined in: packages/octane-query/src/useMutation.ts:23
+
+## Type Parameters
+
+### TData
+
+`TData` = `unknown`
+
+### TError
+
+`TError` = `Error`
+
+### TVariables
+
+`TVariables` = `void`
+
+### TOnMutateResult
+
+`TOnMutateResult` = `unknown`
+
+## Parameters
+
+### options
+
+[`UseMutationOptions`](../interfaces/UseMutationOptions.md)\<`TData`, `TError`, `TVariables`, `TOnMutateResult`\>
+
+### queryClient?
+
+`QueryClient`
+
+## Returns
+
+[`UseMutationResult`](../type-aliases/UseMutationResult.md)\<`TData`, `TError`, `TVariables`, `TOnMutateResult`\>
diff --git a/docs/framework/octane/reference/functions/useMutationState.md b/docs/framework/octane/reference/functions/useMutationState.md
new file mode 100644
index 00000000000..cc11c36cc07
--- /dev/null
+++ b/docs/framework/octane/reference/functions/useMutationState.md
@@ -0,0 +1,32 @@
+---
+id: useMutationState
+title: useMutationState
+---
+
+# Function: useMutationState()
+
+```ts
+function useMutationState(options?, queryClient?): TResult[];
+```
+
+Defined in: packages/octane-query/src/useMutationState.ts:27
+
+## Type Parameters
+
+### TResult
+
+`TResult` = `MutationState`\<`unknown`, `Error`, `unknown`, `unknown`\>
+
+## Parameters
+
+### options?
+
+`MutationStateOptions`\<`TResult`\>
+
+### queryClient?
+
+`QueryClient`
+
+## Returns
+
+`TResult`[]
diff --git a/docs/framework/octane/reference/functions/usePrefetchInfiniteQuery.md b/docs/framework/octane/reference/functions/usePrefetchInfiniteQuery.md
new file mode 100644
index 00000000000..7704aed510c
--- /dev/null
+++ b/docs/framework/octane/reference/functions/usePrefetchInfiniteQuery.md
@@ -0,0 +1,48 @@
+---
+id: usePrefetchInfiniteQuery
+title: usePrefetchInfiniteQuery
+---
+
+# Function: usePrefetchInfiniteQuery()
+
+```ts
+function usePrefetchInfiniteQuery(options, queryClient?): void;
+```
+
+Defined in: packages/octane-query/src/usePrefetch.ts:31
+
+## Type Parameters
+
+### TQueryFnData
+
+`TQueryFnData` = `unknown`
+
+### TError
+
+`TError` = `Error`
+
+### TData
+
+`TData` = `TQueryFnData`
+
+### TQueryKey
+
+`TQueryKey` *extends* readonly `unknown`[] = readonly `unknown`[]
+
+### TPageParam
+
+`TPageParam` = `unknown`
+
+## Parameters
+
+### options
+
+`FetchInfiniteQueryOptions`\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`, `TPageParam`\>
+
+### queryClient?
+
+`QueryClient`
+
+## Returns
+
+`void`
diff --git a/docs/framework/octane/reference/functions/usePrefetchQuery.md b/docs/framework/octane/reference/functions/usePrefetchQuery.md
new file mode 100644
index 00000000000..da76e630f49
--- /dev/null
+++ b/docs/framework/octane/reference/functions/usePrefetchQuery.md
@@ -0,0 +1,44 @@
+---
+id: usePrefetchQuery
+title: usePrefetchQuery
+---
+
+# Function: usePrefetchQuery()
+
+```ts
+function usePrefetchQuery(options, queryClient?): void;
+```
+
+Defined in: packages/octane-query/src/usePrefetch.ts:13
+
+## Type Parameters
+
+### TQueryFnData
+
+`TQueryFnData` = `unknown`
+
+### TError
+
+`TError` = `Error`
+
+### TData
+
+`TData` = `TQueryFnData`
+
+### TQueryKey
+
+`TQueryKey` *extends* readonly `unknown`[] = readonly `unknown`[]
+
+## Parameters
+
+### options
+
+[`UsePrefetchQueryOptions`](../interfaces/UsePrefetchQueryOptions.md)\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`\>
+
+### queryClient?
+
+`QueryClient`
+
+## Returns
+
+`void`
diff --git a/docs/framework/octane/reference/functions/useQueries.md b/docs/framework/octane/reference/functions/useQueries.md
new file mode 100644
index 00000000000..e1015f2f484
--- /dev/null
+++ b/docs/framework/octane/reference/functions/useQueries.md
@@ -0,0 +1,47 @@
+---
+id: useQueries
+title: useQueries
+---
+
+# Function: useQueries()
+
+```ts
+function useQueries(options, queryClient?): TCombinedResult;
+```
+
+Defined in: packages/octane-query/src/useQueries.ts:38
+
+## Type Parameters
+
+### T
+
+`T` *extends* `any`[]
+
+### TCombinedResult
+
+`TCombinedResult` = `T` *extends* \[\] ? \[\] : `T` *extends* \[`Head`\] ? \[`GetUseQueryResult`\<`Head`\>\] : `T` *extends* \[`Head`, `...Tails[]`\] ? \[`...Tails[]`\] *extends* \[\] ? \[\] : \[`...Tails[]`\] *extends* \[`Head`\] ? \[`GetUseQueryResult`\<`Head`\>, `GetUseQueryResult`\<`Head`\>\] : \[`...Tails[]`\] *extends* \[`Head`, `...Tails[]`\] ? \[`...Tails[]`\] *extends* \[\] ? \[\] : \[`...Tails[]`\] *extends* \[`Head`\] ? \[`GetUseQueryResult`\<`Head`\>, `GetUseQueryResult`\<`Head`\>, `GetUseQueryResult`\<`Head`\>\] : \[`...Tails[]`\] *extends* \[`Head`, `...Tails[]`\] ? \[`...(...)[]`\] *extends* \[\] ? \[\] : ... *extends* ... ? ... : ... : \[`...{ [K in (...)]: (...) }[]`\] : \[...\{ \[K in string \| number \| symbol\]: GetUseQueryResult\\]\> \}\[\]\] : \{ \[K in string \| number \| symbol\]: GetUseQueryResult\\]\> \}
+
+## Parameters
+
+### options
+
+#### combine?
+
+(`result`) => `TCombinedResult`
+
+#### queries
+
+ \| readonly \[`T` *extends* \[\] ? \[\] : `T` *extends* \[`Head`\] ? \[`GetUseQueryOptionsForUseQueries`\<`Head`\>\] : `T` *extends* \[`Head`, `...Tails[]`\] ? \[`...Tails[]`\] *extends* \[\] ? \[\] : \[`...Tails[]`\] *extends* \[`Head`\] ? \[`GetUseQueryOptionsForUseQueries`\<`Head`\>, `GetUseQueryOptionsForUseQueries`\<`Head`\>\] : \[`...Tails[]`\] *extends* \[`Head`, `...Tails[]`\] ? \[`...(...)[]`\] *extends* \[\] ? \[\] : ... *extends* ... ? ... : ... : readonly ...[] *extends* \[`...(...)[]`\] ? \[`...(...)[]`\] : ... *extends* ... ? ... : ... : readonly `unknown`[] *extends* `T` ? `T` : `T` *extends* `UseQueryOptionsForUseQueries`\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`\>[] ? `UseQueryOptionsForUseQueries`\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`\>[] : `UseQueryOptionsForUseQueries`\<`unknown`, `Error`, `unknown`, readonly ...[]\>[]\]
+ \| readonly \[\{ \[K in string \| number \| symbol\]: GetUseQueryOptionsForUseQueries\\]\> \}\]
+
+#### subscribed?
+
+`boolean`
+
+### queryClient?
+
+`QueryClient`
+
+## Returns
+
+`TCombinedResult`
diff --git a/docs/framework/octane/reference/functions/useQuery.md b/docs/framework/octane/reference/functions/useQuery.md
new file mode 100644
index 00000000000..af40f908fa6
--- /dev/null
+++ b/docs/framework/octane/reference/functions/useQuery.md
@@ -0,0 +1,126 @@
+---
+id: useQuery
+title: useQuery
+---
+
+# Function: useQuery()
+
+## Call Signature
+
+```ts
+function useQuery(options, queryClient?): DefinedUseQueryResult, TError>;
+```
+
+Defined in: packages/octane-query/src/useQuery.ts:17
+
+### Type Parameters
+
+#### TQueryFnData
+
+`TQueryFnData` = `unknown`
+
+#### TError
+
+`TError` = `Error`
+
+#### TData
+
+`TData` = `TQueryFnData`
+
+#### TQueryKey
+
+`TQueryKey` *extends* readonly `unknown`[] = readonly `unknown`[]
+
+### Parameters
+
+#### options
+
+[`DefinedInitialDataOptions`](../type-aliases/DefinedInitialDataOptions.md)\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`\>
+
+#### queryClient?
+
+`QueryClient`
+
+### Returns
+
+[`DefinedUseQueryResult`](../type-aliases/DefinedUseQueryResult.md)\<`NoInfer`\<`TData`\>, `TError`\>
+
+## Call Signature
+
+```ts
+function useQuery(options, queryClient?): UseQueryResult, TError>;
+```
+
+Defined in: packages/octane-query/src/useQuery.ts:27
+
+### Type Parameters
+
+#### TQueryFnData
+
+`TQueryFnData` = `unknown`
+
+#### TError
+
+`TError` = `Error`
+
+#### TData
+
+`TData` = `TQueryFnData`
+
+#### TQueryKey
+
+`TQueryKey` *extends* readonly `unknown`[] = readonly `unknown`[]
+
+### Parameters
+
+#### options
+
+[`UndefinedInitialDataOptions`](../type-aliases/UndefinedInitialDataOptions.md)\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`\>
+
+#### queryClient?
+
+`QueryClient`
+
+### Returns
+
+[`UseQueryResult`](../type-aliases/UseQueryResult.md)\<`NoInfer`\<`TData`\>, `TError`\>
+
+## Call Signature
+
+```ts
+function useQuery(options, queryClient?): UseQueryResult, TError>;
+```
+
+Defined in: packages/octane-query/src/useQuery.ts:37
+
+### Type Parameters
+
+#### TQueryFnData
+
+`TQueryFnData` = `unknown`
+
+#### TError
+
+`TError` = `Error`
+
+#### TData
+
+`TData` = `TQueryFnData`
+
+#### TQueryKey
+
+`TQueryKey` *extends* readonly `unknown`[] = readonly `unknown`[]
+
+### Parameters
+
+#### options
+
+[`UseQueryOptions`](../interfaces/UseQueryOptions.md)\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`\>
+
+#### queryClient?
+
+`QueryClient`
+
+### Returns
+
+[`UseQueryResult`](../type-aliases/UseQueryResult.md)\<`NoInfer`\<`TData`\>, `TError`\>
diff --git a/docs/framework/octane/reference/functions/useQueryClient.md b/docs/framework/octane/reference/functions/useQueryClient.md
new file mode 100644
index 00000000000..4ee235d598b
--- /dev/null
+++ b/docs/framework/octane/reference/functions/useQueryClient.md
@@ -0,0 +1,22 @@
+---
+id: useQueryClient
+title: useQueryClient
+---
+
+# Function: useQueryClient()
+
+```ts
+function useQueryClient(queryClient?): QueryClient;
+```
+
+Defined in: packages/octane-query/src/context.ts:25
+
+## Parameters
+
+### queryClient?
+
+`QueryClient`
+
+## Returns
+
+`QueryClient`
diff --git a/docs/framework/octane/reference/functions/useQueryErrorResetBoundary.md b/docs/framework/octane/reference/functions/useQueryErrorResetBoundary.md
new file mode 100644
index 00000000000..8e3434a5d6e
--- /dev/null
+++ b/docs/framework/octane/reference/functions/useQueryErrorResetBoundary.md
@@ -0,0 +1,16 @@
+---
+id: useQueryErrorResetBoundary
+title: useQueryErrorResetBoundary
+---
+
+# Function: useQueryErrorResetBoundary()
+
+```ts
+function useQueryErrorResetBoundary(): QueryErrorResetBoundaryValue;
+```
+
+Defined in: packages/octane-query/src/errorResetBoundary.ts:30
+
+## Returns
+
+[`QueryErrorResetBoundaryValue`](../interfaces/QueryErrorResetBoundaryValue.md)
diff --git a/docs/framework/octane/reference/functions/useSuspenseInfiniteQuery.md b/docs/framework/octane/reference/functions/useSuspenseInfiniteQuery.md
new file mode 100644
index 00000000000..f6cdfc683bc
--- /dev/null
+++ b/docs/framework/octane/reference/functions/useSuspenseInfiniteQuery.md
@@ -0,0 +1,48 @@
+---
+id: useSuspenseInfiniteQuery
+title: useSuspenseInfiniteQuery
+---
+
+# Function: useSuspenseInfiniteQuery()
+
+```ts
+function useSuspenseInfiniteQuery(options, queryClient?): UseSuspenseInfiniteQueryResult;
+```
+
+Defined in: packages/octane-query/src/useSuspenseQuery.ts:56
+
+## Type Parameters
+
+### TQueryFnData
+
+`TQueryFnData`
+
+### TError
+
+`TError` = `Error`
+
+### TData
+
+`TData` = `InfiniteData`\<`TQueryFnData`, `unknown`\>
+
+### TQueryKey
+
+`TQueryKey` *extends* readonly `unknown`[] = readonly `unknown`[]
+
+### TPageParam
+
+`TPageParam` = `unknown`
+
+## Parameters
+
+### options
+
+[`UseSuspenseInfiniteQueryOptions`](../interfaces/UseSuspenseInfiniteQueryOptions.md)\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`, `TPageParam`\>
+
+### queryClient?
+
+`QueryClient`
+
+## Returns
+
+[`UseSuspenseInfiniteQueryResult`](../type-aliases/UseSuspenseInfiniteQueryResult.md)\<`TData`, `TError`\>
diff --git a/docs/framework/octane/reference/functions/useSuspenseQueries.md b/docs/framework/octane/reference/functions/useSuspenseQueries.md
new file mode 100644
index 00000000000..26dcca4e0fd
--- /dev/null
+++ b/docs/framework/octane/reference/functions/useSuspenseQueries.md
@@ -0,0 +1,83 @@
+---
+id: useSuspenseQueries
+title: useSuspenseQueries
+---
+
+# Function: useSuspenseQueries()
+
+## Call Signature
+
+```ts
+function useSuspenseQueries(options, queryClient?): TCombinedResult;
+```
+
+Defined in: packages/octane-query/src/useSuspenseQueries.ts:12
+
+### Type Parameters
+
+#### T
+
+`T` *extends* `any`[]
+
+#### TCombinedResult
+
+`TCombinedResult` = `T` *extends* \[\] ? \[\] : `T` *extends* \[`Head`\] ? \[`GetUseSuspenseQueryResult`\<`Head`\>\] : `T` *extends* \[`Head`, `...Tails[]`\] ? \[`...Tails[]`\] *extends* \[\] ? \[\] : \[`...Tails[]`\] *extends* \[`Head`\] ? \[`GetUseSuspenseQueryResult`\<`Head`\>, `GetUseSuspenseQueryResult`\<`Head`\>\] : \[`...Tails[]`\] *extends* \[`Head`, `...Tails[]`\] ? \[`...Tails[]`\] *extends* \[\] ? \[\] : \[`...Tails[]`\] *extends* \[`Head`\] ? \[`GetUseSuspenseQueryResult`\<`Head`\>, `GetUseSuspenseQueryResult`\<`Head`\>, `GetUseSuspenseQueryResult`\<`Head`\>\] : \[`...Tails[]`\] *extends* \[`Head`, `...Tails[]`\] ? \[`...(...)[]`\] *extends* \[\] ? \[\] : ... *extends* ... ? ... : ... : \[`...{ [K in (...)]: (...) }[]`\] : \[...\{ \[K in string \| number \| symbol\]: GetUseSuspenseQueryResult\\]\> \}\[\]\] : \{ \[K in string \| number \| symbol\]: GetUseSuspenseQueryResult\\]\> \}
+
+### Parameters
+
+#### options
+
+##### combine?
+
+(`result`) => `TCombinedResult`
+
+##### queries
+
+ \| readonly \[`T` *extends* \[\] ? \[\] : `T` *extends* \[`Head`\] ? \[`GetUseSuspenseQueryOptions`\<`Head`\>\] : `T` *extends* \[`Head`, `...Tails[]`\] ? \[`...Tails[]`\] *extends* \[\] ? \[\] : \[`...Tails[]`\] *extends* \[`Head`\] ? \[`GetUseSuspenseQueryOptions`\<`Head`\>, `GetUseSuspenseQueryOptions`\<`Head`\>\] : \[`...Tails[]`\] *extends* \[`Head`, `...Tails[]`\] ? \[`...(...)[]`\] *extends* \[\] ? \[\] : ... *extends* ... ? ... : ... : ...[] *extends* \[`...(...)[]`\] ? \[`...(...)[]`\] : ... *extends* ... ? ... : ... : `unknown`[] *extends* `T` ? `T` : `T` *extends* [`UseSuspenseQueryOptions`](../interfaces/UseSuspenseQueryOptions.md)\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`\>[] ? [`UseSuspenseQueryOptions`](../interfaces/UseSuspenseQueryOptions.md)\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`\>[] : [`UseSuspenseQueryOptions`](../interfaces/UseSuspenseQueryOptions.md)\<`unknown`, `Error`, `unknown`, readonly ...[]\>[]\]
+ \| readonly \[\{ \[K in string \| number \| symbol\]: GetUseSuspenseQueryOptions\\]\> \}\]
+
+#### queryClient?
+
+`QueryClient`
+
+### Returns
+
+`TCombinedResult`
+
+## Call Signature
+
+```ts
+function useSuspenseQueries(options, queryClient?): TCombinedResult;
+```
+
+Defined in: packages/octane-query/src/useSuspenseQueries.ts:25
+
+### Type Parameters
+
+#### T
+
+`T` *extends* `any`[]
+
+#### TCombinedResult
+
+`TCombinedResult` = `T` *extends* \[\] ? \[\] : `T` *extends* \[`Head`\] ? \[`GetUseSuspenseQueryResult`\<`Head`\>\] : `T` *extends* \[`Head`, `...Tails[]`\] ? \[`...Tails[]`\] *extends* \[\] ? \[\] : \[`...Tails[]`\] *extends* \[`Head`\] ? \[`GetUseSuspenseQueryResult`\<`Head`\>, `GetUseSuspenseQueryResult`\<`Head`\>\] : \[`...Tails[]`\] *extends* \[`Head`, `...Tails[]`\] ? \[`...Tails[]`\] *extends* \[\] ? \[\] : \[`...Tails[]`\] *extends* \[`Head`\] ? \[`GetUseSuspenseQueryResult`\<`Head`\>, `GetUseSuspenseQueryResult`\<`Head`\>, `GetUseSuspenseQueryResult`\<`Head`\>\] : \[`...Tails[]`\] *extends* \[`Head`, `...Tails[]`\] ? \[`...(...)[]`\] *extends* \[\] ? \[\] : ... *extends* ... ? ... : ... : \[`...{ [K in (...)]: (...) }[]`\] : \[...\{ \[K in string \| number \| symbol\]: GetUseSuspenseQueryResult\\]\> \}\[\]\] : \{ \[K in string \| number \| symbol\]: GetUseSuspenseQueryResult\\]\> \}
+
+### Parameters
+
+#### options
+
+##### combine?
+
+(`result`) => `TCombinedResult`
+
+##### queries
+
+readonly \[`T` *extends* \[\] ? \[\] : `T` *extends* \[`Head`\] ? \[`GetUseSuspenseQueryOptions`\<`Head`\>\] : `T` *extends* \[`Head`, `...Tails[]`\] ? \[`...Tails[]`\] *extends* \[\] ? \[\] : \[`...Tails[]`\] *extends* \[`Head`\] ? \[`GetUseSuspenseQueryOptions`\<`Head`\>, `GetUseSuspenseQueryOptions`\<`Head`\>\] : \[`...Tails[]`\] *extends* \[`Head`, `...Tails[]`\] ? \[`...Tails[]`\] *extends* \[\] ? \[\] : \[`...(...)[]`\] *extends* \[...\] ? \[..., ..., ...\] : ... *extends* ... ? ... : ... : `unknown`[] *extends* \[`...Tails[]`\] ? \[`...Tails[]`\] : \[`...(...)[]`\] *extends* ...[] ? ...[] : ...[] : `unknown`[] *extends* `T` ? `T` : `T` *extends* [`UseSuspenseQueryOptions`](../interfaces/UseSuspenseQueryOptions.md)\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`\>[] ? [`UseSuspenseQueryOptions`](../interfaces/UseSuspenseQueryOptions.md)\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`\>[] : [`UseSuspenseQueryOptions`](../interfaces/UseSuspenseQueryOptions.md)\<`unknown`, `Error`, `unknown`, readonly `unknown`[]\>[]\]
+
+#### queryClient?
+
+`QueryClient`
+
+### Returns
+
+`TCombinedResult`
diff --git a/docs/framework/octane/reference/functions/useSuspenseQuery.md b/docs/framework/octane/reference/functions/useSuspenseQuery.md
new file mode 100644
index 00000000000..5a331e24bf2
--- /dev/null
+++ b/docs/framework/octane/reference/functions/useSuspenseQuery.md
@@ -0,0 +1,44 @@
+---
+id: useSuspenseQuery
+title: useSuspenseQuery
+---
+
+# Function: useSuspenseQuery()
+
+```ts
+function useSuspenseQuery(options, queryClient?): UseSuspenseQueryResult;
+```
+
+Defined in: packages/octane-query/src/useSuspenseQuery.ts:25
+
+## Type Parameters
+
+### TQueryFnData
+
+`TQueryFnData` = `unknown`
+
+### TError
+
+`TError` = `Error`
+
+### TData
+
+`TData` = `TQueryFnData`
+
+### TQueryKey
+
+`TQueryKey` *extends* readonly `unknown`[] = readonly `unknown`[]
+
+## Parameters
+
+### options
+
+[`UseSuspenseQueryOptions`](../interfaces/UseSuspenseQueryOptions.md)\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`\>
+
+### queryClient?
+
+`QueryClient`
+
+## Returns
+
+[`UseSuspenseQueryResult`](../type-aliases/UseSuspenseQueryResult.md)\<`TData`, `TError`\>
diff --git a/docs/framework/octane/reference/index.md b/docs/framework/octane/reference/index.md
new file mode 100644
index 00000000000..c7aea70c1cc
--- /dev/null
+++ b/docs/framework/octane/reference/index.md
@@ -0,0 +1,83 @@
+---
+id: "@tanstack/octane-query"
+title: "@tanstack/octane-query"
+---
+
+# @tanstack/octane-query
+
+## Interfaces
+
+- [HydrationBoundaryProps](interfaces/HydrationBoundaryProps.md)
+- [QueryClientProviderProps](interfaces/QueryClientProviderProps.md)
+- [QueryErrorResetBoundaryProps](interfaces/QueryErrorResetBoundaryProps.md)
+- [QueryErrorResetBoundaryValue](interfaces/QueryErrorResetBoundaryValue.md)
+- [UseBaseQueryOptions](interfaces/UseBaseQueryOptions.md)
+- [UseInfiniteQueryOptions](interfaces/UseInfiniteQueryOptions.md)
+- [UseMutationOptions](interfaces/UseMutationOptions.md)
+- [UsePrefetchQueryOptions](interfaces/UsePrefetchQueryOptions.md)
+- [UseQueryOptions](interfaces/UseQueryOptions.md)
+- [UseSuspenseInfiniteQueryOptions](interfaces/UseSuspenseInfiniteQueryOptions.md)
+- [UseSuspenseQueryOptions](interfaces/UseSuspenseQueryOptions.md)
+
+## Type Aliases
+
+- [AnyUseBaseQueryOptions](type-aliases/AnyUseBaseQueryOptions.md)
+- [AnyUseInfiniteQueryOptions](type-aliases/AnyUseInfiniteQueryOptions.md)
+- [AnyUseMutationOptions](type-aliases/AnyUseMutationOptions.md)
+- [AnyUseQueryOptions](type-aliases/AnyUseQueryOptions.md)
+- [AnyUseSuspenseInfiniteQueryOptions](type-aliases/AnyUseSuspenseInfiniteQueryOptions.md)
+- [AnyUseSuspenseQueryOptions](type-aliases/AnyUseSuspenseQueryOptions.md)
+- [DefinedInitialDataInfiniteOptions](type-aliases/DefinedInitialDataInfiniteOptions.md)
+- [DefinedInitialDataOptions](type-aliases/DefinedInitialDataOptions.md)
+- [DefinedUseInfiniteQueryResult](type-aliases/DefinedUseInfiniteQueryResult.md)
+- [DefinedUseQueryResult](type-aliases/DefinedUseQueryResult.md)
+- [QueriesOptions](type-aliases/QueriesOptions.md)
+- [QueriesResults](type-aliases/QueriesResults.md)
+- [QueryErrorClearResetFunction](type-aliases/QueryErrorClearResetFunction.md)
+- [QueryErrorIsResetFunction](type-aliases/QueryErrorIsResetFunction.md)
+- [QueryErrorResetBoundaryFunction](type-aliases/QueryErrorResetBoundaryFunction.md)
+- [QueryErrorResetFunction](type-aliases/QueryErrorResetFunction.md)
+- [SuspenseQueriesOptions](type-aliases/SuspenseQueriesOptions.md)
+- [SuspenseQueriesResults](type-aliases/SuspenseQueriesResults.md)
+- [UndefinedInitialDataInfiniteOptions](type-aliases/UndefinedInitialDataInfiniteOptions.md)
+- [UndefinedInitialDataOptions](type-aliases/UndefinedInitialDataOptions.md)
+- [UnusedSkipTokenInfiniteOptions](type-aliases/UnusedSkipTokenInfiniteOptions.md)
+- [UnusedSkipTokenOptions](type-aliases/UnusedSkipTokenOptions.md)
+- [UseBaseMutationResult](type-aliases/UseBaseMutationResult.md)
+- [UseBaseQueryResult](type-aliases/UseBaseQueryResult.md)
+- [UseInfiniteQueryResult](type-aliases/UseInfiniteQueryResult.md)
+- [UseMutateAsyncFunction](type-aliases/UseMutateAsyncFunction.md)
+- [UseMutateFunction](type-aliases/UseMutateFunction.md)
+- [UseMutationResult](type-aliases/UseMutationResult.md)
+- [UseQueryResult](type-aliases/UseQueryResult.md)
+- [UseSuspenseInfiniteQueryResult](type-aliases/UseSuspenseInfiniteQueryResult.md)
+- [UseSuspenseQueryResult](type-aliases/UseSuspenseQueryResult.md)
+
+## Variables
+
+- [HydrationBoundary](variables/HydrationBoundary.md)
+- [IsRestoringProvider](variables/IsRestoringProvider.md)
+- [QueryClientContext](variables/QueryClientContext.md)
+- [QueryClientProvider](variables/QueryClientProvider.md)
+- [QueryErrorResetBoundary](variables/QueryErrorResetBoundary.md)
+
+## Functions
+
+- [infiniteQueryOptions](functions/infiniteQueryOptions.md)
+- [mutationOptions](functions/mutationOptions.md)
+- [queryOptions](functions/queryOptions.md)
+- [useInfiniteQuery](functions/useInfiniteQuery.md)
+- [useIsFetching](functions/useIsFetching.md)
+- [useIsMutating](functions/useIsMutating.md)
+- [useIsRestoring](functions/useIsRestoring.md)
+- [useMutation](functions/useMutation.md)
+- [useMutationState](functions/useMutationState.md)
+- [usePrefetchInfiniteQuery](functions/usePrefetchInfiniteQuery.md)
+- [usePrefetchQuery](functions/usePrefetchQuery.md)
+- [useQueries](functions/useQueries.md)
+- [useQuery](functions/useQuery.md)
+- [useQueryClient](functions/useQueryClient.md)
+- [useQueryErrorResetBoundary](functions/useQueryErrorResetBoundary.md)
+- [useSuspenseInfiniteQuery](functions/useSuspenseInfiniteQuery.md)
+- [useSuspenseQueries](functions/useSuspenseQueries.md)
+- [useSuspenseQuery](functions/useSuspenseQuery.md)
diff --git a/docs/framework/octane/reference/interfaces/HydrationBoundaryProps.md b/docs/framework/octane/reference/interfaces/HydrationBoundaryProps.md
new file mode 100644
index 00000000000..f2f764d0817
--- /dev/null
+++ b/docs/framework/octane/reference/interfaces/HydrationBoundaryProps.md
@@ -0,0 +1,57 @@
+---
+id: HydrationBoundaryProps
+title: HydrationBoundaryProps
+---
+
+# Interface: HydrationBoundaryProps
+
+Defined in: packages/octane-query/src/types.ts:260
+
+## Properties
+
+### children?
+
+```ts
+optional children: unknown;
+```
+
+Defined in: packages/octane-query/src/types.ts:268
+
+***
+
+### options?
+
+```ts
+optional options: OmitKeyof & object;
+```
+
+Defined in: packages/octane-query/src/types.ts:262
+
+#### Type Declaration
+
+##### defaultOptions?
+
+```ts
+optional defaultOptions: OmitKeyof<{
+}, "mutations">;
+```
+
+***
+
+### queryClient?
+
+```ts
+optional queryClient: QueryClient;
+```
+
+Defined in: packages/octane-query/src/types.ts:269
+
+***
+
+### state
+
+```ts
+state: DehydratedState | null | undefined;
+```
+
+Defined in: packages/octane-query/src/types.ts:261
diff --git a/docs/framework/octane/reference/interfaces/QueryClientProviderProps.md b/docs/framework/octane/reference/interfaces/QueryClientProviderProps.md
new file mode 100644
index 00000000000..347f11548f9
--- /dev/null
+++ b/docs/framework/octane/reference/interfaces/QueryClientProviderProps.md
@@ -0,0 +1,28 @@
+---
+id: QueryClientProviderProps
+title: QueryClientProviderProps
+---
+
+# Interface: QueryClientProviderProps
+
+Defined in: packages/octane-query/src/types.ts:255
+
+## Properties
+
+### children?
+
+```ts
+optional children: unknown;
+```
+
+Defined in: packages/octane-query/src/types.ts:257
+
+***
+
+### client
+
+```ts
+client: QueryClient;
+```
+
+Defined in: packages/octane-query/src/types.ts:256
diff --git a/docs/framework/octane/reference/interfaces/QueryErrorResetBoundaryProps.md b/docs/framework/octane/reference/interfaces/QueryErrorResetBoundaryProps.md
new file mode 100644
index 00000000000..947e7d3beea
--- /dev/null
+++ b/docs/framework/octane/reference/interfaces/QueryErrorResetBoundaryProps.md
@@ -0,0 +1,18 @@
+---
+id: QueryErrorResetBoundaryProps
+title: QueryErrorResetBoundaryProps
+---
+
+# Interface: QueryErrorResetBoundaryProps
+
+Defined in: packages/octane-query/src/types.ts:286
+
+## Properties
+
+### children
+
+```ts
+children: unknown;
+```
+
+Defined in: packages/octane-query/src/types.ts:287
diff --git a/docs/framework/octane/reference/interfaces/QueryErrorResetBoundaryValue.md b/docs/framework/octane/reference/interfaces/QueryErrorResetBoundaryValue.md
new file mode 100644
index 00000000000..b4bcc8edfed
--- /dev/null
+++ b/docs/framework/octane/reference/interfaces/QueryErrorResetBoundaryValue.md
@@ -0,0 +1,38 @@
+---
+id: QueryErrorResetBoundaryValue
+title: QueryErrorResetBoundaryValue
+---
+
+# Interface: QueryErrorResetBoundaryValue
+
+Defined in: packages/octane-query/src/types.ts:276
+
+## Properties
+
+### clearReset
+
+```ts
+clearReset: QueryErrorClearResetFunction;
+```
+
+Defined in: packages/octane-query/src/types.ts:277
+
+***
+
+### isReset
+
+```ts
+isReset: QueryErrorIsResetFunction;
+```
+
+Defined in: packages/octane-query/src/types.ts:278
+
+***
+
+### reset
+
+```ts
+reset: QueryErrorResetFunction;
+```
+
+Defined in: packages/octane-query/src/types.ts:279
diff --git a/docs/framework/octane/reference/interfaces/UseBaseQueryOptions.md b/docs/framework/octane/reference/interfaces/UseBaseQueryOptions.md
new file mode 100644
index 00000000000..b5014943599
--- /dev/null
+++ b/docs/framework/octane/reference/interfaces/UseBaseQueryOptions.md
@@ -0,0 +1,47 @@
+---
+id: UseBaseQueryOptions
+title: UseBaseQueryOptions
+---
+
+# Interface: UseBaseQueryOptions\
+
+Defined in: packages/octane-query/src/types.ts:34
+
+## Extends
+
+- `QueryObserverOptions`\<`TQueryFnData`, `TError`, `TData`, `TQueryData`, `TQueryKey`\>
+
+## Type Parameters
+
+### TQueryFnData
+
+`TQueryFnData` = `unknown`
+
+### TError
+
+`TError` = `DefaultError`
+
+### TData
+
+`TData` = `TQueryFnData`
+
+### TQueryData
+
+`TQueryData` = `TQueryFnData`
+
+### TQueryKey
+
+`TQueryKey` *extends* `QueryKey` = `QueryKey`
+
+## Properties
+
+### subscribed?
+
+```ts
+optional subscribed: boolean;
+```
+
+Defined in: packages/octane-query/src/types.ts:51
+
+Set this to `false` to unsubscribe this observer from updates to the query cache.
+Defaults to `true`.
diff --git a/docs/framework/octane/reference/interfaces/UseInfiniteQueryOptions.md b/docs/framework/octane/reference/interfaces/UseInfiniteQueryOptions.md
new file mode 100644
index 00000000000..718e35ca379
--- /dev/null
+++ b/docs/framework/octane/reference/interfaces/UseInfiniteQueryOptions.md
@@ -0,0 +1,47 @@
+---
+id: UseInfiniteQueryOptions
+title: UseInfiniteQueryOptions
+---
+
+# Interface: UseInfiniteQueryOptions\
+
+Defined in: packages/octane-query/src/types.ts:108
+
+## Extends
+
+- `OmitKeyof`\<`InfiniteQueryObserverOptions`\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`, `TPageParam`\>, `"suspense"`\>
+
+## Type Parameters
+
+### TQueryFnData
+
+`TQueryFnData` = `unknown`
+
+### TError
+
+`TError` = `DefaultError`
+
+### TData
+
+`TData` = `TQueryFnData`
+
+### TQueryKey
+
+`TQueryKey` *extends* `QueryKey` = `QueryKey`
+
+### TPageParam
+
+`TPageParam` = `unknown`
+
+## Properties
+
+### subscribed?
+
+```ts
+optional subscribed: boolean;
+```
+
+Defined in: packages/octane-query/src/types.ts:128
+
+Set this to `false` to unsubscribe this observer from updates to the query cache.
+Defaults to `true`.
diff --git a/docs/framework/octane/reference/interfaces/UseMutationOptions.md b/docs/framework/octane/reference/interfaces/UseMutationOptions.md
new file mode 100644
index 00000000000..c7f48c2ce86
--- /dev/null
+++ b/docs/framework/octane/reference/interfaces/UseMutationOptions.md
@@ -0,0 +1,30 @@
+---
+id: UseMutationOptions
+title: UseMutationOptions
+---
+
+# Interface: UseMutationOptions\
+
+Defined in: packages/octane-query/src/types.ts:197
+
+## Extends
+
+- `OmitKeyof`\<`MutationObserverOptions`\<`TData`, `TError`, `TVariables`, `TOnMutateResult`\>, `"_defaulted"`\>
+
+## Type Parameters
+
+### TData
+
+`TData` = `unknown`
+
+### TError
+
+`TError` = `DefaultError`
+
+### TVariables
+
+`TVariables` = `void`
+
+### TOnMutateResult
+
+`TOnMutateResult` = `unknown`
diff --git a/docs/framework/octane/reference/interfaces/UsePrefetchQueryOptions.md b/docs/framework/octane/reference/interfaces/UsePrefetchQueryOptions.md
new file mode 100644
index 00000000000..6d669e6cef1
--- /dev/null
+++ b/docs/framework/octane/reference/interfaces/UsePrefetchQueryOptions.md
@@ -0,0 +1,40 @@
+---
+id: UsePrefetchQueryOptions
+title: UsePrefetchQueryOptions
+---
+
+# Interface: UsePrefetchQueryOptions\
+
+Defined in: packages/octane-query/src/types.ts:54
+
+## Extends
+
+- `OmitKeyof`\<`FetchQueryOptions`\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`\>, `"queryFn"`\>
+
+## Type Parameters
+
+### TQueryFnData
+
+`TQueryFnData` = `unknown`
+
+### TError
+
+`TError` = `DefaultError`
+
+### TData
+
+`TData` = `TQueryFnData`
+
+### TQueryKey
+
+`TQueryKey` *extends* `QueryKey` = `QueryKey`
+
+## Properties
+
+### queryFn?
+
+```ts
+optional queryFn: QueryFunction;
+```
+
+Defined in: packages/octane-query/src/types.ts:63
diff --git a/docs/framework/octane/reference/interfaces/UseQueryOptions.md b/docs/framework/octane/reference/interfaces/UseQueryOptions.md
new file mode 100644
index 00000000000..cdd1d84918e
--- /dev/null
+++ b/docs/framework/octane/reference/interfaces/UseQueryOptions.md
@@ -0,0 +1,49 @@
+---
+id: UseQueryOptions
+title: UseQueryOptions
+---
+
+# Interface: UseQueryOptions\
+
+Defined in: packages/octane-query/src/types.ts:70
+
+## Extends
+
+- `OmitKeyof`\<[`UseBaseQueryOptions`](UseBaseQueryOptions.md)\<`TQueryFnData`, `TError`, `TData`, `TQueryFnData`, `TQueryKey`\>, `"suspense"`\>
+
+## Type Parameters
+
+### TQueryFnData
+
+`TQueryFnData` = `unknown`
+
+### TError
+
+`TError` = `DefaultError`
+
+### TData
+
+`TData` = `TQueryFnData`
+
+### TQueryKey
+
+`TQueryKey` *extends* `QueryKey` = `QueryKey`
+
+## Properties
+
+### subscribed?
+
+```ts
+optional subscribed: boolean;
+```
+
+Defined in: packages/octane-query/src/types.ts:51
+
+Set this to `false` to unsubscribe this observer from updates to the query cache.
+Defaults to `true`.
+
+#### Inherited from
+
+```ts
+OmitKeyof.subscribed
+```
diff --git a/docs/framework/octane/reference/interfaces/UseSuspenseInfiniteQueryOptions.md b/docs/framework/octane/reference/interfaces/UseSuspenseInfiniteQueryOptions.md
new file mode 100644
index 00000000000..0988ad117e8
--- /dev/null
+++ b/docs/framework/octane/reference/interfaces/UseSuspenseInfiniteQueryOptions.md
@@ -0,0 +1,63 @@
+---
+id: UseSuspenseInfiniteQueryOptions
+title: UseSuspenseInfiniteQueryOptions
+---
+
+# Interface: UseSuspenseInfiniteQueryOptions\
+
+Defined in: packages/octane-query/src/types.ts:133
+
+## Extends
+
+- `OmitKeyof`\<[`UseInfiniteQueryOptions`](UseInfiniteQueryOptions.md)\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`, `TPageParam`\>, `"queryFn"` \| `"enabled"` \| `"throwOnError"` \| `"placeholderData"`\>
+
+## Type Parameters
+
+### TQueryFnData
+
+`TQueryFnData` = `unknown`
+
+### TError
+
+`TError` = `DefaultError`
+
+### TData
+
+`TData` = `TQueryFnData`
+
+### TQueryKey
+
+`TQueryKey` *extends* `QueryKey` = `QueryKey`
+
+### TPageParam
+
+`TPageParam` = `unknown`
+
+## Properties
+
+### queryFn?
+
+```ts
+optional queryFn: QueryFunction;
+```
+
+Defined in: packages/octane-query/src/types.ts:143
+
+***
+
+### subscribed?
+
+```ts
+optional subscribed: boolean;
+```
+
+Defined in: packages/octane-query/src/types.ts:128
+
+Set this to `false` to unsubscribe this observer from updates to the query cache.
+Defaults to `true`.
+
+#### Inherited from
+
+```ts
+OmitKeyof.subscribed
+```
diff --git a/docs/framework/octane/reference/interfaces/UseSuspenseQueryOptions.md b/docs/framework/octane/reference/interfaces/UseSuspenseQueryOptions.md
new file mode 100644
index 00000000000..ba692b0845c
--- /dev/null
+++ b/docs/framework/octane/reference/interfaces/UseSuspenseQueryOptions.md
@@ -0,0 +1,59 @@
+---
+id: UseSuspenseQueryOptions
+title: UseSuspenseQueryOptions
+---
+
+# Interface: UseSuspenseQueryOptions\
+
+Defined in: packages/octane-query/src/types.ts:86
+
+## Extends
+
+- `OmitKeyof`\<[`UseQueryOptions`](UseQueryOptions.md)\<`TQueryFnData`, `TError`, `TData`, `TQueryKey`\>, `"queryFn"` \| `"enabled"` \| `"throwOnError"` \| `"placeholderData"`\>
+
+## Type Parameters
+
+### TQueryFnData
+
+`TQueryFnData` = `unknown`
+
+### TError
+
+`TError` = `DefaultError`
+
+### TData
+
+`TData` = `TQueryFnData`
+
+### TQueryKey
+
+`TQueryKey` *extends* `QueryKey` = `QueryKey`
+
+## Properties
+
+### queryFn?
+
+```ts
+optional queryFn: QueryFunction;
+```
+
+Defined in: packages/octane-query/src/types.ts:95
+
+***
+
+### subscribed?
+
+```ts
+optional subscribed: boolean;
+```
+
+Defined in: packages/octane-query/src/types.ts:51
+
+Set this to `false` to unsubscribe this observer from updates to the query cache.
+Defaults to `true`.
+
+#### Inherited from
+
+```ts
+OmitKeyof.subscribed
+```
diff --git a/docs/framework/octane/reference/type-aliases/AnyUseBaseQueryOptions.md b/docs/framework/octane/reference/type-aliases/AnyUseBaseQueryOptions.md
new file mode 100644
index 00000000000..60a06d14f5c
--- /dev/null
+++ b/docs/framework/octane/reference/type-aliases/AnyUseBaseQueryOptions.md
@@ -0,0 +1,12 @@
+---
+id: AnyUseBaseQueryOptions
+title: AnyUseBaseQueryOptions
+---
+
+# Type Alias: AnyUseBaseQueryOptions
+
+```ts
+type AnyUseBaseQueryOptions = UseBaseQueryOptions;
+```
+
+Defined in: packages/octane-query/src/types.ts:27
diff --git a/docs/framework/octane/reference/type-aliases/AnyUseInfiniteQueryOptions.md b/docs/framework/octane/reference/type-aliases/AnyUseInfiniteQueryOptions.md
new file mode 100644
index 00000000000..4898cc0f069
--- /dev/null
+++ b/docs/framework/octane/reference/type-aliases/AnyUseInfiniteQueryOptions.md
@@ -0,0 +1,12 @@
+---
+id: AnyUseInfiniteQueryOptions
+title: AnyUseInfiniteQueryOptions
+---
+
+# Type Alias: AnyUseInfiniteQueryOptions
+
+```ts
+type AnyUseInfiniteQueryOptions = UseInfiniteQueryOptions;
+```
+
+Defined in: packages/octane-query/src/types.ts:101
diff --git a/docs/framework/octane/reference/type-aliases/AnyUseMutationOptions.md b/docs/framework/octane/reference/type-aliases/AnyUseMutationOptions.md
new file mode 100644
index 00000000000..e32b0001531
--- /dev/null
+++ b/docs/framework/octane/reference/type-aliases/AnyUseMutationOptions.md
@@ -0,0 +1,12 @@
+---
+id: AnyUseMutationOptions
+title: AnyUseMutationOptions
+---
+
+# Type Alias: AnyUseMutationOptions
+
+```ts
+type AnyUseMutationOptions = UseMutationOptions;
+```
+
+Defined in: packages/octane-query/src/types.ts:196
diff --git a/docs/framework/octane/reference/type-aliases/AnyUseQueryOptions.md b/docs/framework/octane/reference/type-aliases/AnyUseQueryOptions.md
new file mode 100644
index 00000000000..f4b2100c16b
--- /dev/null
+++ b/docs/framework/octane/reference/type-aliases/AnyUseQueryOptions.md
@@ -0,0 +1,12 @@
+---
+id: AnyUseQueryOptions
+title: AnyUseQueryOptions
+---
+
+# Type Alias: AnyUseQueryOptions
+
+```ts
+type AnyUseQueryOptions = UseQueryOptions;
+```
+
+Defined in: packages/octane-query/src/types.ts:69
diff --git a/docs/framework/octane/reference/type-aliases/AnyUseSuspenseInfiniteQueryOptions.md b/docs/framework/octane/reference/type-aliases/AnyUseSuspenseInfiniteQueryOptions.md
new file mode 100644
index 00000000000..7d8095797dd
--- /dev/null
+++ b/docs/framework/octane/reference/type-aliases/AnyUseSuspenseInfiniteQueryOptions.md
@@ -0,0 +1,12 @@
+---
+id: AnyUseSuspenseInfiniteQueryOptions
+title: AnyUseSuspenseInfiniteQueryOptions
+---
+
+# Type Alias: AnyUseSuspenseInfiniteQueryOptions
+
+```ts
+type AnyUseSuspenseInfiniteQueryOptions = UseSuspenseInfiniteQueryOptions;
+```
+
+Defined in: packages/octane-query/src/types.ts:131
diff --git a/docs/framework/octane/reference/type-aliases/AnyUseSuspenseQueryOptions.md b/docs/framework/octane/reference/type-aliases/AnyUseSuspenseQueryOptions.md
new file mode 100644
index 00000000000..da414c634b6
--- /dev/null
+++ b/docs/framework/octane/reference/type-aliases/AnyUseSuspenseQueryOptions.md
@@ -0,0 +1,12 @@
+---
+id: AnyUseSuspenseQueryOptions
+title: AnyUseSuspenseQueryOptions
+---
+
+# Type Alias: AnyUseSuspenseQueryOptions
+
+```ts
+type AnyUseSuspenseQueryOptions = UseSuspenseQueryOptions;
+```
+
+Defined in: packages/octane-query/src/types.ts:80
diff --git a/docs/framework/octane/reference/type-aliases/DefinedInitialDataInfiniteOptions.md b/docs/framework/octane/reference/type-aliases/DefinedInitialDataInfiniteOptions.md
new file mode 100644
index 00000000000..041dc3deaaf
--- /dev/null
+++ b/docs/framework/octane/reference/type-aliases/DefinedInitialDataInfiniteOptions.md
@@ -0,0 +1,45 @@
+---
+id: DefinedInitialDataInfiniteOptions
+title: DefinedInitialDataInfiniteOptions
+---
+
+# Type Alias: DefinedInitialDataInfiniteOptions\
+
+```ts
+type DefinedInitialDataInfiniteOptions = UseInfiniteQueryOptions & object;
+```
+
+Defined in: packages/octane-query/src/infiniteQueryOptions.ts:57
+
+## Type Declaration
+
+### initialData
+
+```ts
+initialData:
+ | NonUndefinedGuard>
+ | () => NonUndefinedGuard>
+ | undefined;
+```
+
+## Type Parameters
+
+### TQueryFnData
+
+`TQueryFnData`
+
+### TError
+
+`TError` = `DefaultError`
+
+### TData
+
+`TData` = `InfiniteData`\<`TQueryFnData`\>
+
+### TQueryKey
+
+`TQueryKey` *extends* `QueryKey` = `QueryKey`
+
+### TPageParam
+
+`TPageParam` = `unknown`
diff --git a/docs/framework/octane/reference/type-aliases/DefinedInitialDataOptions.md b/docs/framework/octane/reference/type-aliases/DefinedInitialDataOptions.md
new file mode 100644
index 00000000000..556f75939b2
--- /dev/null
+++ b/docs/framework/octane/reference/type-aliases/DefinedInitialDataOptions.md
@@ -0,0 +1,46 @@
+---
+id: DefinedInitialDataOptions
+title: DefinedInitialDataOptions
+---
+
+# Type Alias: DefinedInitialDataOptions\
+
+```ts
+type DefinedInitialDataOptions = Omit, "queryFn"> & object;
+```
+
+Defined in: packages/octane-query/src/queryOptions.ts:41
+
+## Type Declaration
+
+### initialData
+
+```ts
+initialData:
+ | NonUndefinedGuard
+| () => NonUndefinedGuard;
+```
+
+### queryFn?
+
+```ts
+optional queryFn: QueryFunction;
+```
+
+## Type Parameters
+
+### TQueryFnData
+
+`TQueryFnData` = `unknown`
+
+### TError
+
+`TError` = `DefaultError`
+
+### TData
+
+`TData` = `TQueryFnData`
+
+### TQueryKey
+
+`TQueryKey` *extends* `QueryKey` = `QueryKey`
diff --git a/docs/framework/octane/reference/type-aliases/DefinedUseInfiniteQueryResult.md b/docs/framework/octane/reference/type-aliases/DefinedUseInfiniteQueryResult.md
new file mode 100644
index 00000000000..49c4e0033fa
--- /dev/null
+++ b/docs/framework/octane/reference/type-aliases/DefinedUseInfiniteQueryResult.md
@@ -0,0 +1,22 @@
+---
+id: DefinedUseInfiniteQueryResult
+title: DefinedUseInfiniteQueryResult
+---
+
+# Type Alias: DefinedUseInfiniteQueryResult\
+
+```ts
+type DefinedUseInfiniteQueryResult = DefinedInfiniteQueryObserverResult;
+```
+
+Defined in: packages/octane-query/src/types.ts:183
+
+## Type Parameters
+
+### TData
+
+`TData` = `unknown`
+
+### TError
+
+`TError` = `DefaultError`
diff --git a/docs/framework/octane/reference/type-aliases/DefinedUseQueryResult.md b/docs/framework/octane/reference/type-aliases/DefinedUseQueryResult.md
new file mode 100644
index 00000000000..efcb72988c5
--- /dev/null
+++ b/docs/framework/octane/reference/type-aliases/DefinedUseQueryResult.md
@@ -0,0 +1,22 @@
+---
+id: DefinedUseQueryResult
+title: DefinedUseQueryResult
+---
+
+# Type Alias: DefinedUseQueryResult\
+
+```ts
+type DefinedUseQueryResult = DefinedQueryObserverResult;
+```
+
+Defined in: packages/octane-query/src/types.ts:173
+
+## Type Parameters
+
+### TData
+
+`TData` = `unknown`
+
+### TError
+
+`TError` = `DefaultError`
diff --git a/docs/framework/octane/reference/type-aliases/QueriesOptions.md b/docs/framework/octane/reference/type-aliases/QueriesOptions.md
new file mode 100644
index 00000000000..f5ef47df08e
--- /dev/null
+++ b/docs/framework/octane/reference/type-aliases/QueriesOptions.md
@@ -0,0 +1,28 @@
+---
+id: QueriesOptions
+title: QueriesOptions
+---
+
+# Type Alias: QueriesOptions\
+
+```ts
+type QueriesOptions = TDepth["length"] extends MAXIMUM_DEPTH ? UseQueryOptionsForUseQueries[] : T extends [] ? [] : T extends [infer Head] ? [...TResults, GetUseQueryOptionsForUseQueries] : T extends [infer Head, ...(infer Tails)] ? QueriesOptions<[...Tails], [...TResults, GetUseQueryOptionsForUseQueries], [...TDepth, 1]> : ReadonlyArray extends T ? T : T extends UseQueryOptionsForUseQueries[] ? UseQueryOptionsForUseQueries[] : UseQueryOptionsForUseQueries[];
+```
+
+Defined in: packages/octane-query/src/queries-types.ts:126
+
+QueriesOptions reducer recursively unwraps function arguments to infer/enforce type param
+
+## Type Parameters
+
+### T
+
+`T` *extends* `any`[]
+
+### TResults
+
+`TResults` *extends* `any`[] = \[\]
+
+### TDepth
+
+`TDepth` *extends* `ReadonlyArray`\<`number`\> = \[\]
diff --git a/docs/framework/octane/reference/type-aliases/QueriesResults.md b/docs/framework/octane/reference/type-aliases/QueriesResults.md
new file mode 100644
index 00000000000..ac721e440ab
--- /dev/null
+++ b/docs/framework/octane/reference/type-aliases/QueriesResults.md
@@ -0,0 +1,28 @@
+---
+id: QueriesResults
+title: QueriesResults
+---
+
+# Type Alias: QueriesResults\
+
+```ts
+type QueriesResults = TDepth["length"] extends MAXIMUM_DEPTH ? UseQueryResult[] : T extends [] ? [] : T extends [infer Head] ? [...TResults, GetUseQueryResult] : T extends [infer Head, ...(infer Tails)] ? QueriesResults<[...Tails], [...TResults, GetUseQueryResult], [...TDepth, 1]> : { [K in keyof T]: GetUseQueryResult };
+```
+
+Defined in: packages/octane-query/src/queries-types.ts:168
+
+QueriesResults reducer recursively maps type param to results
+
+## Type Parameters
+
+### T
+
+`T` *extends* `any`[]
+
+### TResults
+
+`TResults` *extends* `any`[] = \[\]
+
+### TDepth
+
+`TDepth` *extends* `ReadonlyArray`\<`number`\> = \[\]
diff --git a/docs/framework/octane/reference/type-aliases/QueryErrorClearResetFunction.md b/docs/framework/octane/reference/type-aliases/QueryErrorClearResetFunction.md
new file mode 100644
index 00000000000..565c62765d0
--- /dev/null
+++ b/docs/framework/octane/reference/type-aliases/QueryErrorClearResetFunction.md
@@ -0,0 +1,16 @@
+---
+id: QueryErrorClearResetFunction
+title: QueryErrorClearResetFunction
+---
+
+# Type Alias: QueryErrorClearResetFunction()
+
+```ts
+type QueryErrorClearResetFunction = () => void;
+```
+
+Defined in: packages/octane-query/src/types.ts:274
+
+## Returns
+
+`void`
diff --git a/docs/framework/octane/reference/type-aliases/QueryErrorIsResetFunction.md b/docs/framework/octane/reference/type-aliases/QueryErrorIsResetFunction.md
new file mode 100644
index 00000000000..2ee160af3e3
--- /dev/null
+++ b/docs/framework/octane/reference/type-aliases/QueryErrorIsResetFunction.md
@@ -0,0 +1,16 @@
+---
+id: QueryErrorIsResetFunction
+title: QueryErrorIsResetFunction
+---
+
+# Type Alias: QueryErrorIsResetFunction()
+
+```ts
+type QueryErrorIsResetFunction = () => boolean;
+```
+
+Defined in: packages/octane-query/src/types.ts:273
+
+## Returns
+
+`boolean`
diff --git a/docs/framework/octane/reference/type-aliases/QueryErrorResetBoundaryFunction.md b/docs/framework/octane/reference/type-aliases/QueryErrorResetBoundaryFunction.md
new file mode 100644
index 00000000000..3ee99074fb7
--- /dev/null
+++ b/docs/framework/octane/reference/type-aliases/QueryErrorResetBoundaryFunction.md
@@ -0,0 +1,22 @@
+---
+id: QueryErrorResetBoundaryFunction
+title: QueryErrorResetBoundaryFunction
+---
+
+# Type Alias: QueryErrorResetBoundaryFunction()
+
+```ts
+type QueryErrorResetBoundaryFunction = (value) => unknown;
+```
+
+Defined in: packages/octane-query/src/types.ts:282
+
+## Parameters
+
+### value
+
+[`QueryErrorResetBoundaryValue`](../interfaces/QueryErrorResetBoundaryValue.md)
+
+## Returns
+
+`unknown`
diff --git a/docs/framework/octane/reference/type-aliases/QueryErrorResetFunction.md b/docs/framework/octane/reference/type-aliases/QueryErrorResetFunction.md
new file mode 100644
index 00000000000..be4e4f96a87
--- /dev/null
+++ b/docs/framework/octane/reference/type-aliases/QueryErrorResetFunction.md
@@ -0,0 +1,16 @@
+---
+id: QueryErrorResetFunction
+title: QueryErrorResetFunction
+---
+
+# Type Alias: QueryErrorResetFunction()
+
+```ts
+type QueryErrorResetFunction = () => void;
+```
+
+Defined in: packages/octane-query/src/types.ts:272
+
+## Returns
+
+`void`
diff --git a/docs/framework/octane/reference/type-aliases/SuspenseQueriesOptions.md b/docs/framework/octane/reference/type-aliases/SuspenseQueriesOptions.md
new file mode 100644
index 00000000000..acd37543813
--- /dev/null
+++ b/docs/framework/octane/reference/type-aliases/SuspenseQueriesOptions.md
@@ -0,0 +1,28 @@
+---
+id: SuspenseQueriesOptions
+title: SuspenseQueriesOptions
+---
+
+# Type Alias: SuspenseQueriesOptions\
+
+```ts
+type SuspenseQueriesOptions = TDepth["length"] extends MAXIMUM_DEPTH ? UseSuspenseQueryOptions[] : T extends [] ? [] : T extends [infer Head] ? [...TResults, GetUseSuspenseQueryOptions] : T extends [infer Head, ...(infer Tails)] ? SuspenseQueriesOptions<[...Tails], [...TResults, GetUseSuspenseQueryOptions], [...TDepth, 1]> : unknown[] extends T ? T : T extends UseSuspenseQueryOptions[] ? UseSuspenseQueryOptions[] : UseSuspenseQueryOptions[];
+```
+
+Defined in: packages/octane-query/src/suspense-queries-types.ts:108
+
+SuspenseQueriesOptions reducer recursively unwraps function arguments to infer/enforce type param
+
+## Type Parameters
+
+### T
+
+`T` *extends* `any`[]
+
+### TResults
+
+`TResults` *extends* `any`[] = \[\]
+
+### TDepth
+
+`TDepth` *extends* `ReadonlyArray`\<`number`\> = \[\]
diff --git a/docs/framework/octane/reference/type-aliases/SuspenseQueriesResults.md b/docs/framework/octane/reference/type-aliases/SuspenseQueriesResults.md
new file mode 100644
index 00000000000..6681e596544
--- /dev/null
+++ b/docs/framework/octane/reference/type-aliases/SuspenseQueriesResults.md
@@ -0,0 +1,28 @@
+---
+id: SuspenseQueriesResults
+title: SuspenseQueriesResults
+---
+
+# Type Alias: SuspenseQueriesResults\
+
+```ts
+type SuspenseQueriesResults = TDepth["length"] extends MAXIMUM_DEPTH ? UseSuspenseQueryResult[] : T extends [] ? [] : T extends [infer Head] ? [...TResults, GetUseSuspenseQueryResult] : T extends [infer Head, ...(infer Tails)] ? SuspenseQueriesResults<[...Tails], [...TResults, GetUseSuspenseQueryResult], [...TDepth, 1]> : { [K in keyof T]: GetUseSuspenseQueryResult };
+```
+
+Defined in: packages/octane-query/src/suspense-queries-types.ts:145
+
+SuspenseQueriesResults reducer recursively maps type param to results
+
+## Type Parameters
+
+### T
+
+`T` *extends* `any`[]
+
+### TResults
+
+`TResults` *extends* `any`[] = \[\]
+
+### TDepth
+
+`TDepth` *extends* `ReadonlyArray`\<`number`\> = \[\]
diff --git a/docs/framework/octane/reference/type-aliases/UndefinedInitialDataInfiniteOptions.md b/docs/framework/octane/reference/type-aliases/UndefinedInitialDataInfiniteOptions.md
new file mode 100644
index 00000000000..32a19efaa97
--- /dev/null
+++ b/docs/framework/octane/reference/type-aliases/UndefinedInitialDataInfiniteOptions.md
@@ -0,0 +1,44 @@
+---
+id: UndefinedInitialDataInfiniteOptions
+title: UndefinedInitialDataInfiniteOptions
+---
+
+# Type Alias: UndefinedInitialDataInfiniteOptions\
+
+```ts
+type UndefinedInitialDataInfiniteOptions = UseInfiniteQueryOptions & object;
+```
+
+Defined in: packages/octane-query/src/infiniteQueryOptions.ts:14
+
+## Type Declaration
+
+### initialData?
+
+```ts
+optional initialData:
+ | NonUndefinedGuard>
+| InitialDataFunction>>;
+```
+
+## Type Parameters
+
+### TQueryFnData
+
+`TQueryFnData`
+
+### TError
+
+`TError` = `DefaultError`
+
+### TData
+
+`TData` = `InfiniteData`\<`TQueryFnData`\>
+
+### TQueryKey
+
+`TQueryKey` *extends* `QueryKey` = `QueryKey`
+
+### TPageParam
+
+`TPageParam` = `unknown`
diff --git a/docs/framework/octane/reference/type-aliases/UndefinedInitialDataOptions.md b/docs/framework/octane/reference/type-aliases/UndefinedInitialDataOptions.md
new file mode 100644
index 00000000000..53a2e3d2c24
--- /dev/null
+++ b/docs/framework/octane/reference/type-aliases/UndefinedInitialDataOptions.md
@@ -0,0 +1,40 @@
+---
+id: UndefinedInitialDataOptions
+title: UndefinedInitialDataOptions
+---
+
+# Type Alias: UndefinedInitialDataOptions\
+
+```ts
+type UndefinedInitialDataOptions = UseQueryOptions & object;
+```
+
+Defined in: packages/octane-query/src/queryOptions.ts:14
+
+## Type Declaration
+
+### initialData?
+
+```ts
+optional initialData:
+ | InitialDataFunction>
+| NonUndefinedGuard;
+```
+
+## Type Parameters
+
+### TQueryFnData
+
+`TQueryFnData` = `unknown`
+
+### TError
+
+`TError` = `DefaultError`
+
+### TData
+
+`TData` = `TQueryFnData`
+
+### TQueryKey
+
+`TQueryKey` *extends* `QueryKey` = `QueryKey`
diff --git a/docs/framework/octane/reference/type-aliases/UnusedSkipTokenInfiniteOptions.md b/docs/framework/octane/reference/type-aliases/UnusedSkipTokenInfiniteOptions.md
new file mode 100644
index 00000000000..36083495628
--- /dev/null
+++ b/docs/framework/octane/reference/type-aliases/UnusedSkipTokenInfiniteOptions.md
@@ -0,0 +1,42 @@
+---
+id: UnusedSkipTokenInfiniteOptions
+title: UnusedSkipTokenInfiniteOptions
+---
+
+# Type Alias: UnusedSkipTokenInfiniteOptions\
+
+```ts
+type UnusedSkipTokenInfiniteOptions = OmitKeyof, "queryFn"> & object;
+```
+
+Defined in: packages/octane-query/src/infiniteQueryOptions.ts:35
+
+## Type Declaration
+
+### queryFn?
+
+```ts
+optional queryFn: Exclude["queryFn"], SkipToken | undefined>;
+```
+
+## Type Parameters
+
+### TQueryFnData
+
+`TQueryFnData`
+
+### TError
+
+`TError` = `DefaultError`
+
+### TData
+
+`TData` = `InfiniteData`\<`TQueryFnData`\>
+
+### TQueryKey
+
+`TQueryKey` *extends* `QueryKey` = `QueryKey`
+
+### TPageParam
+
+`TPageParam` = `unknown`
diff --git a/docs/framework/octane/reference/type-aliases/UnusedSkipTokenOptions.md b/docs/framework/octane/reference/type-aliases/UnusedSkipTokenOptions.md
new file mode 100644
index 00000000000..1e490ada1f5
--- /dev/null
+++ b/docs/framework/octane/reference/type-aliases/UnusedSkipTokenOptions.md
@@ -0,0 +1,38 @@
+---
+id: UnusedSkipTokenOptions
+title: UnusedSkipTokenOptions
+---
+
+# Type Alias: UnusedSkipTokenOptions\
+
+```ts
+type UnusedSkipTokenOptions = OmitKeyof, "queryFn"> & object;
+```
+
+Defined in: packages/octane-query/src/queryOptions.ts:26
+
+## Type Declaration
+
+### queryFn?
+
+```ts
+optional queryFn: Exclude["queryFn"], SkipToken | undefined>;
+```
+
+## Type Parameters
+
+### TQueryFnData
+
+`TQueryFnData` = `unknown`
+
+### TError
+
+`TError` = `DefaultError`
+
+### TData
+
+`TData` = `TQueryFnData`
+
+### TQueryKey
+
+`TQueryKey` *extends* `QueryKey` = `QueryKey`
diff --git a/docs/framework/octane/reference/type-aliases/UseBaseMutationResult.md b/docs/framework/octane/reference/type-aliases/UseBaseMutationResult.md
new file mode 100644
index 00000000000..29216799f85
--- /dev/null
+++ b/docs/framework/octane/reference/type-aliases/UseBaseMutationResult.md
@@ -0,0 +1,40 @@
+---
+id: UseBaseMutationResult
+title: UseBaseMutationResult
+---
+
+# Type Alias: UseBaseMutationResult\
+
+```ts
+type UseBaseMutationResult = Override, {
+ mutate: UseMutateFunction;
+}> & object;
+```
+
+Defined in: packages/octane-query/src/types.ts:225
+
+## Type Declaration
+
+### mutateAsync
+
+```ts
+mutateAsync: UseMutateAsyncFunction;
+```
+
+## Type Parameters
+
+### TData
+
+`TData` = `unknown`
+
+### TError
+
+`TError` = `DefaultError`
+
+### TVariables
+
+`TVariables` = `unknown`
+
+### TOnMutateResult
+
+`TOnMutateResult` = `unknown`
diff --git a/docs/framework/octane/reference/type-aliases/UseBaseQueryResult.md b/docs/framework/octane/reference/type-aliases/UseBaseQueryResult.md
new file mode 100644
index 00000000000..377fbde19e4
--- /dev/null
+++ b/docs/framework/octane/reference/type-aliases/UseBaseQueryResult.md
@@ -0,0 +1,22 @@
+---
+id: UseBaseQueryResult
+title: UseBaseQueryResult
+---
+
+# Type Alias: UseBaseQueryResult\
+
+```ts
+type UseBaseQueryResult = QueryObserverResult;
+```
+
+Defined in: packages/octane-query/src/types.ts:155
+
+## Type Parameters
+
+### TData
+
+`TData` = `unknown`
+
+### TError
+
+`TError` = `DefaultError`
diff --git a/docs/framework/octane/reference/type-aliases/UseInfiniteQueryResult.md b/docs/framework/octane/reference/type-aliases/UseInfiniteQueryResult.md
new file mode 100644
index 00000000000..117307752d1
--- /dev/null
+++ b/docs/framework/octane/reference/type-aliases/UseInfiniteQueryResult.md
@@ -0,0 +1,22 @@
+---
+id: UseInfiniteQueryResult
+title: UseInfiniteQueryResult
+---
+
+# Type Alias: UseInfiniteQueryResult\
+
+```ts
+type UseInfiniteQueryResult = InfiniteQueryObserverResult;
+```
+
+Defined in: packages/octane-query/src/types.ts:178
+
+## Type Parameters
+
+### TData
+
+`TData` = `unknown`
+
+### TError
+
+`TError` = `DefaultError`
diff --git a/docs/framework/octane/reference/type-aliases/UseMutateAsyncFunction.md b/docs/framework/octane/reference/type-aliases/UseMutateAsyncFunction.md
new file mode 100644
index 00000000000..8ab1e16c4fa
--- /dev/null
+++ b/docs/framework/octane/reference/type-aliases/UseMutateAsyncFunction.md
@@ -0,0 +1,30 @@
+---
+id: UseMutateAsyncFunction
+title: UseMutateAsyncFunction
+---
+
+# Type Alias: UseMutateAsyncFunction\
+
+```ts
+type UseMutateAsyncFunction = MutateFunction;
+```
+
+Defined in: packages/octane-query/src/types.ts:218
+
+## Type Parameters
+
+### TData
+
+`TData` = `unknown`
+
+### TError
+
+`TError` = `DefaultError`
+
+### TVariables
+
+`TVariables` = `void`
+
+### TOnMutateResult
+
+`TOnMutateResult` = `unknown`
diff --git a/docs/framework/octane/reference/type-aliases/UseMutateFunction.md b/docs/framework/octane/reference/type-aliases/UseMutateFunction.md
new file mode 100644
index 00000000000..8d1cdf00c78
--- /dev/null
+++ b/docs/framework/octane/reference/type-aliases/UseMutateFunction.md
@@ -0,0 +1,40 @@
+---
+id: UseMutateFunction
+title: UseMutateFunction
+---
+
+# Type Alias: UseMutateFunction()\
+
+```ts
+type UseMutateFunction = (...args) => void;
+```
+
+Defined in: packages/octane-query/src/types.ts:207
+
+## Type Parameters
+
+### TData
+
+`TData` = `unknown`
+
+### TError
+
+`TError` = `DefaultError`
+
+### TVariables
+
+`TVariables` = `void`
+
+### TOnMutateResult
+
+`TOnMutateResult` = `unknown`
+
+## Parameters
+
+### args
+
+...`Parameters`\<`MutateFunction`\<`TData`, `TError`, `TVariables`, `TOnMutateResult`\>\>
+
+## Returns
+
+`void`
diff --git a/docs/framework/octane/reference/type-aliases/UseMutationResult.md b/docs/framework/octane/reference/type-aliases/UseMutationResult.md
new file mode 100644
index 00000000000..15a33c9fff0
--- /dev/null
+++ b/docs/framework/octane/reference/type-aliases/UseMutationResult.md
@@ -0,0 +1,30 @@
+---
+id: UseMutationResult
+title: UseMutationResult
+---
+
+# Type Alias: UseMutationResult\
+
+```ts
+type UseMutationResult = UseBaseMutationResult;
+```
+
+Defined in: packages/octane-query/src/types.ts:242
+
+## Type Parameters
+
+### TData
+
+`TData` = `unknown`
+
+### TError
+
+`TError` = `DefaultError`
+
+### TVariables
+
+`TVariables` = `unknown`
+
+### TOnMutateResult
+
+`TOnMutateResult` = `unknown`
diff --git a/docs/framework/octane/reference/type-aliases/UseQueryResult.md b/docs/framework/octane/reference/type-aliases/UseQueryResult.md
new file mode 100644
index 00000000000..346e9814bd6
--- /dev/null
+++ b/docs/framework/octane/reference/type-aliases/UseQueryResult.md
@@ -0,0 +1,22 @@
+---
+id: UseQueryResult
+title: UseQueryResult
+---
+
+# Type Alias: UseQueryResult\
+
+```ts
+type UseQueryResult = UseBaseQueryResult;
+```
+
+Defined in: packages/octane-query/src/types.ts:160
+
+## Type Parameters
+
+### TData
+
+`TData` = `unknown`
+
+### TError
+
+`TError` = `DefaultError`
diff --git a/docs/framework/octane/reference/type-aliases/UseSuspenseInfiniteQueryResult.md b/docs/framework/octane/reference/type-aliases/UseSuspenseInfiniteQueryResult.md
new file mode 100644
index 00000000000..f7e8c495007
--- /dev/null
+++ b/docs/framework/octane/reference/type-aliases/UseSuspenseInfiniteQueryResult.md
@@ -0,0 +1,22 @@
+---
+id: UseSuspenseInfiniteQueryResult
+title: UseSuspenseInfiniteQueryResult
+---
+
+# Type Alias: UseSuspenseInfiniteQueryResult\
+
+```ts
+type UseSuspenseInfiniteQueryResult = OmitKeyof, "isPlaceholderData" | "promise">;
+```
+
+Defined in: packages/octane-query/src/types.ts:188
+
+## Type Parameters
+
+### TData
+
+`TData` = `unknown`
+
+### TError
+
+`TError` = `DefaultError`
diff --git a/docs/framework/octane/reference/type-aliases/UseSuspenseQueryResult.md b/docs/framework/octane/reference/type-aliases/UseSuspenseQueryResult.md
new file mode 100644
index 00000000000..06fae636577
--- /dev/null
+++ b/docs/framework/octane/reference/type-aliases/UseSuspenseQueryResult.md
@@ -0,0 +1,22 @@
+---
+id: UseSuspenseQueryResult
+title: UseSuspenseQueryResult
+---
+
+# Type Alias: UseSuspenseQueryResult\
+
+```ts
+type UseSuspenseQueryResult = DistributiveOmit, "isPlaceholderData" | "promise">;
+```
+
+Defined in: packages/octane-query/src/types.ts:165
+
+## Type Parameters
+
+### TData
+
+`TData` = `unknown`
+
+### TError
+
+`TError` = `DefaultError`
diff --git a/docs/framework/octane/reference/variables/HydrationBoundary.md b/docs/framework/octane/reference/variables/HydrationBoundary.md
new file mode 100644
index 00000000000..4b8f67ec988
--- /dev/null
+++ b/docs/framework/octane/reference/variables/HydrationBoundary.md
@@ -0,0 +1,12 @@
+---
+id: HydrationBoundary
+title: HydrationBoundary
+---
+
+# Variable: HydrationBoundary
+
+```ts
+const HydrationBoundary: ComponentBody;
+```
+
+Defined in: packages/octane-query/src/HydrationBoundary.tsrx.d.ts:4
diff --git a/docs/framework/octane/reference/variables/IsRestoringProvider.md b/docs/framework/octane/reference/variables/IsRestoringProvider.md
new file mode 100644
index 00000000000..bf4b4de0963
--- /dev/null
+++ b/docs/framework/octane/reference/variables/IsRestoringProvider.md
@@ -0,0 +1,15 @@
+---
+id: IsRestoringProvider
+title: IsRestoringProvider
+---
+
+# Variable: IsRestoringProvider
+
+```ts
+const IsRestoringProvider: ComponentBody<{
+ children?: any;
+ value: boolean;
+}, any> = IsRestoringContext.Provider;
+```
+
+Defined in: packages/octane-query/src/isRestoring.ts:13
diff --git a/docs/framework/octane/reference/variables/QueryClientContext.md b/docs/framework/octane/reference/variables/QueryClientContext.md
new file mode 100644
index 00000000000..542c842dfb8
--- /dev/null
+++ b/docs/framework/octane/reference/variables/QueryClientContext.md
@@ -0,0 +1,12 @@
+---
+id: QueryClientContext
+title: QueryClientContext
+---
+
+# Variable: QueryClientContext
+
+```ts
+const QueryClientContext: Context;
+```
+
+Defined in: packages/octane-query/src/context.ts:6
diff --git a/docs/framework/octane/reference/variables/QueryClientProvider.md b/docs/framework/octane/reference/variables/QueryClientProvider.md
new file mode 100644
index 00000000000..8f3b3408799
--- /dev/null
+++ b/docs/framework/octane/reference/variables/QueryClientProvider.md
@@ -0,0 +1,12 @@
+---
+id: QueryClientProvider
+title: QueryClientProvider
+---
+
+# Variable: QueryClientProvider
+
+```ts
+const QueryClientProvider: ComponentBody;
+```
+
+Defined in: packages/octane-query/src/QueryClientProvider.tsrx.d.ts:4
diff --git a/docs/framework/octane/reference/variables/QueryErrorResetBoundary.md b/docs/framework/octane/reference/variables/QueryErrorResetBoundary.md
new file mode 100644
index 00000000000..38a520150e1
--- /dev/null
+++ b/docs/framework/octane/reference/variables/QueryErrorResetBoundary.md
@@ -0,0 +1,12 @@
+---
+id: QueryErrorResetBoundary
+title: QueryErrorResetBoundary
+---
+
+# Variable: QueryErrorResetBoundary
+
+```ts
+const QueryErrorResetBoundary: QueryErrorResetBoundaryComponent;
+```
+
+Defined in: packages/octane-query/src/QueryErrorResetBoundary.tsrx.d.ts:11
diff --git a/knip.json b/knip.json
index 2bbf42195f9..8271897172c 100644
--- a/knip.json
+++ b/knip.json
@@ -8,6 +8,7 @@
"react-dom"
],
"ignoreWorkspaces": ["examples/**", "integrations/**"],
+ "tags": ["-knipignore"],
"workspaces": {
"packages/angular-query-experimental": {
"entry": [
diff --git a/packages/octane-query/README.md b/packages/octane-query/README.md
new file mode 100644
index 00000000000..a918ab2e00f
--- /dev/null
+++ b/packages/octane-query/README.md
@@ -0,0 +1,71 @@
+# TanStack Query for Octane
+
+Official Octane bindings for [TanStack Query](https://tanstack.com/query).
+The package reuses `@tanstack/query-core` and exposes the same query, mutation,
+suspense, hydration, and error-reset primitives as the React adapter through
+Octane hooks and components.
+
+```tsrx
+import {
+ QueryClient,
+ QueryClientProvider,
+ useQuery,
+} from '@tanstack/octane-query'
+
+const queryClient = new QueryClient()
+
+function Todos() @{
+ const query = useQuery({
+ queryKey: ['todos'],
+ queryFn: fetchTodos,
+ })
+
+ @if (query.isPending) {
+ {'Loading'}
+ } @else if (query.isError) {
+ {query.error.message}
+ } @else {
+
+ }
+}
+
+function App() @{
+
+
+
+}
+```
+
+## API coverage
+
+- Queries: `useQuery`, `useInfiniteQuery`, `useSuspenseQuery`,
+ `useSuspenseInfiniteQuery`, `useQueries`, `useSuspenseQueries`,
+ `usePrefetchQuery`, and `usePrefetchInfiniteQuery`
+- Mutations and status: `useMutation`, `useMutationState`, `useIsFetching`, and
+ `useIsMutating`
+- Context and boundaries: `QueryClientProvider`, `useQueryClient`,
+ `QueryClientContext`, `HydrationBoundary`, `IsRestoringProvider`,
+ `useIsRestoring`, `QueryErrorResetBoundary`, and
+ `useQueryErrorResetBoundary`
+- Query Core: every export from `@tanstack/query-core`, including
+ `QueryClient`, `dehydrate`, and `hydrate`
+
+The separate React companion packages, including React Query Devtools and
+`@tanstack/react-query-persist-client`, are not part of this adapter.
+
+## Suspense, errors, and hydration
+
+Suspense hooks integrate with Octane's `use(thenable)` semantics. Catch pending
+and error states with Octane's `Suspense` and `ErrorBoundary` components or its
+`@pending` and `@catch` directives. Use `QueryErrorResetBoundary` or
+`useQueryErrorResetBoundary` when a retry must reset a failed query.
+
+For server rendering, create a `QueryClient` per request. The adapter re-exports
+Query Core's `dehydrate` and `hydrate`, and `HydrationBoundary` also accepts
+streamed dehydrated queries. `IsRestoringProvider` can pause fetching while a
+persisted cache is restored.
+
+The package publishes TSRX source so the Octane compiler can produce the
+correct client and server output. Its manifest marks the binding hooks as
+manually slotted; consumers should use the standard Octane Vite integration.
+It is a compiler-source package, not a direct Node.js runtime entry point.
diff --git a/packages/octane-query/octane-compiler.d.ts b/packages/octane-query/octane-compiler.d.ts
new file mode 100644
index 00000000000..e8d69c1aa91
--- /dev/null
+++ b/packages/octane-query/octane-compiler.d.ts
@@ -0,0 +1,22 @@
+declare module 'octane/compiler' {
+ export interface SourceMap {
+ version: number
+ sources: Array
+ sourcesContent?: Array
+ names: Array
+ mappings: string
+ file?: string
+ sourceRoot?: string
+ }
+
+ export interface CompileResult {
+ code: string
+ map?: SourceMap | null
+ }
+
+ export function compile(
+ source: string,
+ filename: string,
+ options?: { mode?: 'client' | 'server' },
+ ): CompileResult
+}
diff --git a/packages/octane-query/package.json b/packages/octane-query/package.json
new file mode 100644
index 00000000000..d8b82942628
--- /dev/null
+++ b/packages/octane-query/package.json
@@ -0,0 +1,85 @@
+{
+ "name": "@tanstack/octane-query",
+ "version": "5.101.4",
+ "description": "Hooks for managing, caching and syncing asynchronous and remote data in Octane",
+ "author": "tannerlinsley",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/TanStack/query.git",
+ "directory": "packages/octane-query"
+ },
+ "homepage": "https://tanstack.com/query",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ },
+ "keywords": [
+ "octane",
+ "query",
+ "tanstack"
+ ],
+ "scripts": {
+ "clean": "premove ./coverage ./dist-ts",
+ "compile": "tsc --build",
+ "test:eslint": "eslint --concurrency=auto ./src ./tests ./scripts",
+ "test:types": "npm-run-all --serial test:types:*",
+ "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js --build tsconfig.legacy.json",
+ "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js --build tsconfig.legacy.json",
+ "test:types:ts56": "node ../../node_modules/typescript56/lib/tsc.js --build tsconfig.legacy.json",
+ "test:types:ts57": "node ../../node_modules/typescript57/lib/tsc.js --build tsconfig.legacy.json",
+ "test:types:ts58": "node ../../node_modules/typescript58/lib/tsc.js --build tsconfig.legacy.json",
+ "test:types:ts59": "node ../../node_modules/typescript59/lib/tsc.js --build tsconfig.legacy.json",
+ "test:types:tscurrent": "tsc --build",
+ "test:types:ts60": "node ../../node_modules/typescript60/lib/tsc.js --build tsconfig.legacy.json",
+ "test:lib": "vitest",
+ "test:lib:dev": "pnpm run test:lib --watch",
+ "test:build": "publint --strict && node scripts/check-package.mjs && node scripts/check-tsrx.mjs",
+ "build": "tsc --noEmit -p tsconfig.prod.json && node scripts/check-tsrx.mjs"
+ },
+ "type": "module",
+ "types": "./src/index.ts",
+ "module": "./src/index.ts",
+ "exports": {
+ ".": {
+ "@tanstack/custom-condition": "./src/index.ts",
+ "types": "./src/index.ts",
+ "module": "./src/index.ts"
+ },
+ "./package.json": "./package.json"
+ },
+ "sideEffects": false,
+ "files": [
+ "src",
+ "!src/__tests__",
+ "README.md"
+ ],
+ "engines": {
+ "node": ">=22"
+ },
+ "octane": {
+ "hookSlots": {
+ "manual": [
+ "src"
+ ]
+ }
+ },
+ "dependencies": {
+ "@tanstack/query-core": "workspace:*"
+ },
+ "devDependencies": {
+ "@tanstack/react-query": "workspace:*",
+ "@tsrx/react": "^0.2.45",
+ "@types/react": "^19.2.7",
+ "@types/react-dom": "^19.2.3",
+ "esbuild": "^0.27.2",
+ "npm-run-all2": "^5.0.0",
+ "octane": "catalog:",
+ "react": "^19.2.1",
+ "react-dom": "^19.2.1",
+ "vite": "^6.4.1"
+ },
+ "peerDependencies": {
+ "octane": "^0.1.12"
+ }
+}
diff --git a/packages/octane-query/scripts/check-package.mjs b/packages/octane-query/scripts/check-package.mjs
new file mode 100644
index 00000000000..f72914d6cdc
--- /dev/null
+++ b/packages/octane-query/scripts/check-package.mjs
@@ -0,0 +1,158 @@
+import { spawnSync } from 'node:child_process'
+import {
+ mkdir,
+ mkdtemp,
+ readFile,
+ rename,
+ rm,
+ writeFile,
+} from 'node:fs/promises'
+import { dirname, isAbsolute, join } from 'node:path'
+import { fileURLToPath } from 'node:url'
+import process from 'node:process'
+import { compile } from 'octane/compiler'
+import { build } from 'vite'
+
+const packageRoot = fileURLToPath(new URL('..', import.meta.url))
+const temporaryDirectory = await mkdtemp(join(packageRoot, '.pack-smoke-'))
+const packageManager = process.platform === 'win32' ? 'pnpm.cmd' : 'pnpm'
+
+function run(command, args) {
+ const result = spawnSync(command, args, {
+ cwd: packageRoot,
+ encoding: 'utf8',
+ })
+ if (result.status !== 0) {
+ throw new Error(result.stderr || `${command} failed`)
+ }
+ return result.stdout
+}
+
+try {
+ const packedResult = JSON.parse(
+ run(packageManager, [
+ 'pack',
+ '--pack-destination',
+ temporaryDirectory,
+ '--json',
+ ]),
+ )
+ const tarballPath = isAbsolute(packedResult.filename)
+ ? packedResult.filename
+ : join(temporaryDirectory, packedResult.filename)
+ run('tar', ['-xzf', tarballPath, '-C', temporaryDirectory])
+
+ const extractedRoot = join(
+ temporaryDirectory,
+ 'node_modules/@tanstack/octane-query',
+ )
+ await mkdir(dirname(extractedRoot), { recursive: true })
+ await rename(join(temporaryDirectory, 'package'), extractedRoot)
+ const packedManifest = JSON.parse(
+ await readFile(join(extractedRoot, 'package.json'), 'utf8'),
+ )
+ const requiredFiles = [
+ 'README.md',
+ 'src/index.ts',
+ 'src/HydrationBoundary.tsrx',
+ 'src/HydrationBoundary.tsrx.d.ts',
+ 'src/QueryClientProvider.tsrx',
+ 'src/QueryClientProvider.tsrx.d.ts',
+ 'src/QueryErrorResetBoundary.tsrx',
+ 'src/QueryErrorResetBoundary.tsrx.d.ts',
+ ]
+
+ for (const file of requiredFiles) {
+ await readFile(join(extractedRoot, file))
+ }
+
+ if (packedResult.files.some((file) => file.path.includes('/__tests__/'))) {
+ throw new Error('Packed package contains source tests')
+ }
+ if (packedManifest.dependencies['@tanstack/query-core'] === 'workspace:*') {
+ throw new Error(
+ 'Packed manifest contains an unresolved workspace dependency',
+ )
+ }
+ if (
+ JSON.stringify(packedManifest.octane?.hookSlots?.manual) !==
+ JSON.stringify(['src'])
+ ) {
+ throw new Error(
+ 'Packed manifest is missing the manual Octane slot contract',
+ )
+ }
+
+ const consumerPath = join(temporaryDirectory, 'consumer.tsrx')
+ await writeFile(
+ consumerPath,
+ `import { QueryClient, QueryClientProvider, useQuery } from '@tanstack/octane-query'
+
+const client = new QueryClient()
+
+function Result() @{
+ const query = useQuery({ queryKey: ['pack-smoke'], queryFn: () => Promise.resolve('ok') })
+ {String(query.data ?? query.status)}
+}
+
+export function App() @{
+
+
+
+}
+`,
+ )
+
+ const compiledModes = new Set()
+ const compilerPlugin = {
+ name: 'tanstack-octane-query:pack-smoke-compiler',
+ enforce: 'pre',
+ transform(code, id, options) {
+ const filename = id.split('?', 1)[0]
+ if (!filename.endsWith('.tsrx')) {
+ return null
+ }
+ const mode = options?.ssr ? 'server' : 'client'
+ compiledModes.add(mode)
+ return compile(code, filename, { mode })
+ },
+ }
+ const sharedConfig = {
+ configFile: false,
+ logLevel: 'silent',
+ root: temporaryDirectory,
+ plugins: [compilerPlugin],
+ resolve: {
+ alias: {
+ '@tanstack/query-core': join(packageRoot, '../query-core/src/index.ts'),
+ },
+ conditions: ['module'],
+ },
+ }
+
+ await build({
+ ...sharedConfig,
+ build: {
+ write: false,
+ lib: { entry: consumerPath, formats: ['es'] },
+ },
+ })
+ await build({
+ ...sharedConfig,
+ build: {
+ write: false,
+ ssr: consumerPath,
+ },
+ ssr: {
+ noExternal: ['@tanstack/octane-query'],
+ },
+ })
+
+ if (!compiledModes.has('client') || !compiledModes.has('server')) {
+ throw new Error(
+ 'Packed consumer was not compiled in client and server modes',
+ )
+ }
+} finally {
+ await rm(temporaryDirectory, { force: true, recursive: true })
+}
diff --git a/packages/octane-query/scripts/check-tsrx.mjs b/packages/octane-query/scripts/check-tsrx.mjs
new file mode 100644
index 00000000000..892bdcfcb5c
--- /dev/null
+++ b/packages/octane-query/scripts/check-tsrx.mjs
@@ -0,0 +1,17 @@
+import { readFile } from 'node:fs/promises'
+import { fileURLToPath } from 'node:url'
+import { compile } from 'octane/compiler'
+
+const componentUrls = [
+ new URL('../src/HydrationBoundary.tsrx', import.meta.url),
+ new URL('../src/QueryClientProvider.tsrx', import.meta.url),
+ new URL('../src/QueryErrorResetBoundary.tsrx', import.meta.url),
+]
+
+for (const componentUrl of componentUrls) {
+ const filename = fileURLToPath(componentUrl)
+ const source = await readFile(componentUrl, 'utf8')
+
+ compile(source, filename, { mode: 'client' })
+ compile(source, filename, { mode: 'server' })
+}
diff --git a/packages/octane-query/src/HydrationBoundary.tsrx b/packages/octane-query/src/HydrationBoundary.tsrx
new file mode 100644
index 00000000000..f30e3680c79
--- /dev/null
+++ b/packages/octane-query/src/HydrationBoundary.tsrx
@@ -0,0 +1,83 @@
+// HydrationBoundary — hydrates dehydrated query state into the client, then
+// renders its children. Full port of react-query's HydrationBoundary.tsx:
+//
+// - NEW queries hydrate IN RENDER (after SSR, hydration must land before the
+// children render; during a transition, prerender as much as is safe).
+// - EXISTING queries hydrate in an EFFECT: during a transition we must not
+// update live queries/observers until the transition commits — an aborted
+// transition must not clobber committed data (octane has transitions, so
+// upstream's abort-safety applies here too).
+// - A dehydrated query counts as NEWER than the cache when its dataUpdatedAt
+// is ahead, OR when it carries a streaming `promise` and was dehydrated
+// after the cached data settled (`dehydratedAt > dataUpdatedAt`) — that's
+// what lets later stream chunks re-hydrate an already-settled query.
+import { useRef, useMemo, useEffect } from 'octane';
+import { hydrate } from '@tanstack/query-core';
+import { resolveClient } from './context.ts';
+import type { OctaneNode } from 'octane';
+import type { DehydratedState, HydrateOptions, QueryClient } from '@tanstack/query-core';
+
+type HydrationBoundaryProps = {
+ state?: unknown;
+ options?: HydrateOptions;
+ queryClient?: QueryClient;
+ children?: OctaneNode;
+};
+
+export function HydrationBoundary(props: HydrationBoundaryProps) @{
+ const client = resolveClient(props.queryClient);
+ const state = props.state;
+
+ const optionsRef = useRef(props.options);
+ useEffect(() => {
+ optionsRef.current = props.options;
+ });
+
+ // "In render" on purpose (the memo is a perf cache, not a semantic barrier) —
+ // hydrate new queries now, queue existing ones for the commit effect.
+ const hydrationQueue = useMemo(() => {
+ if (state && typeof state === 'object') {
+ const queryCache = client.getQueryCache();
+ const queries = (state as DehydratedState).queries || [];
+
+ const newQueries = [];
+ const existingQueries = [];
+ for (const dehydratedQuery of queries) {
+ const existingQuery = queryCache.get(dehydratedQuery.queryHash);
+ if (!existingQuery) {
+ newQueries.push(dehydratedQuery);
+ } else {
+ const hydrationIsNewer =
+ dehydratedQuery.state.dataUpdatedAt > existingQuery.state.dataUpdatedAt ||
+ dehydratedQuery.promise && existingQuery.state.status !== 'pending' &&
+ existingQuery.state.fetchStatus !== 'fetching' &&
+ dehydratedQuery.dehydratedAt !== undefined &&
+ dehydratedQuery.dehydratedAt > existingQuery.state.dataUpdatedAt;
+ if (hydrationIsNewer) {
+ existingQueries.push(dehydratedQuery);
+ }
+ }
+ }
+
+ if (newQueries.length > 0) {
+ // hydrate() is idempotent for queries — safe to run in render.
+ hydrate(client, { queries: newQueries }, optionsRef.current);
+ }
+ if (existingQueries.length > 0) {
+ return existingQueries;
+ }
+ }
+ return undefined;
+ }, [client, state]);
+
+ // Existing-query hydration lands at commit time (transition abort-safe).
+ useEffect(() => {
+ if (hydrationQueue) {
+ hydrate(client, { queries: hydrationQueue }, optionsRef.current);
+ }
+ }, [client, hydrationQueue]);
+
+ <>
+ {props.children}
+ >
+}
diff --git a/packages/octane-query/src/HydrationBoundary.tsrx.d.ts b/packages/octane-query/src/HydrationBoundary.tsrx.d.ts
new file mode 100644
index 00000000000..2661827c23b
--- /dev/null
+++ b/packages/octane-query/src/HydrationBoundary.tsrx.d.ts
@@ -0,0 +1,4 @@
+import type { ComponentBody } from 'octane'
+import type { HydrationBoundaryProps } from './types'
+
+export declare const HydrationBoundary: ComponentBody
diff --git a/packages/octane-query/src/QueryClientProvider.tsrx b/packages/octane-query/src/QueryClientProvider.tsrx
new file mode 100644
index 00000000000..7073131c1d2
--- /dev/null
+++ b/packages/octane-query/src/QueryClientProvider.tsrx
@@ -0,0 +1,23 @@
+import { useEffect } from 'octane';
+import { QueryClientContext } from './context.ts';
+import type { OctaneNode } from 'octane';
+import type { QueryClient } from '@tanstack/query-core';
+
+type QueryClientProviderProps = {
+ client: QueryClient;
+ children?: OctaneNode;
+};
+
+// QueryClientProvider — provides the QueryClient via context and mounts/unmounts
+// it with the component. It's authored in .tsrx because it's a COMPONENT that
+// renders a context Provider with children + a mount effect, which only the
+// octane compiler can emit (the binding's hooks stay plain TS).
+export function QueryClientProvider(props: QueryClientProviderProps) @{
+ useEffect(() => {
+ props.client.mount();
+ return () => {
+ props.client.unmount();
+ };
+ }, [props.client]);
+ {props.children}
+}
diff --git a/packages/octane-query/src/QueryClientProvider.tsrx.d.ts b/packages/octane-query/src/QueryClientProvider.tsrx.d.ts
new file mode 100644
index 00000000000..b70e3a34afe
--- /dev/null
+++ b/packages/octane-query/src/QueryClientProvider.tsrx.d.ts
@@ -0,0 +1,4 @@
+import type { ComponentBody } from 'octane'
+import type { QueryClientProviderProps } from './types'
+
+export declare const QueryClientProvider: ComponentBody
diff --git a/packages/octane-query/src/QueryErrorResetBoundary.tsrx b/packages/octane-query/src/QueryErrorResetBoundary.tsrx
new file mode 100644
index 00000000000..fba6c306b8b
--- /dev/null
+++ b/packages/octane-query/src/QueryErrorResetBoundary.tsrx
@@ -0,0 +1,26 @@
+import { useState, isChildrenBlock } from 'octane';
+import { QueryErrorResetBoundaryContext, createValue } from './errorResetBoundary.ts';
+import type { OctaneNode } from 'octane';
+
+type QueryErrorResetBoundaryProps = {
+ children?: OctaneNode | ((value: ReturnType) => OctaneNode);
+};
+
+// QueryErrorResetBoundary — provides a fresh reset coordinator to its subtree.
+// Place it above an error boundary; call `.reset()` from the boundary's retry so
+// the query refetches instead of immediately re-throwing. Children may be a
+// render prop receiving the boundary value — upstream's documented primary form:
+// `{({ reset }) => }
+// ` (react-query QueryErrorResetBoundary.tsx renders
+// `typeof children === 'function' ? children(value) : children`; octane
+// additionally excludes compiled children-blocks via isChildrenBlock).
+export function QueryErrorResetBoundary(props: QueryErrorResetBoundaryProps) @{
+ const [value] = useState(() => createValue());
+ const resolved =
+ typeof props.children === 'function' && !isChildrenBlock(props.children)
+ ? props.children(value)
+ : props.children;
+ {resolved}
+}
diff --git a/packages/octane-query/src/QueryErrorResetBoundary.tsrx.d.ts b/packages/octane-query/src/QueryErrorResetBoundary.tsrx.d.ts
new file mode 100644
index 00000000000..b8c91689b44
--- /dev/null
+++ b/packages/octane-query/src/QueryErrorResetBoundary.tsrx.d.ts
@@ -0,0 +1,11 @@
+import type { ComponentBody } from 'octane'
+import type {
+ QueryErrorResetBoundaryFunction,
+ QueryErrorResetBoundaryProps,
+} from './types'
+
+export interface QueryErrorResetBoundaryComponent extends ComponentBody {
+ (props: { children: QueryErrorResetBoundaryFunction }): void
+}
+
+export declare const QueryErrorResetBoundary: QueryErrorResetBoundaryComponent
diff --git a/packages/octane-query/src/__tests__/types.test-d.ts b/packages/octane-query/src/__tests__/types.test-d.ts
new file mode 100644
index 00000000000..51ea573f9c2
--- /dev/null
+++ b/packages/octane-query/src/__tests__/types.test-d.ts
@@ -0,0 +1,62 @@
+import { expectTypeOf, it } from 'vitest'
+import {
+ QueryErrorResetBoundary,
+ useQueries,
+ useSuspenseQueries,
+} from '../index'
+import type { QueryErrorResetBoundaryValue } from '../index'
+
+it('infers each useQueries tuple entry', () => {
+ const result = useQueries({
+ queries: [
+ {
+ queryKey: ['count'],
+ queryFn: async () => 1,
+ },
+ {
+ queryKey: ['label'],
+ queryFn: async () => 'ready',
+ },
+ ],
+ })
+
+ expectTypeOf(result[0].data).toEqualTypeOf()
+ expectTypeOf(result[1].data).toEqualTypeOf()
+})
+
+it('infers each useSuspenseQueries tuple entry as defined', () => {
+ const result = useSuspenseQueries({
+ queries: [
+ {
+ queryKey: ['count'],
+ queryFn: async () => 1,
+ },
+ {
+ queryKey: ['label'],
+ queryFn: async () => 'ready',
+ },
+ ],
+ })
+
+ expectTypeOf(result[0].data).toEqualTypeOf()
+ expectTypeOf(result[1].data).toEqualTypeOf()
+})
+
+it('contextually types the query error reset render prop', () => {
+ QueryErrorResetBoundary({
+ children: ({ clearReset, isReset, reset }) => {
+ expectTypeOf(clearReset).toEqualTypeOf<() => void>()
+ expectTypeOf(isReset).toEqualTypeOf<() => boolean>()
+ expectTypeOf(reset).toEqualTypeOf<() => void>()
+ return undefined
+ },
+ })
+})
+
+it('exports the query error reset boundary value type', () => {
+ expectTypeOf().toEqualTypeOf<{
+ clearReset: () => void
+ isReset: () => boolean
+ reset: () => void
+ }>()
+})
diff --git a/packages/octane-query/src/context.ts b/packages/octane-query/src/context.ts
new file mode 100644
index 00000000000..cfd7eb7e4b1
--- /dev/null
+++ b/packages/octane-query/src/context.ts
@@ -0,0 +1,35 @@
+import { createContext, useContext } from 'octane'
+import type { QueryClient } from '@tanstack/query-core'
+
+// The QueryClient context — read by useQuery/useMutation/useQueryClient. Mirrors
+// react-query's QueryClientContext.
+export const QueryClientContext = createContext(
+ undefined,
+)
+
+// Resolve the client: an explicitly-passed one wins, else the context value.
+// `useContext` is keyed by context identity (not a per-call-site slot), so it's
+// safe to call from this binding code without a compiler-injected slot.
+export function resolveClient(
+ queryClient: QueryClient | undefined,
+): QueryClient {
+ const ctxClient = useContext(QueryClientContext)
+ const client = queryClient ?? ctxClient
+ if (!client) {
+ throw new Error('No QueryClient set, use QueryClientProvider to set one')
+ }
+ return client
+}
+
+// Signature matches @tanstack/react-query's QueryClientProvider.tsx.
+export function useQueryClient(queryClient?: QueryClient): QueryClient
+
+export function useQueryClient(...args: Array): QueryClient {
+ // Args are `[queryClient?, slot?]`; the slot (symbol) is appended by the
+ // compiler. An explicit client is the first non-symbol arg.
+ const queryClient =
+ args.length && typeof args[0] !== 'symbol'
+ ? (args[0] as QueryClient)
+ : undefined
+ return resolveClient(queryClient)
+}
diff --git a/packages/octane-query/src/errorResetBoundary.ts b/packages/octane-query/src/errorResetBoundary.ts
new file mode 100644
index 00000000000..e53cf1c5892
--- /dev/null
+++ b/packages/octane-query/src/errorResetBoundary.ts
@@ -0,0 +1,32 @@
+import { createContext, useContext } from 'octane'
+import type { QueryErrorResetBoundaryValue } from './types'
+
+/**
+ * @knipignore Consumed by QueryErrorResetBoundary.tsrx, which Knip cannot parse.
+ */
+export function createValue(): QueryErrorResetBoundaryValue {
+ let isReset = false
+ return {
+ clearReset: () => {
+ isReset = false
+ },
+ reset: () => {
+ isReset = true
+ },
+ isReset: () => isReset,
+ }
+}
+
+// The reset coordinator for error-boundary retries. While "reset", a thrown query
+// error is NOT re-thrown (so the boundary's retry refetches instead of looping).
+// The default value means: without a ``, `isReset()` is
+// always false — identical to having no boundary.
+/**
+ * @knipignore Consumed by QueryErrorResetBoundary.tsrx, which Knip cannot parse.
+ */
+export const QueryErrorResetBoundaryContext =
+ createContext(createValue())
+
+export function useQueryErrorResetBoundary(): QueryErrorResetBoundaryValue {
+ return useContext(QueryErrorResetBoundaryContext)
+}
diff --git a/packages/octane-query/src/index.ts b/packages/octane-query/src/index.ts
new file mode 100644
index 00000000000..7c6babdd09e
--- /dev/null
+++ b/packages/octane-query/src/index.ts
@@ -0,0 +1,77 @@
+// @tanstack/octane-query — TanStack Query for the Octane renderer.
+//
+// Reuses @tanstack/query-core verbatim (QueryClient, observers, caches — all
+// framework-agnostic) and reimplements the React binding on octane's hooks. The
+// public surface matches @tanstack/react-query, so most query code works by
+// changing the import.
+export * from '@tanstack/query-core'
+
+export { useQuery } from './useQuery'
+export { useMutation } from './useMutation'
+export { useInfiniteQuery } from './useInfiniteQuery'
+export { useSuspenseQuery, useSuspenseInfiniteQuery } from './useSuspenseQuery'
+export { useSuspenseQueries } from './useSuspenseQueries'
+export { usePrefetchQuery, usePrefetchInfiniteQuery } from './usePrefetch'
+export { useQueries } from './useQueries'
+export { queryOptions } from './queryOptions'
+export { infiniteQueryOptions } from './infiniteQueryOptions'
+export { mutationOptions } from './mutationOptions'
+export { useIsFetching } from './useIsFetching'
+export { useMutationState, useIsMutating } from './useMutationState'
+export { useQueryClient, QueryClientContext } from './context'
+export { QueryClientProvider } from './QueryClientProvider.tsrx'
+export { HydrationBoundary } from './HydrationBoundary.tsrx'
+export { IsRestoringProvider, useIsRestoring } from './isRestoring'
+export { QueryErrorResetBoundary } from './QueryErrorResetBoundary.tsrx'
+export { useQueryErrorResetBoundary } from './errorResetBoundary'
+
+// The binding-level type surface (1:1 with @tanstack/react-query's exports).
+export type {
+ AnyUseBaseQueryOptions,
+ UseBaseQueryOptions,
+ UsePrefetchQueryOptions,
+ AnyUseQueryOptions,
+ UseQueryOptions,
+ AnyUseSuspenseQueryOptions,
+ UseSuspenseQueryOptions,
+ AnyUseInfiniteQueryOptions,
+ UseInfiniteQueryOptions,
+ AnyUseSuspenseInfiniteQueryOptions,
+ UseSuspenseInfiniteQueryOptions,
+ UseBaseQueryResult,
+ UseQueryResult,
+ UseSuspenseQueryResult,
+ DefinedUseQueryResult,
+ UseInfiniteQueryResult,
+ DefinedUseInfiniteQueryResult,
+ UseSuspenseInfiniteQueryResult,
+ AnyUseMutationOptions,
+ UseMutationOptions,
+ UseMutateFunction,
+ UseMutateAsyncFunction,
+ UseBaseMutationResult,
+ UseMutationResult,
+ QueryClientProviderProps,
+ HydrationBoundaryProps,
+ QueryErrorResetFunction,
+ QueryErrorIsResetFunction,
+ QueryErrorClearResetFunction,
+ QueryErrorResetBoundaryValue,
+ QueryErrorResetBoundaryFunction,
+ QueryErrorResetBoundaryProps,
+} from './types'
+export type {
+ DefinedInitialDataOptions,
+ UndefinedInitialDataOptions,
+ UnusedSkipTokenOptions,
+} from './queryOptions'
+export type {
+ DefinedInitialDataInfiniteOptions,
+ UndefinedInitialDataInfiniteOptions,
+ UnusedSkipTokenInfiniteOptions,
+} from './infiniteQueryOptions'
+export type { QueriesOptions, QueriesResults } from './queries-types'
+export type {
+ SuspenseQueriesOptions,
+ SuspenseQueriesResults,
+} from './suspense-queries-types'
diff --git a/packages/octane-query/src/infiniteQueryOptions.ts b/packages/octane-query/src/infiniteQueryOptions.ts
new file mode 100644
index 00000000000..9b7a2fdd6cb
--- /dev/null
+++ b/packages/octane-query/src/infiniteQueryOptions.ts
@@ -0,0 +1,150 @@
+// Verbatim port of @tanstack/react-query's infiniteQueryOptions.ts — a typed identity helper
+import type {
+ DataTag,
+ DefaultError,
+ InfiniteData,
+ InitialDataFunction,
+ NonUndefinedGuard,
+ OmitKeyof,
+ QueryKey,
+ SkipToken,
+} from '@tanstack/query-core'
+import type { UseInfiniteQueryOptions } from './types'
+
+export type UndefinedInitialDataInfiniteOptions<
+ TQueryFnData,
+ TError = DefaultError,
+ TData = InfiniteData,
+ TQueryKey extends QueryKey = QueryKey,
+ TPageParam = unknown,
+> = UseInfiniteQueryOptions<
+ TQueryFnData,
+ TError,
+ TData,
+ TQueryKey,
+ TPageParam
+> & {
+ initialData?:
+ | undefined
+ | NonUndefinedGuard>
+ | InitialDataFunction<
+ NonUndefinedGuard>
+ >
+}
+
+export type UnusedSkipTokenInfiniteOptions<
+ TQueryFnData,
+ TError = DefaultError,
+ TData = InfiniteData,
+ TQueryKey extends QueryKey = QueryKey,
+ TPageParam = unknown,
+> = OmitKeyof<
+ UseInfiniteQueryOptions,
+ 'queryFn'
+> & {
+ queryFn?: Exclude<
+ UseInfiniteQueryOptions<
+ TQueryFnData,
+ TError,
+ TData,
+ TQueryKey,
+ TPageParam
+ >['queryFn'],
+ SkipToken | undefined
+ >
+}
+
+export type DefinedInitialDataInfiniteOptions<
+ TQueryFnData,
+ TError = DefaultError,
+ TData = InfiniteData,
+ TQueryKey extends QueryKey = QueryKey,
+ TPageParam = unknown,
+> = UseInfiniteQueryOptions<
+ TQueryFnData,
+ TError,
+ TData,
+ TQueryKey,
+ TPageParam
+> & {
+ initialData:
+ | NonUndefinedGuard>
+ | (() => NonUndefinedGuard>)
+ | undefined
+}
+
+export function infiniteQueryOptions<
+ TQueryFnData,
+ TError = DefaultError,
+ TData = InfiniteData,
+ TQueryKey extends QueryKey = QueryKey,
+ TPageParam = unknown,
+>(
+ options: DefinedInitialDataInfiniteOptions<
+ TQueryFnData,
+ TError,
+ TData,
+ TQueryKey,
+ TPageParam
+ >,
+): DefinedInitialDataInfiniteOptions<
+ TQueryFnData,
+ TError,
+ TData,
+ TQueryKey,
+ TPageParam
+> & {
+ queryKey: DataTag, TError>
+}
+
+export function infiniteQueryOptions<
+ TQueryFnData,
+ TError = DefaultError,
+ TData = InfiniteData,
+ TQueryKey extends QueryKey = QueryKey,
+ TPageParam = unknown,
+>(
+ options: UnusedSkipTokenInfiniteOptions<
+ TQueryFnData,
+ TError,
+ TData,
+ TQueryKey,
+ TPageParam
+ >,
+): UnusedSkipTokenInfiniteOptions<
+ TQueryFnData,
+ TError,
+ TData,
+ TQueryKey,
+ TPageParam
+> & {
+ queryKey: DataTag, TError>
+}
+
+export function infiniteQueryOptions<
+ TQueryFnData,
+ TError = DefaultError,
+ TData = InfiniteData,
+ TQueryKey extends QueryKey = QueryKey,
+ TPageParam = unknown,
+>(
+ options: UndefinedInitialDataInfiniteOptions<
+ TQueryFnData,
+ TError,
+ TData,
+ TQueryKey,
+ TPageParam
+ >,
+): UndefinedInitialDataInfiniteOptions<
+ TQueryFnData,
+ TError,
+ TData,
+ TQueryKey,
+ TPageParam
+> & {
+ queryKey: DataTag, TError>
+}
+
+export function infiniteQueryOptions(options: unknown) {
+ return options
+}
diff --git a/packages/octane-query/src/internal.ts b/packages/octane-query/src/internal.ts
new file mode 100644
index 00000000000..c93270321c9
--- /dev/null
+++ b/packages/octane-query/src/internal.ts
@@ -0,0 +1,186 @@
+// Shared internals for the binding hooks.
+import { shouldThrowError } from '@tanstack/query-core'
+import { use, useId, useRef } from 'octane'
+
+// Derive a stable, distinct sub-slot from a wrapper's compiler-injected slot, so
+// a hook composing multiple base hooks gives each one its own identity. Tags are
+// namespaced per hook (e.g. ':oq:obs', ':ms:cb') to avoid cross-hook collisions.
+// Memoized: subSlot runs on EVERY hook call every render, and the naive form
+// pays a string concat + global symbol-registry lookup each time. The cache is
+// keyed by the slot symbol itself; the minted value is byte-identical to the
+// uncached Symbol.for result, so identity is preserved across HMR re-evals and
+// the per-package copies of this helper. Key universe is bounded: slots are
+// per-call-site module constants (never minted per render).
+const subSlotCache = new Map>()
+export function subSlot(
+ slot: symbol | undefined,
+ tag: string,
+): symbol | undefined {
+ if (slot === undefined) return undefined
+ let byTag = subSlotCache.get(slot)
+ if (byTag === undefined) subSlotCache.set(slot, (byTag = new Map()))
+ let sym = byTag.get(tag)
+ if (sym === undefined)
+ byTag.set(tag, (sym = Symbol.for((slot.description ?? '') + ':' + tag)))
+ return sym
+}
+
+// Split the compiler-injected trailing slot off a hook's runtime args, returning
+// the user args (everything before it) and the slot.
+export function splitSlot(args: Array): [Array, symbol | undefined] {
+ const tail = args[args.length - 1]
+ const slot = typeof tail === 'symbol' ? tail : undefined
+ return [slot !== undefined ? args.slice(0, -1) : args, slot]
+}
+
+// react-query's default suspense throwOnError: only throw if there's no data.
+export const defaultThrowOnError = (_error: unknown, query: any): boolean =>
+ query.state.data === undefined
+
+// react-query's ensureSuspenseTimers: a suspense query gets a >=1s staleTime/gcTime
+// floor so it can't immediately refetch and re-trigger the fallback in a loop.
+export function ensureSuspenseTimers(defaultedOptions: any): void {
+ if (defaultedOptions.suspense) {
+ const MIN = 1000
+ const clamp = (value: any) =>
+ value === 'static' ? value : Math.max(value ?? MIN, MIN)
+ const orig = defaultedOptions.staleTime
+ defaultedOptions.staleTime =
+ typeof orig === 'function'
+ ? (...args: Array) => clamp(orig(...args))
+ : clamp(orig)
+ if (typeof defaultedOptions.gcTime === 'number') {
+ defaultedOptions.gcTime = Math.max(defaultedOptions.gcTime, MIN)
+ }
+ }
+}
+
+// prevent-error-boundary-retry: when a query opts into throwing, don't retry on
+// mount so an already-errored cached query re-throws immediately — UNLESS the
+// reset boundary has been reset, in which case a retry is expected.
+export function ensurePreventErrorBoundaryRetry(
+ options: any,
+ errorResetBoundary: { isReset: () => boolean },
+ query: any,
+): void {
+ const throwOnError =
+ query?.state.error && typeof options.throwOnError === 'function'
+ ? shouldThrowError(options.throwOnError, [query.state.error, query])
+ : options.throwOnError
+ if (
+ options.suspense ||
+ options.experimental_prefetchInRender ||
+ throwOnError
+ ) {
+ if (!errorResetBoundary.isReset()) {
+ options.retryOnMount = false
+ }
+ }
+}
+
+export const shouldSuspend = (defaultedOptions: any, result: any): boolean =>
+ defaultedOptions?.suspense && result.isPending
+
+// A pending result that will actually fetch (not blocked by persistence restore).
+export const willFetch = (result: any, isRestoring: boolean): boolean =>
+ result.isLoading && result.isFetching && !isRestoring
+
+// react-query's suspense fetch: kick the optimistic fetch and — CRUCIALLY — clear
+// the reset boundary on error. Without the clearReset, a boundary reset→retry
+// that fails AGAIN leaves `isReset()` true at replay, `getHasError` returns
+// false, and a suspense component falls through to render with undefined data
+// instead of re-throwing to the boundary. The returned promise resolves even on
+// error (the replay surfaces the error through the error-boundary throw).
+export function fetchOptimistic(
+ defaultedOptions: any,
+ observer: any,
+ errorResetBoundary: { clearReset: () => void },
+): Promise {
+ return observer.fetchOptimistic(defaultedOptions).catch(() => {
+ errorResetBoundary.clearReset()
+ })
+}
+
+type SuspensePromise = PromiseLike & {
+ status?: 'pending' | 'fulfilled' | 'rejected'
+}
+
+interface SuspensePromiseCache {
+ key: unknown
+ promise: SuspensePromise | undefined
+}
+
+// The server runtime accepts an explicit replay site key. Octane's universal
+// public type currently exposes only the client-compatible one-argument form.
+const useWithSiteKey = use as unknown as (
+ usable: PromiseLike,
+ siteKey?: symbol | string,
+) => unknown
+
+/**
+ * Suspend through a stable `use()` occurrence for one query-hook call site.
+ *
+ * `use()` tracks thenables by dynamic call order. A component with two
+ * sequential suspense queries initially reaches only the first query; when it
+ * resolves, the first query no longer needs to suspend and the second query is
+ * reached for the first time. If the first call simply skips `use()`, the
+ * second query takes its call-order position and replay reuses the first
+ * query's fulfilled promise, exposing the second query's still-pending result.
+ *
+ * Retain the promise that suspended this query hook and keep reading it after
+ * it settles. That reserves the query hook's dynamic call-order position on
+ * the client. Streaming SSR replays fresh hook passes, so an unconditional
+ * `useId()` gives each query-hook instance a deterministic server replay key,
+ * including when a custom hook is called more than once. A new query key or
+ * retry replaces a settled promise; re-renders during the same pending fetch
+ * reuse the in-flight promise.
+ */
+export function useSuspensePromise(
+ needsSuspense: boolean,
+ key: unknown,
+ createPromise: () => PromiseLike,
+ slot: symbol | undefined,
+): void {
+ const siteKey = useId(subSlot(slot, 'id'))
+ const cache = useRef(
+ { key: undefined, promise: undefined },
+ slot,
+ ).current
+ if (
+ needsSuspense &&
+ (cache.promise === undefined ||
+ cache.key !== key ||
+ cache.promise.status !== 'pending')
+ ) {
+ cache.key = key
+ cache.promise = createPromise()
+ }
+ if (cache.promise !== undefined) {
+ useWithSiteKey(cache.promise, siteKey)
+ }
+}
+
+// react-query's getHasError: only throw if the query errored, the boundary isn't
+// reset, the query isn't refetching, and the options opt into throwing.
+export function getHasError({
+ result,
+ errorResetBoundary,
+ throwOnError,
+ query,
+ suspense,
+}: {
+ result: any
+ errorResetBoundary: { isReset: () => boolean }
+ throwOnError: any
+ query: any
+ suspense: any
+}): boolean {
+ return (
+ result.isError &&
+ !errorResetBoundary.isReset() &&
+ !result.isFetching &&
+ query &&
+ ((suspense && result.data === undefined) ||
+ shouldThrowError(throwOnError, [result.error, query]))
+ )
+}
diff --git a/packages/octane-query/src/isRestoring.ts b/packages/octane-query/src/isRestoring.ts
new file mode 100644
index 00000000000..007f1e2bc40
--- /dev/null
+++ b/packages/octane-query/src/isRestoring.ts
@@ -0,0 +1,13 @@
+import { createContext, useContext } from 'octane'
+
+// IsRestoring — true while a persisted client is being restored from storage. While
+// restoring, queries read the cache but don't subscribe/fetch (they wait for the
+// restore to finish). Defaults to false, so without a provider it's inert.
+const IsRestoringContext = createContext(false)
+
+export function useIsRestoring(): boolean {
+ return useContext(IsRestoringContext)
+}
+
+// `…` — octane's built-in context Provider.
+export const IsRestoringProvider = IsRestoringContext.Provider
diff --git a/packages/octane-query/src/mutationOptions.ts b/packages/octane-query/src/mutationOptions.ts
new file mode 100644
index 00000000000..3499348d263
--- /dev/null
+++ b/packages/octane-query/src/mutationOptions.ts
@@ -0,0 +1,42 @@
+// Verbatim port of @tanstack/react-query's mutationOptions.ts — a typed identity helper
+import type { DefaultError, WithRequired } from '@tanstack/query-core'
+import type { UseMutationOptions } from './types'
+
+export function mutationOptions<
+ TData = unknown,
+ TError = DefaultError,
+ TVariables = void,
+ TOnMutateResult = unknown,
+>(
+ options: WithRequired<
+ UseMutationOptions,
+ 'mutationKey'
+ >,
+): WithRequired<
+ UseMutationOptions,
+ 'mutationKey'
+>
+export function mutationOptions<
+ TData = unknown,
+ TError = DefaultError,
+ TVariables = void,
+ TOnMutateResult = unknown,
+>(
+ options: Omit<
+ UseMutationOptions,
+ 'mutationKey'
+ >,
+): Omit<
+ UseMutationOptions,
+ 'mutationKey'
+>
+export function mutationOptions<
+ TData = unknown,
+ TError = DefaultError,
+ TVariables = void,
+ TOnMutateResult = unknown,
+>(
+ options: UseMutationOptions,
+): UseMutationOptions {
+ return options
+}
diff --git a/packages/octane-query/src/queries-types.ts b/packages/octane-query/src/queries-types.ts
new file mode 100644
index 00000000000..651413f1569
--- /dev/null
+++ b/packages/octane-query/src/queries-types.ts
@@ -0,0 +1,184 @@
+// The useQueries option/result tuple types — a 1:1 port of the type block in
+// @tanstack/react-query's useQueries.ts (pure query-core generics, no React).
+// `GetUseQueryOptionsForUseQueries` / `GetUseQueryResult` recursively unwrap
+// per-entry generics so tuple inputs infer per-index option/result types.
+import type {
+ DefinedUseQueryResult,
+ UseQueryOptions,
+ UseQueryResult,
+} from './types'
+import type {
+ DefaultError,
+ OmitKeyof,
+ QueriesPlaceholderDataFunction,
+ QueryFunction,
+ QueryKey,
+ ThrowOnError,
+} from '@tanstack/query-core'
+
+// This defines the `UseQueryOptions` that are accepted in `QueriesOptions` & `GetOptions`.
+// `placeholderData` function always gets undefined passed
+type UseQueryOptionsForUseQueries<
+ TQueryFnData = unknown,
+ TError = DefaultError,
+ TData = TQueryFnData,
+ TQueryKey extends QueryKey = QueryKey,
+> = OmitKeyof<
+ UseQueryOptions,
+ 'placeholderData' | 'subscribed'
+> & {
+ placeholderData?: TQueryFnData | QueriesPlaceholderDataFunction
+}
+
+// Avoid TS depth-limit error in case of large array literal
+type MAXIMUM_DEPTH = 20
+
+// Widen the type of the symbol to enable type inference even if skipToken is not immutable.
+type SkipTokenForUseQueries = symbol
+
+export type GetUseQueryOptionsForUseQueries =
+ // Part 1: responsible for applying explicit type parameter to function arguments, if object { queryFnData: TQueryFnData, error: TError, data: TData }
+ T extends {
+ queryFnData: infer TQueryFnData
+ error?: infer TError
+ data: infer TData
+ }
+ ? UseQueryOptionsForUseQueries
+ : T extends { queryFnData: infer TQueryFnData; error?: infer TError }
+ ? UseQueryOptionsForUseQueries
+ : T extends { data: infer TData; error?: infer TError }
+ ? UseQueryOptionsForUseQueries
+ : // Part 2: responsible for applying explicit type parameter to function arguments, if tuple [TQueryFnData, TError, TData]
+ T extends [infer TQueryFnData, infer TError, infer TData]
+ ? UseQueryOptionsForUseQueries
+ : T extends [infer TQueryFnData, infer TError]
+ ? UseQueryOptionsForUseQueries
+ : T extends [infer TQueryFnData]
+ ? UseQueryOptionsForUseQueries
+ : // Part 3: responsible for inferring and enforcing type if no explicit parameter was provided
+ T extends {
+ queryFn?:
+ | QueryFunction
+ | SkipTokenForUseQueries
+ select?: (data: any) => infer TData
+ throwOnError?: ThrowOnError
+ }
+ ? UseQueryOptionsForUseQueries<
+ TQueryFnData,
+ unknown extends TError ? DefaultError : TError,
+ unknown extends TData ? TQueryFnData : TData,
+ TQueryKey
+ >
+ : // Fallback
+ UseQueryOptionsForUseQueries
+
+// A defined initialData setting should return a DefinedUseQueryResult rather than UseQueryResult
+type GetDefinedOrUndefinedQueryResult = T extends {
+ initialData?: infer TInitialData
+}
+ ? unknown extends TInitialData
+ ? UseQueryResult
+ : TInitialData extends TData
+ ? DefinedUseQueryResult
+ : TInitialData extends () => infer TInitialDataResult
+ ? unknown extends TInitialDataResult
+ ? UseQueryResult
+ : TInitialDataResult extends TData
+ ? DefinedUseQueryResult
+ : UseQueryResult
+ : UseQueryResult
+ : UseQueryResult
+
+type GetUseQueryResult =
+ // Part 1: responsible for mapping explicit type parameter to function result, if object
+ T extends { queryFnData: any; error?: infer TError; data: infer TData }
+ ? GetDefinedOrUndefinedQueryResult
+ : T extends { queryFnData: infer TQueryFnData; error?: infer TError }
+ ? GetDefinedOrUndefinedQueryResult
+ : T extends { data: infer TData; error?: infer TError }
+ ? GetDefinedOrUndefinedQueryResult
+ : // Part 2: responsible for mapping explicit type parameter to function result, if tuple
+ T extends [any, infer TError, infer TData]
+ ? GetDefinedOrUndefinedQueryResult
+ : T extends [infer TQueryFnData, infer TError]
+ ? GetDefinedOrUndefinedQueryResult
+ : T extends [infer TQueryFnData]
+ ? GetDefinedOrUndefinedQueryResult
+ : // Part 3: responsible for mapping inferred type to results, if no explicit parameter was provided
+ T extends {
+ queryFn?:
+ | QueryFunction
+ | SkipTokenForUseQueries
+ select?: (data: any) => infer TData
+ throwOnError?: ThrowOnError
+ }
+ ? GetDefinedOrUndefinedQueryResult<
+ T,
+ unknown extends TData ? TQueryFnData : TData,
+ unknown extends TError ? DefaultError : TError
+ >
+ : // Fallback
+ UseQueryResult
+
+/**
+ * QueriesOptions reducer recursively unwraps function arguments to infer/enforce type param
+ */
+export type QueriesOptions<
+ T extends Array,
+ TResults extends Array = [],
+ TDepth extends ReadonlyArray = [],
+> = TDepth['length'] extends MAXIMUM_DEPTH
+ ? Array
+ : T extends []
+ ? []
+ : T extends [infer Head]
+ ? [...TResults, GetUseQueryOptionsForUseQueries]
+ : T extends [infer Head, ...infer Tails]
+ ? QueriesOptions<
+ [...Tails],
+ [...TResults, GetUseQueryOptionsForUseQueries],
+ [...TDepth, 1]
+ >
+ : ReadonlyArray extends T
+ ? T
+ : // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogenous type!
+ // use this to infer the param types in the case of Array.map() argument
+ T extends Array<
+ UseQueryOptionsForUseQueries<
+ infer TQueryFnData,
+ infer TError,
+ infer TData,
+ infer TQueryKey
+ >
+ >
+ ? Array<
+ UseQueryOptionsForUseQueries<
+ TQueryFnData,
+ TError,
+ TData,
+ TQueryKey
+ >
+ >
+ : // Fallback
+ Array
+
+/**
+ * QueriesResults reducer recursively maps type param to results
+ */
+export type QueriesResults<
+ T extends Array,
+ TResults extends Array = [],
+ TDepth extends ReadonlyArray = [],
+> = TDepth['length'] extends MAXIMUM_DEPTH
+ ? Array
+ : T extends []
+ ? []
+ : T extends [infer Head]
+ ? [...TResults, GetUseQueryResult]
+ : T extends [infer Head, ...infer Tails]
+ ? QueriesResults<
+ [...Tails],
+ [...TResults, GetUseQueryResult],
+ [...TDepth, 1]
+ >
+ : { [K in keyof T]: GetUseQueryResult }
diff --git a/packages/octane-query/src/queryOptions.ts b/packages/octane-query/src/queryOptions.ts
new file mode 100644
index 00000000000..b42e41d1a5b
--- /dev/null
+++ b/packages/octane-query/src/queryOptions.ts
@@ -0,0 +1,88 @@
+// Verbatim port of @tanstack/react-query's queryOptions.ts — a typed identity helper
+import type {
+ DataTag,
+ DefaultError,
+ InitialDataFunction,
+ NonUndefinedGuard,
+ OmitKeyof,
+ QueryFunction,
+ QueryKey,
+ SkipToken,
+} from '@tanstack/query-core'
+import type { UseQueryOptions } from './types'
+
+export type UndefinedInitialDataOptions<
+ TQueryFnData = unknown,
+ TError = DefaultError,
+ TData = TQueryFnData,
+ TQueryKey extends QueryKey = QueryKey,
+> = UseQueryOptions & {
+ initialData?:
+ | undefined
+ | InitialDataFunction>
+ | NonUndefinedGuard
+}
+
+export type UnusedSkipTokenOptions<
+ TQueryFnData = unknown,
+ TError = DefaultError,
+ TData = TQueryFnData,
+ TQueryKey extends QueryKey = QueryKey,
+> = OmitKeyof<
+ UseQueryOptions,
+ 'queryFn'
+> & {
+ queryFn?: Exclude<
+ UseQueryOptions['queryFn'],
+ SkipToken | undefined
+ >
+}
+
+export type DefinedInitialDataOptions<
+ TQueryFnData = unknown,
+ TError = DefaultError,
+ TData = TQueryFnData,
+ TQueryKey extends QueryKey = QueryKey,
+> = Omit, 'queryFn'> & {
+ initialData:
+ | NonUndefinedGuard
+ | (() => NonUndefinedGuard)
+ queryFn?: QueryFunction
+}
+
+export function queryOptions<
+ TQueryFnData = unknown,
+ TError = DefaultError,
+ TData = TQueryFnData,
+ TQueryKey extends QueryKey = QueryKey,
+>(
+ options: DefinedInitialDataOptions,
+): DefinedInitialDataOptions & {
+ queryKey: DataTag
+}
+
+export function queryOptions<
+ TQueryFnData = unknown,
+ TError = DefaultError,
+ TData = TQueryFnData,
+ TQueryKey extends QueryKey = QueryKey,
+>(
+ options: UnusedSkipTokenOptions,
+): UnusedSkipTokenOptions & {
+ queryKey: DataTag
+}
+
+export function queryOptions<
+ TQueryFnData = unknown,
+ TError = DefaultError,
+ TData = TQueryFnData,
+ TQueryKey extends QueryKey = QueryKey,
+>(
+ options: UndefinedInitialDataOptions,
+): UndefinedInitialDataOptions & {
+ queryKey: DataTag
+}
+
+export function queryOptions(options: unknown) {
+ return options
+}
diff --git a/packages/octane-query/src/suspense-queries-types.ts b/packages/octane-query/src/suspense-queries-types.ts
new file mode 100644
index 00000000000..eeff73b00bd
--- /dev/null
+++ b/packages/octane-query/src/suspense-queries-types.ts
@@ -0,0 +1,161 @@
+// The useSuspenseQueries option/result tuple types — a 1:1 port of the type
+// block in @tanstack/react-query's useSuspenseQueries.ts (pure query-core
+// generics, no React).
+import type { UseSuspenseQueryOptions, UseSuspenseQueryResult } from './types'
+import type {
+ DefaultError,
+ QueryFunction,
+ ThrowOnError,
+} from '@tanstack/query-core'
+
+// Avoid TS depth-limit error in case of large array literal
+type MAXIMUM_DEPTH = 20
+
+// Widen the type of the symbol to enable type inference even if skipToken is not immutable.
+type SkipTokenForUseQueries = symbol
+
+export type GetUseSuspenseQueryOptions =
+ // Part 1: responsible for applying explicit type parameter to function arguments, if object { queryFnData: TQueryFnData, error: TError, data: TData }
+ T extends {
+ queryFnData: infer TQueryFnData
+ error?: infer TError
+ data: infer TData
+ }
+ ? UseSuspenseQueryOptions
+ : T extends { queryFnData: infer TQueryFnData; error?: infer TError }
+ ? UseSuspenseQueryOptions
+ : T extends { data: infer TData; error?: infer TError }
+ ? UseSuspenseQueryOptions