chore: bump unreleased docs dates, squash pending changesets - #1051
Conversation
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (3)
💤 Files with no reviewable changes (3)
📝 WalkthroughWalkthroughThis PR consolidates broad TanStack AI release notes into ChangesRelease metadata consolidation
Estimated code review effort: 3 (Moderate) | ~20 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 6
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
.changeset/unreleased.md (1)
992-1017: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick winSeparate the OpenRouter summary from the chat identity summary.
Line [992] introduces “Update model metadata from OpenRouter API,” but lines [994]-[1017] describe only removal of the chat hook
idoption.Add the missing OpenRouter details or move the heading. Add a separate heading for the chat identity change so the consolidated release notes retain the correct summaries.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.changeset/unreleased.md around lines 992 - 1017, Separate the release-note entries so “Update model metadata from OpenRouter API” has its own corresponding details, and add a distinct heading for the chat hook identity changes described in the current paragraph. Keep the existing threadId/id migration details under the new chat identity heading.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.changeset/unreleased.md:
- Around line 181-185: Clarify the changelog with one deterministic run ID
formula, explicitly stating whether it uses the provider or adapter together
with jobId. Ensure both generateVideo() and getVideoJobStatus() descriptions
reference that exact same formula, including the same identifier source and
ordering, so polling always resumes the submitted run.
- Around line 653-657: Update the persistence package bullet in the unreleased
changeset to remove LockStore, withLocks, and InMemoryLockStore from
`@tanstack/ai-persistence`, directing users to `@tanstack/ai/locks` instead;
preserve the stated persistence APIs and surrounding release notes.
- Around line 171-175: Update the later “no public API change” statement to
acknowledge that summarize() now accepts middleware and GenerationActivity
includes “summarize”; limit the claim to the resumability change, or explicitly
include these middleware API changes in the migration notes.
- Around line 248-252: Update the Memory tab description in the unreleased
changeset to use the final threadId-based scope terminology instead of
“session,” including the related text at the referenced later section. Ensure
the wording distinguishes telemetry scope from the removed sessionId identity
field.
- Around line 65-67: Update the persistence documentation to describe both
hydration paths: server-authoritative persistence requires either the server GET
endpoint reconstructChat or an explicitly supplied
hydrateGeneration/stream/rpcStream handler when no HTTP endpoint exists. Clarify
that automatic restore is not available without one of these options, and keep
the framework integration and adapter descriptions unchanged.
- Around line 320-324: Remove the "optional, feature-detected" language from the
RunStore.findActiveRun description in lines 320-324 to align with the
required-method guidance stated in lines 874-891. This ensures adapter
developers reading the earlier section understand that RunStore.findActiveRun is
a required method, not an optional one, preventing them from omitting it and
encountering compilation or conformance failures.
---
Outside diff comments:
In @.changeset/unreleased.md:
- Around line 992-1017: Separate the release-note entries so “Update model
metadata from OpenRouter API” has its own corresponding details, and add a
distinct heading for the chat hook identity changes described in the current
paragraph. Keep the existing threadId/id migration details under the new chat
identity heading.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 6dbe8f9a-ac25-4aae-9dd6-55954a40dc96
📒 Files selected for processing (52)
.changeset/ag-ui-interrupts.md.changeset/artifact-persistence-options-rename.md.changeset/client-browser-refresh-durability.md.changeset/client-declined-generation-restore.md.changeset/client-generation-hydration-errors.md.changeset/client-truncated-generation-stream.md.changeset/client-typed-storage-adapter-defaults.md.changeset/conformance-generation-stores.md.changeset/core-jsdoc-server-fn-example.md.changeset/core-result-transforms-required.md.changeset/core-summarize-generation-middleware.md.changeset/core-video-job-run-lifecycle.md.changeset/define-lock.md.changeset/define-store-helpers.md.changeset/deprecate-generation-id.md.changeset/devtools-memory-inspector.md.changeset/durable-runs-survive-disconnect.md.changeset/fast-fail-rejoin.md.changeset/fresh-client-tail.md.changeset/generate-video-result-transforms.md.changeset/generation-mount-hydration-and-speech-restore.md.changeset/generation-persistence-server-only.md.changeset/generation-persistence.md.changeset/generation-rejoin-settles-to-error.md.changeset/generation-run-status-matches-run-status.md.changeset/generation-run-threadid-required.md.changeset/generation-threadid-from-the-activity.md.changeset/hooks-angular-chat-option-parity.md.changeset/hooks-expose-run-id.md.changeset/hooks-generation-persistence-docs.md.changeset/interrupt-binding-ownership.md.changeset/interrupts-validation-ownership.md.changeset/locks-to-core.md.changeset/max-tool-calls-middleware.md.changeset/memory-middleware.md.changeset/memory-scope-threadid.md.changeset/memorystream-agent-loop-delivery.md.changeset/openai-reasoning-sampling.md.changeset/persistence-packages.md.changeset/rejoin-not-aborted-on-mount.md.changeset/resumable-streams.md.changeset/run-store-find-active-run-required.md.changeset/sandbox-durability.md.changeset/seamless-reload-resume.md.changeset/server-function-generation-persistence.md.changeset/shared-scope.md.changeset/skill-discoverability.md.changeset/summarize-resumable.md.changeset/sync-models.md.changeset/unreleased.md.changeset/usechat-threadid-identity.mddocs/config.json
💤 Files with no reviewable changes (50)
- .changeset/define-lock.md
- .changeset/ag-ui-interrupts.md
- .changeset/artifact-persistence-options-rename.md
- .changeset/durable-runs-survive-disconnect.md
- .changeset/core-summarize-generation-middleware.md
- .changeset/run-store-find-active-run-required.md
- .changeset/max-tool-calls-middleware.md
- .changeset/memory-middleware.md
- .changeset/generation-run-threadid-required.md
- .changeset/locks-to-core.md
- .changeset/memorystream-agent-loop-delivery.md
- .changeset/fast-fail-rejoin.md
- .changeset/hooks-generation-persistence-docs.md
- .changeset/generation-mount-hydration-and-speech-restore.md
- .changeset/define-store-helpers.md
- .changeset/sync-models.md
- .changeset/conformance-generation-stores.md
- .changeset/generation-run-status-matches-run-status.md
- .changeset/generation-persistence.md
- .changeset/fresh-client-tail.md
- .changeset/persistence-packages.md
- .changeset/core-jsdoc-server-fn-example.md
- .changeset/client-typed-storage-adapter-defaults.md
- .changeset/seamless-reload-resume.md
- .changeset/openai-reasoning-sampling.md
- .changeset/deprecate-generation-id.md
- .changeset/generation-rejoin-settles-to-error.md
- .changeset/client-generation-hydration-errors.md
- .changeset/generate-video-result-transforms.md
- .changeset/core-result-transforms-required.md
- .changeset/summarize-resumable.md
- .changeset/server-function-generation-persistence.md
- .changeset/client-declined-generation-restore.md
- .changeset/sandbox-durability.md
- .changeset/interrupt-binding-ownership.md
- .changeset/memory-scope-threadid.md
- .changeset/rejoin-not-aborted-on-mount.md
- .changeset/shared-scope.md
- .changeset/resumable-streams.md
- .changeset/interrupts-validation-ownership.md
- .changeset/client-browser-refresh-durability.md
- .changeset/generation-persistence-server-only.md
- .changeset/generation-threadid-from-the-activity.md
- .changeset/skill-discoverability.md
- .changeset/hooks-expose-run-id.md
- .changeset/core-video-job-run-lifecycle.md
- .changeset/usechat-threadid-identity.md
- .changeset/hooks-angular-chat-option-parity.md
- .changeset/client-truncated-generation-stream.md
- .changeset/devtools-memory-inspector.md
| The `persistence` option also accepts `true` for a server-authoritative chat: the client caches nothing, and on mount it hydrates the thread from the server by its `threadId` (painting the stored transcript and tailing any run still generating). Use it to keep large transcripts off the client while the server stays authoritative for history; it needs a connection with a `hydrate` handler and a server GET endpoint (`reconstructChat`). Passing an adapter is client-authoritative; omitting `persistence` (or `false`) is ephemeral, in-memory only. | ||
|
|
||
| New web storage adapters are exported for this: `localStoragePersistence`, `sessionStoragePersistence`, and `indexedDBPersistence` (plus `StorageUnavailableError` and the `ChatPersistedState` / `ChatStorageAdapter` / `ChatPersistenceOption` types). Because durability rides the existing `persistence` option, every framework integration (`react`, `solid`, `vue`, `svelte`, `angular`, `preact`) gets it with no framework-specific code. |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Document both supported hydration paths.
Line [65] says server-authoritative persistence requires a server GET endpoint. Line [400] says every built-in connection has a hydrateGeneration handler. Lines [918]-[922] add lightweight stream() / rpcStream() handlers that must be supplied when no HTTP endpoint exists.
State the final requirement as “an HTTP endpoint or an explicitly supplied handler.” Otherwise users can expect automatic restore and receive a warning or no-op.
Also applies to: 397-401, 918-922
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In @.changeset/unreleased.md around lines 65 - 67, Update the persistence
documentation to describe both hydration paths: server-authoritative persistence
requires either the server GET endpoint reconstructChat or an explicitly
supplied hydrateGeneration/stream/rpcStream handler when no HTTP endpoint
exists. Clarify that automatic restore is not available without one of these
options, and keep the framework integration and adapter descriptions unchanged.
| `summarize()` accepts generation middleware, so summaries can be persisted. | ||
|
|
||
| `useSummarize({ persistence: true, threadId })` type-checked exactly like the six media hooks, but `summarize()` took no `middleware`, so no library path could ever write its run record and a reload restored nothing. It now takes `middleware` like the `generate*` activities: one `onStart`, the result transforms applied to the `SummarizationResult`, then `onFinish` / `onError`, in both streaming and non-streaming mode (a consumer that disconnects mid-summary fires `onAbort`). In streaming mode the transformed result is what is yielded, so the client and the persisted record hold the same object. | ||
|
|
||
| `GenerationActivity` gained `'summarize'`, and `otelMiddleware` maps it to the `summarize` operation name. Summaries are text, so there are no artifacts: a persistence middleware stores the run record and its result and nothing else. |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Scope the “no public API change” claim.
Lines [171]-[175] add middleware to summarize() and add the summarize activity. Lines [979]-[983] say there is no public API change beyond runId and threadId.
Qualify the later statement as applying only to the resumability change, or include the middleware migration.
Also applies to: 979-983
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In @.changeset/unreleased.md around lines 171 - 175, Update the later “no public
API change” statement to acknowledge that summarize() now accepts middleware and
GenerationActivity includes “summarize”; limit the claim to the resumability
change, or explicitly include these middleware API changes in the migration
notes.
| Submitting a job now OPENS the run and `getVideoJobStatus()` closes it, with the two calls correlated by the provider's **`jobId`** — the one id a poller structurally cannot be missing, since it cannot poll without it. Nothing else has to be threaded through: | ||
|
|
||
| - `generateVideo()` (non-streaming) passes `threadId` and the prompt inputs to middleware, files the run under an id derived from the provider + `jobId`, applies the result transforms to the submission (so the run record captures the `jobId` and stays resumable from a later request or process), and fires **no terminal hook**. | ||
| - `getVideoJobStatus()` accepts `threadId` and `middleware`, and recomputes the same run id from `adapter` + `jobId`. On the poll that first observes a terminal job state it resumes that run, applies the result transforms — which is where persistence copies the video into the blob store and rewrites `url` to a durable one, so the returned result and the stored record carry the same urls — and fires `onFinish`, or `onError` when the job (or the url fetch) failed. Intermediate polls invoke nothing. Its result gained `jobId`, `expiresAt`, and `artifacts`; `VideoJobResult` gained `artifacts` (refs for persisted prompt INPUTS, e.g. a start frame). | ||
| - `runId` on a non-streaming `generateVideo()` call is **ignored** (it remains the wire run id in stream mode). The run id has to be recomputable by the poll from the `jobId` alone; honoring a custom one would reintroduce the failure this avoids — a caller who set it on the submit and forgot it on the poll would silently open a second record while the first sat unfinished forever. |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win
State one deterministic video run ID formula.
Line [183] says the run ID is derived from the provider and jobId. Line [185] says it must be recomputable from jobId alone.
Clarify whether the provider or adapter is part of the key. The submit and poll paths must use the exact same formula to avoid orphaned runs.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In @.changeset/unreleased.md around lines 181 - 185, Clarify the changelog with
one deterministic run ID formula, explicitly stating whether it uses the
provider or adapter together with jobId. Ensure both generateVideo() and
getVideoJobStatus() descriptions reference that exact same formula, including
the same identifier source and ordering, so polling always resumes the submitted
run.
| The DevTools panel now has a **Memory** tab for any chat wired with | ||
| `memoryMiddleware`. It shows, per scope (session), an operations timeline (each | ||
| turn's recall — query, fragment count, injected system-prompt size, whether | ||
| memory tools were exposed, duration) and the current stored records/facts when | ||
| the adapter implements the optional `inspect`/`listFacts` methods. |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win
Use the final memory scope terminology.
Line [249] describes the Memory tab as scoped by “session.” Lines [750]-[768] remove public sessionId and require threadId.
Replace “session” with the final threadId-based scope terminology. This prevents consumers from selecting the removed identity field or confusing telemetry scope with isolation scope.
Also applies to: 750-768
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In @.changeset/unreleased.md around lines 248 - 252, Update the Memory tab
description in the unreleased changeset to use the final threadId-based scope
terminology instead of “session,” including the related text at the referenced
later section. Ensure the wording distinguishes telemetry scope from the removed
sessionId identity field.
| - **`RunStore.findActiveRun(threadId)`** — new optional, feature-detected store | ||
| method returning the most recent `'running'` run for a thread. Implemented by | ||
| the in-memory reference backend and covered by the conformance testkit, so any | ||
| adapter that provides it is held to the same invariants (most-recent-running | ||
| wins, thread-scoped, null when idle). |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Use one findActiveRun contract.
Lines [320]-[324] describe RunStore.findActiveRun as optional. Lines [874]-[891] say it is required. An adapter following the earlier section will omit the method and then fail compilation or conformance checks.
Remove the stale optional description and keep the required-method migration guidance.
Also applies to: 874-891
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In @.changeset/unreleased.md around lines 320 - 324, Remove the "optional,
feature-detected" language from the RunStore.findActiveRun description in lines
320-324 to align with the required-method guidance stated in lines 874-891. This
ensures adapter developers reading the earlier section understand that
RunStore.findActiveRun is a required method, not an optional one, preventing
them from omitting it and encountering compilation or conformance failures.
| Move multi-instance **locks** to `@tanstack/ai` under a dedicated `@tanstack/ai/locks` subpath, and nest persistence agent skills like `ai-core`. | ||
|
|
||
| - **`LockStore` / `InMemoryLockStore` / `LocksCapability` / `getLocks` / `provideLocks` / `withLocks`** live in `@tanstack/ai/locks` (not the main `@tanstack/ai` barrel, and not `@tanstack/ai-persistence`). | ||
| - `@tanstack/ai-sandbox` consumes the core `LocksCapability` token (no local lock re-export). | ||
| - The locks agent skill moves with the code: `ai-core/locks` in `@tanstack/ai`, not `ai-persistence/locks`. |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Correct the lock package ownership.
Line [809] says @tanstack/ai-persistence ships LockStore, withLocks, and InMemoryLockStore. Lines [653]-[657] move these APIs to @tanstack/ai/locks and explicitly exclude them from persistence.
Update the persistence bullet so users do not import the locks from the wrong package.
Also applies to: 804-810
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In @.changeset/unreleased.md around lines 653 - 657, Update the persistence
package bullet in the unreleased changeset to remove LockStore, withLocks, and
InMemoryLockStore from `@tanstack/ai-persistence`, directing users to
`@tanstack/ai/locks` instead; preserve the stated persistence APIs and surrounding
release notes.
26b8c0a to
f775c5b
Compare
…ackages Three housekeeping changes before the next release. Docs dates: every page added after the last release commit (55db7d4) is not on npm yet, so its `addedAt` is today. Their `updatedAt` is dropped — a page that ships today was never updated in public. 34 pages. Changesets: the 70 pending changesets are merged into one. The package list is the union of all of them, and each package keeps its highest bump level, so the release is identical (31 packages: 20 minor, 11 patch, 0 major). Every summary is kept in the body. New packages: `ai-byteplus`, `ai-durable-stream`, `ai-memory` and `ai-persistence` now carry `publishConfig.access: "public"`, and their versions match what is on npm after the first manual publish. npm can only attach a trusted publisher to a package that already exists, so the first version had to be published by hand; every release after this one goes through OIDC like the other packages.
|
View your CI Pipeline Execution ↗ for commit f775c5b
☁️ Nx Cloud last updated this comment at |
@tanstack/ai
@tanstack/ai-acp
@tanstack/ai-angular
@tanstack/ai-anthropic
@tanstack/ai-bedrock
@tanstack/ai-byteplus
@tanstack/ai-claude-code
@tanstack/ai-client
@tanstack/ai-code-mode
@tanstack/ai-code-mode-skills
@tanstack/ai-codex
@tanstack/ai-devtools-core
@tanstack/ai-durable-stream
@tanstack/ai-elevenlabs
@tanstack/ai-event-client
@tanstack/ai-fal
@tanstack/ai-gemini
@tanstack/ai-grok
@tanstack/ai-grok-build
@tanstack/ai-groq
@tanstack/ai-isolate-cloudflare
@tanstack/ai-isolate-node
@tanstack/ai-isolate-quickjs
@tanstack/ai-mcp
@tanstack/ai-memory
@tanstack/ai-mistral
@tanstack/ai-ollama
@tanstack/ai-openai
@tanstack/ai-opencode
@tanstack/ai-openrouter
@tanstack/ai-persistence
@tanstack/ai-preact
@tanstack/ai-react
@tanstack/ai-react-ui
@tanstack/ai-sandbox
@tanstack/ai-sandbox-cloudflare
@tanstack/ai-sandbox-daytona
@tanstack/ai-sandbox-docker
@tanstack/ai-sandbox-local-process
@tanstack/ai-sandbox-sprites
@tanstack/ai-sandbox-vercel
@tanstack/ai-solid
@tanstack/ai-solid-ui
@tanstack/ai-svelte
@tanstack/ai-utils
@tanstack/ai-vue
@tanstack/ai-vue-ui
@tanstack/openai-base
@tanstack/preact-ai-devtools
@tanstack/react-ai-devtools
@tanstack/solid-ai-devtools
commit: |
It was only needed for the first manual `npm publish`, which is done. The release publishes through changesets, and `.changeset/config.json` already sets `"access": "public"`.
What
Two housekeeping changes before the next release.
1. Docs dates. Every docs page added after the last release commit (
55db7d458,ci: Version Packages) is not on npm yet, so itsaddedAtnow points to today (2026-08-04). TheirupdatedAtis removed — a page that ships today was never updated in public.25 pages:
interrupts/*(5),resumable-streams/*(3),persistence/*(10),memory/*(5),advanced/locks,sandbox/durability.2. One changeset. The 50 pending changesets are merged into
.changeset/unreleased.md. The package list is the union of all of them, and each package keeps its highest bump level. Every summary is kept in the body, so no release note is lost.Verification
pnpm changeset statusbefore and after the merge produce the same per-level bump lists (19 packages: 15 minor, 4 patch, 0 major).pnpm test:docs— no broken links.docs/config.jsonstill parses as JSON.Note
Because it is one changeset now, each package's CHANGELOG entry will carry the full combined body, including notes about other packages. That is the trade-off of squashing.
Summary by CodeRabbit
Chores
@tanstack/ai-byteplus,@tanstack/ai-durable-stream, and@tanstack/ai-memoryDocumentation