mirror of
https://github.com/langchain-ai/langgraphjs.git
synced 2026-07-21 08:35:23 -04:00
@langchain/angular@1.0.22
2967 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
34a01255e1 |
chore: version packages (#2524)
This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated. # Releases ## @langchain/langgraph-supervisor@1.1.0 ### Minor Changes - [#2521](https://github.com/langchain-ai/langgraphjs/pull/2521) [`56682a6`](https://github.com/langchain-ai/langgraphjs/commit/56682a69a24d0dfb210f1fb5187c51e3adc356bf) Thanks [@open-swe](https://github.com/apps/open-swe)! - feat(langgraph-supervisor): Add `addHandoffMessages` to `createSupervisor` and `createHandoffTool`, allowing supervisor-to-agent handoff bookkeeping messages to be omitted from the expert agent's message history. When `addHandoffBackMessages` is not provided, it now defaults to the same value as `addHandoffMessages`, matching the Python package behavior. `createHandoffTool` now also accepts `description` as the preferred option name while continuing to support the existing `agentDescription` option as deprecated for backwards compatibility. ### Patch Changes - [#2407](https://github.com/langchain-ai/langgraphjs/pull/2407) [`59d4765`](https://github.com/langchain-ai/langgraphjs/commit/59d4765870bc0cddf3ef594b128ab3280533cb6c) Thanks [@pragnyanramtha](https://github.com/pragnyanramtha)! - Normalize all whitespace in supervisor handoff tool names. ## @langchain/langgraph@1.4.1 ### Patch Changes - [#2520](https://github.com/langchain-ai/langgraphjs/pull/2520) [`2da5c33`](https://github.com/langchain-ai/langgraphjs/commit/2da5c3374f7b91ba0afa607c507e2ff1591baca7) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(state): validate Zod state updates from nodes Validate node return values and Command updates against Zod state schema constraints before applying them to graph state. Fixes [#2519](https://github.com/langchain-ai/langgraphjs/issues/2519) - [#2511](https://github.com/langchain-ai/langgraphjs/pull/2511) [`ef04db3`](https://github.com/langchain-ai/langgraphjs/commit/ef04db316d680ab32b812c88cadda75638294dd3) Thanks [@christian-bromann](https://github.com/christian-bromann)! - feat(ToolNode): forward graph state to tools via `runtime.state` `ToolNode` now forwards its input to each tool through the second argument as `runtime.state`. When using `ToolNode` as a node in a LangGraph graph, this gives tools access to the current graph state for workflows that need tool-call support in LangGraph proper. Tools can type the second parameter as `ToolRuntime<StateType>` from `@langchain/core/tools` and read `runtime.state` directly. This works in every runtime, including web browsers, and removes the need for `getCurrentTaskInput()` (which relies on `node:async_hooks`/`AsyncLocalStorage`). `getCurrentTaskInput(config)` continues to work for backwards compatibility. - Updated dependencies \[[`3855985`](https://github.com/langchain-ai/langgraphjs/commit/3855985dd049739f145295d236ce6aa02ae2fb0e), [`7c3e9e9`](https://github.com/langchain-ai/langgraphjs/commit/7c3e9e93f3c7ec1dc654dac8ee8c03562ee8337b), [`17c44a3`](https://github.com/langchain-ai/langgraphjs/commit/17c44a38b7478e2bc4fe908a54c78ef33fb68ba3)]: - @langchain/langgraph-sdk@1.9.21 ## @langchain/langgraph-sdk@1.9.21 ### Patch Changes - [#2522](https://github.com/langchain-ai/langgraphjs/pull/2522) [`3855985`](https://github.com/langchain-ai/langgraphjs/commit/3855985dd049739f145295d236ce6aa02ae2fb0e) Thanks [@christian-bromann](https://github.com/christian-bromann)! - feat(stream): add per-event side-effect selector Add `useChannelEffect` (React/Svelte/Vue) / `injectChannelEffect` (Angular), a side-effect counterpart to `useChannel` that invokes an `onEvent` callback once per raw protocol event without re-rendering. This is the idiomatic v1 replacement for the old `onLangChainEvent` / `onCustomEvent` callbacks for analytics and logging. Backed by a new framework-agnostic `acquireChannelEffect` helper in `@langchain/langgraph-sdk/stream` that shares a ref-counted subscription with matching `useChannel` consumers. - [#2523](https://github.com/langchain-ai/langgraphjs/pull/2523) [`7c3e9e9`](https://github.com/langchain-ai/langgraphjs/commit/7c3e9e93f3c7ec1dc654dac8ee8c03562ee8337b) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(sdk): stop re-streaming seeded messages on idle-thread submit An idle (finished) thread defers its root SSE pump, so the first `submit()` brings it up and the transport replays the finished run from `seq=0`. The replayed `messages` channel carries no step (unlike `values`, guarded by `maxStep`), so it rebuilt each already-complete message from an empty `message-start` and re-streamed the whole turn token-by-token — a visible "messages replay" of the existing conversation. Seal the message ids seeded from the idle `getState()` snapshot so replayed deltas can't downgrade the complete tail; the seal lifts once a newer checkpoint advances the timeline or on thread rebind, and ids from the next run are never sealed. - [#2462](https://github.com/langchain-ai/langgraphjs/pull/2462) [`17c44a3`](https://github.com/langchain-ai/langgraphjs/commit/17c44a38b7478e2bc4fe908a54c78ef33fb68ba3) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(sdk): reconnect v2 SSE and WebSocket thread streams after disconnect Add automatic reconnect with resume (`since` for SSE) for protocol transports, wire `AsyncCaller` through `client.threads.stream`, and expose optional reconnect tuning on `ThreadStreamOptions`. Includes integration tests against an in-process mock langgraph-api server. ## @langchain/angular@1.0.22 ### Patch Changes - [#2522](https://github.com/langchain-ai/langgraphjs/pull/2522) [`3855985`](https://github.com/langchain-ai/langgraphjs/commit/3855985dd049739f145295d236ce6aa02ae2fb0e) Thanks [@christian-bromann](https://github.com/christian-bromann)! - feat(stream): add per-event side-effect selector Add `useChannelEffect` (React/Svelte/Vue) / `injectChannelEffect` (Angular), a side-effect counterpart to `useChannel` that invokes an `onEvent` callback once per raw protocol event without re-rendering. This is the idiomatic v1 replacement for the old `onLangChainEvent` / `onCustomEvent` callbacks for analytics and logging. Backed by a new framework-agnostic `acquireChannelEffect` helper in `@langchain/langgraph-sdk/stream` that shares a ref-counted subscription with matching `useChannel` consumers. - Updated dependencies \[[`3855985`](https://github.com/langchain-ai/langgraphjs/commit/3855985dd049739f145295d236ce6aa02ae2fb0e), [`7c3e9e9`](https://github.com/langchain-ai/langgraphjs/commit/7c3e9e93f3c7ec1dc654dac8ee8c03562ee8337b), [`17c44a3`](https://github.com/langchain-ai/langgraphjs/commit/17c44a38b7478e2bc4fe908a54c78ef33fb68ba3)]: - @langchain/langgraph-sdk@1.9.21 ## @langchain/react@1.0.22 ### Patch Changes - [#2522](https://github.com/langchain-ai/langgraphjs/pull/2522) [`3855985`](https://github.com/langchain-ai/langgraphjs/commit/3855985dd049739f145295d236ce6aa02ae2fb0e) Thanks [@christian-bromann](https://github.com/christian-bromann)! - feat(stream): add per-event side-effect selector Add `useChannelEffect` (React/Svelte/Vue) / `injectChannelEffect` (Angular), a side-effect counterpart to `useChannel` that invokes an `onEvent` callback once per raw protocol event without re-rendering. This is the idiomatic v1 replacement for the old `onLangChainEvent` / `onCustomEvent` callbacks for analytics and logging. Backed by a new framework-agnostic `acquireChannelEffect` helper in `@langchain/langgraph-sdk/stream` that shares a ref-counted subscription with matching `useChannel` consumers. - Updated dependencies \[[`3855985`](https://github.com/langchain-ai/langgraphjs/commit/3855985dd049739f145295d236ce6aa02ae2fb0e), [`7c3e9e9`](https://github.com/langchain-ai/langgraphjs/commit/7c3e9e93f3c7ec1dc654dac8ee8c03562ee8337b), [`17c44a3`](https://github.com/langchain-ai/langgraphjs/commit/17c44a38b7478e2bc4fe908a54c78ef33fb68ba3)]: - @langchain/langgraph-sdk@1.9.21 ## @langchain/svelte@1.0.22 ### Patch Changes - [#2522](https://github.com/langchain-ai/langgraphjs/pull/2522) [`3855985`](https://github.com/langchain-ai/langgraphjs/commit/3855985dd049739f145295d236ce6aa02ae2fb0e) Thanks [@christian-bromann](https://github.com/christian-bromann)! - feat(stream): add per-event side-effect selector Add `useChannelEffect` (React/Svelte/Vue) / `injectChannelEffect` (Angular), a side-effect counterpart to `useChannel` that invokes an `onEvent` callback once per raw protocol event without re-rendering. This is the idiomatic v1 replacement for the old `onLangChainEvent` / `onCustomEvent` callbacks for analytics and logging. Backed by a new framework-agnostic `acquireChannelEffect` helper in `@langchain/langgraph-sdk/stream` that shares a ref-counted subscription with matching `useChannel` consumers. - Updated dependencies \[[`3855985`](https://github.com/langchain-ai/langgraphjs/commit/3855985dd049739f145295d236ce6aa02ae2fb0e), [`7c3e9e9`](https://github.com/langchain-ai/langgraphjs/commit/7c3e9e93f3c7ec1dc654dac8ee8c03562ee8337b), [`17c44a3`](https://github.com/langchain-ai/langgraphjs/commit/17c44a38b7478e2bc4fe908a54c78ef33fb68ba3)]: - @langchain/langgraph-sdk@1.9.21 ## @langchain/vue@1.0.22 ### Patch Changes - [#2522](https://github.com/langchain-ai/langgraphjs/pull/2522) [`3855985`](https://github.com/langchain-ai/langgraphjs/commit/3855985dd049739f145295d236ce6aa02ae2fb0e) Thanks [@christian-bromann](https://github.com/christian-bromann)! - feat(stream): add per-event side-effect selector Add `useChannelEffect` (React/Svelte/Vue) / `injectChannelEffect` (Angular), a side-effect counterpart to `useChannel` that invokes an `onEvent` callback once per raw protocol event without re-rendering. This is the idiomatic v1 replacement for the old `onLangChainEvent` / `onCustomEvent` callbacks for analytics and logging. Backed by a new framework-agnostic `acquireChannelEffect` helper in `@langchain/langgraph-sdk/stream` that shares a ref-counted subscription with matching `useChannel` consumers. - Updated dependencies \[[`3855985`](https://github.com/langchain-ai/langgraphjs/commit/3855985dd049739f145295d236ce6aa02ae2fb0e), [`7c3e9e9`](https://github.com/langchain-ai/langgraphjs/commit/7c3e9e93f3c7ec1dc654dac8ee8c03562ee8337b), [`17c44a3`](https://github.com/langchain-ai/langgraphjs/commit/17c44a38b7478e2bc4fe908a54c78ef33fb68ba3)]: - @langchain/langgraph-sdk@1.9.21 ## @example/ai-elements@0.1.37 ### Patch Changes - Updated dependencies \[[`3855985`](https://github.com/langchain-ai/langgraphjs/commit/3855985dd049739f145295d236ce6aa02ae2fb0e), [`2da5c33`](https://github.com/langchain-ai/langgraphjs/commit/2da5c3374f7b91ba0afa607c507e2ff1591baca7), [`ef04db3`](https://github.com/langchain-ai/langgraphjs/commit/ef04db316d680ab32b812c88cadda75638294dd3)]: - @langchain/react@1.0.22 - @langchain/langgraph@1.4.1 ## @examples/assistant-ui-claude@0.1.37 ### Patch Changes - Updated dependencies \[[`3855985`](https://github.com/langchain-ai/langgraphjs/commit/3855985dd049739f145295d236ce6aa02ae2fb0e), [`2da5c33`](https://github.com/langchain-ai/langgraphjs/commit/2da5c3374f7b91ba0afa607c507e2ff1591baca7), [`ef04db3`](https://github.com/langchain-ai/langgraphjs/commit/ef04db316d680ab32b812c88cadda75638294dd3)]: - @langchain/react@1.0.22 - @langchain/langgraph@1.4.1 ## @examples/ui-angular@0.0.47 ### Patch Changes - Updated dependencies \[[`3855985`](https://github.com/langchain-ai/langgraphjs/commit/3855985dd049739f145295d236ce6aa02ae2fb0e), [`7c3e9e9`](https://github.com/langchain-ai/langgraphjs/commit/7c3e9e93f3c7ec1dc654dac8ee8c03562ee8337b), [`2da5c33`](https://github.com/langchain-ai/langgraphjs/commit/2da5c3374f7b91ba0afa607c507e2ff1591baca7), [`ef04db3`](https://github.com/langchain-ai/langgraphjs/commit/ef04db316d680ab32b812c88cadda75638294dd3), [`17c44a3`](https://github.com/langchain-ai/langgraphjs/commit/17c44a38b7478e2bc4fe908a54c78ef33fb68ba3)]: - @langchain/langgraph-sdk@1.9.21 - @langchain/angular@1.0.22 - @langchain/langgraph@1.4.1 ## @examples/ui-multimodal@0.0.23 ### Patch Changes - Updated dependencies \[[`3855985`](https://github.com/langchain-ai/langgraphjs/commit/3855985dd049739f145295d236ce6aa02ae2fb0e), [`2da5c33`](https://github.com/langchain-ai/langgraphjs/commit/2da5c3374f7b91ba0afa607c507e2ff1591baca7), [`ef04db3`](https://github.com/langchain-ai/langgraphjs/commit/ef04db316d680ab32b812c88cadda75638294dd3)]: - @langchain/react@1.0.22 - @langchain/langgraph@1.4.1 ## @examples/ui-react@0.0.23 ### Patch Changes - Updated dependencies \[[`3855985`](https://github.com/langchain-ai/langgraphjs/commit/3855985dd049739f145295d236ce6aa02ae2fb0e), [`7c3e9e9`](https://github.com/langchain-ai/langgraphjs/commit/7c3e9e93f3c7ec1dc654dac8ee8c03562ee8337b), [`2da5c33`](https://github.com/langchain-ai/langgraphjs/commit/2da5c3374f7b91ba0afa607c507e2ff1591baca7), [`ef04db3`](https://github.com/langchain-ai/langgraphjs/commit/ef04db316d680ab32b812c88cadda75638294dd3), [`17c44a3`](https://github.com/langchain-ai/langgraphjs/commit/17c44a38b7478e2bc4fe908a54c78ef33fb68ba3)]: - @langchain/langgraph-sdk@1.9.21 - @langchain/react@1.0.22 - @langchain/langgraph@1.4.1 ## langgraph@1.0.41 ### Patch Changes - Updated dependencies \[[`2da5c33`](https://github.com/langchain-ai/langgraphjs/commit/2da5c3374f7b91ba0afa607c507e2ff1591baca7), [`ef04db3`](https://github.com/langchain-ai/langgraphjs/commit/ef04db316d680ab32b812c88cadda75638294dd3)]: - @langchain/langgraph@1.4.1 Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>@langchain/angular@1.0.22 @langchain/langgraph-sdk@1.9.21 @langchain/langgraph-supervisor@1.1.0 @langchain/langgraph@1.4.1 @langchain/react@1.0.22 @langchain/svelte@1.0.22 @langchain/vue@1.0.22 |
||
|
|
febba20e49 | fix(internal): update changelog | ||
|
|
17c44a38b7 |
fix(sdk): reconnect v2 SSE and WebSocket thread streams after disconnect (#2462)
## Summary - Add automatic reconnect for v2 `ProtocolSseTransportAdapter` and `ProtocolWebSocketTransportAdapter` (resume via `since` on SSE, full buffer replay on WebSocket, with `MaxWebSocketReconnectAttemptsError` when the budget is exceeded). - Wire `AsyncCaller` and reconnect defaults through `client.threads.stream`, with optional `maxReconnectAttempts`, `reconnectDelayMs`, and `onReconnect` on `ThreadStreamOptions`. - Disable auto-reconnect when a custom `fetch` is passed (test/mocks), and add `pnpm test:int` integration tests using `client.threads.stream` + `run.start` against an in-process mock server. --------- Co-authored-by: open-swe[bot] <open-swe@users.noreply.github.com> Co-authored-by: Cursor <cursoragent@cursor.com> |
||
|
|
59d4765870 |
fix(langgraph-supervisor): normalize handoff tool whitespace (#2407)
## Summary - normalize all whitespace runs in supervisor handoff agent names - prevent generated handoff tool names from retaining spaces after the first normalized segment - add focused coverage for a multi-word agent name and a patch changeset for `@langchain/langgraph-supervisor` ## Validation - `git diff --check` -> passed - `pnpm --dir libs/langgraph-supervisor exec vitest run src/tests/supervisor.test.ts` -> 5 passed - `pnpm --filter @langchain/langgraph-supervisor build:internal` -> passed, including `attw` and `publint` ## Notes The sibling `langgraph-swarm` handoff helper already uses global whitespace replacement; this aligns supervisor handoff naming with that behavior. Co-authored-by: Christian Bromann <git@bromann.dev> |
||
|
|
2da5c3374f |
fix(langgraph): validate Zod state updates from nodes (#2520)
## Summary - Validates StateGraph node return values and Command updates against Zod state schema constraints before applying writes. - Preserves Overwrite behavior by validating reducer overwrites against stored value schemas. - Adds regression coverage for invalid Zod node returns and Command updates. Fixes #2519 --------- Co-authored-by: open-swe[bot] <open-swe@users.noreply.github.com> |
||
|
|
7c3e9e93f3 |
fix(sdk): stop re-streaming seeded messages on idle-thread submit (#2523)
## Summary - Fixes a visible "messages replay" where opening a finished thread and submitting re-streamed every existing message token-by-token. - Root cause: an idle thread defers its root SSE pump, so the first `submit()` replays the finished run from `seq=0`. The `messages` channel carries no step (unlike `values`, guarded by `#maxStep`), so it rebuilt each already-complete message from an empty `message-start`, clobbering the tail seeded from `getState()`. - Adds a message-id seal in `RootMessageProjection`: ids seeded from an idle thread's `getState()` snapshot drop replayed `messages` deltas in `handleMessage()`. The seal is cleared on thread rebind (`reset()`) and lifts in `applyValues()` once a strictly-newer checkpoint `step` advances the timeline past the seed. `controller.hydrate()` only seals for idle threads (`!threadActive`) — active threads keep streaming their live tail, and ids from the next run are never sealed. --------- Co-authored-by: open-swe[bot] <open-swe@users.noreply.github.com> |
||
|
|
3855985dd0 |
fix(sdk): add per-event channel effect selector (#2522)
## Summary - Add a side-effect counterpart to `useChannel`: `useChannelEffect` (React, Svelte, Vue) and `injectChannelEffect` (Angular). It invokes an `onEvent` callback once per raw protocol event and returns nothing, so it never re-renders — the idiomatic v1 replacement for the removed `onLangChainEvent` / `onCustomEvent` callbacks used for analytics/logging. - Back all four bindings with a new framework-agnostic `acquireChannelEffect(registry, channels, namespace, options)` helper in `@langchain/langgraph-sdk/stream`. It acquires the same ref-counted `channelProjection` as `useChannel` (so an effect consumer and a matching `useChannel` share one server subscription and survive thread swaps), diffs the shared store by event identity, skips events buffered before it attaches (no double-counting history on a late mount), and resets correctly across thread rebinds. - API matches the agreed shape with `target`, `enabled`, `replay` (defaults to `false`/live-only — opposite of `useChannel`), `bufferSize`, `onEvent`, and `onError`. Callbacks are read from a ref/lazy wrapper so fresh inline closures never re-subscribe. - Update selector docs and `v1-migration.md` in all four SDKs, noting the callback now receives v1 protocol events (`lifecycle.*`, `tools.*`, `messages.*`, `custom`) rather than legacy LangChain event names. --------- Co-authored-by: open-swe[bot] <open-swe@users.noreply.github.com> |
||
|
|
56682a69a2 |
feat(supervisor): add addHandoffMessages option [closes #2499] (#2521)
## Description Adds an `addHandoffMessages` option to `createSupervisor` and `createHandoffTool` (defaulting to `true` for backward compatibility). When `false`, the supervisor-to-agent handoff bookkeeping messages (the supervisor `AIMessage` with the handoff tool call and the handoff `ToolMessage`) are omitted from the expert agent's message history, matching the Python `langgraph-supervisor` behavior. This avoids invalid tool-call sequences for providers that strictly validate them. ## Release Note Add `addHandoffMessages` option to `@langchain/langgraph-supervisor` to omit supervisor-to-agent handoff messages from expert agent history. ## Test Plan - [ ] Verify expert agent history excludes handoff `AIMessage`/`ToolMessage` when `addHandoffMessages: false` Made by [Open SWE](https://openswe.vercel.app) closes #2499 --------- Co-authored-by: Christian Bromann <731337+christian-bromann@users.noreply.github.com> Co-authored-by: open-swe[bot] <open-swe@users.noreply.github.com> Co-authored-by: Christian Bromann <git@bromann.dev> |
||
|
|
ef04db316d |
docs: document first-class graph-state access for ToolNode tools (#2511)
Tools running inside a ToolNode can already read the current graph state via `getCurrentTaskInput()`, but this was not documented as a first-class option and the browser-safe variant (passing config explicitly) was not surfaced. This adds: - JSDoc on getCurrentTaskInput documenting the optional config arg and browser usage - A ToolNode JSDoc example showing how tools access graph state and runtime context - Browser-safe guidance in the agents context docs and the pass-run-time-values-to-tools how-to (`getCurrentTaskInput(config)`) - A regression test verifying a ToolNode tool can read graph state via getCurrentTaskInput(config) Closes #2506 |
||
|
|
39df14b11f |
chore: version packages (#2513)
This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated. # Releases ## @langchain/langgraph-checkpoint@1.1.0 ### Minor Changes - [#2452](https://github.com/langchain-ai/langgraphjs/pull/2452) [`a8e7659`](https://github.com/langchain-ai/langgraphjs/commit/a8e7659a9d22fd84425aaf26bda88667c76b185a) Thanks [@christian-bromann](https://github.com/christian-bromann)! - Add `DeltaChannel` and the writes-history saver API (beta). `DeltaChannel` is a reducer channel that stores only a sentinel in checkpoint blobs instead of the full accumulated value, reconstructing state on read by replaying ancestor writes through a batch reducer. This avoids re-serializing the entire accumulated value at every step (e.g. long message histories). - `DeltaChannel(reducer, { snapshotFrequency })` in `@langchain/langgraph` — count-based snapshot cadence (default `snapshotFrequency=1000`) plus a system bound `DELTA_MAX_SUPERSTEPS_SINCE_SNAPSHOT` (default 5000, env `LANGGRAPH_DELTA_MAX_SUPERSTEPS_SINCE_SNAPSHOT`). - `messagesDeltaReducer` — a batching-invariant messages reducer that coerces raw object/string writes, for use with `DeltaChannel`. - `BaseCheckpointSaver.getDeltaChannelHistory({ config, channels })` (beta) — walks the parent chain returning per-channel `{ writes, seed? }`, with a direct-storage override in `MemorySaver`. - `counters_since_delta_snapshot` added to `CheckpointMetadata`; `DeltaSnapshot` serialization support in the JSON+ serializer. Reconstruction is wired through the Pregel read/execution paths (initialization, `getState`, `updateState`, local reads) and `exit` durability accumulates and anchors delta writes so threads remain reconstructible without forcing snapshots. ### Patch Changes - [#2450](https://github.com/langchain-ai/langgraphjs/pull/2450) [`2f6d873`](https://github.com/langchain-ai/langgraphjs/commit/2f6d87368e590ae2fc2a7990fd13cb0a5fe3c198) Thanks [@christian-bromann](https://github.com/christian-bromann)! - Add node-level timeouts. A `timeout` option is now supported on `StateGraph.addNode`, the functional API (`task`/`entrypoint`), and the `Send` constructor. Pass a number of milliseconds for a hard wall-clock cap, or a `TimeoutPolicy` for finer control: ```ts import { TimeoutPolicy } from "@langchain/langgraph"; // hard wall-clock cap on each attempt builder.addNode("agent", agentFn, { timeout: 60_000 }); // full control builder.addNode("agent", agentFn, { timeout: { runTimeout: 60_000, // hard wall-clock cap, never refreshed idleTimeout: 10_000, // cap on time without observable progress refreshOn: "auto", // "auto" | "heartbeat" }, }); // per-task override new Send("agent", state, { timeout: { idleTimeout: 5_000 } }); ``` When a timeout fires, a `NodeTimeoutError` (carrying `node`, `kind` (`"run"`/`"idle"`), `timeout`, `elapsed`, `runTimeout`, `idleTimeout`) is raised, the attempt's buffered writes are dropped, and the node's `AbortSignal` is aborted. `idleTimeout` is refreshed by observable progress (writes, custom stream-writer calls, child-task scheduling, callback events) or an explicit `runtime.heartbeat()` call. The timer resets per retry attempt, and `NodeTimeoutError` is retryable under the default retry policy. Ports langchain-ai/langgraph#7599, [#7646](https://github.com/langchain-ai/langgraphjs/issues/7646), and [#7659](https://github.com/langchain-ai/langgraphjs/issues/7659). ## @langchain/langgraph@1.4.0 ### Minor Changes - [#2449](https://github.com/langchain-ai/langgraphjs/pull/2449) [`d12d269`](https://github.com/langchain-ai/langgraphjs/commit/d12d2693308e37951266bc8197daa656daa6e2aa) Thanks [@christian-bromann](https://github.com/christian-bromann)! - Add cooperative, between-superstep graph draining via `RunControl`. A new `RunControl` (exported from `@langchain/langgraph`) exposes `requestDrain(reason)` plus read-only `drainRequested` / `drainReason`. Pass it through the new `control` option on `invoke` / `stream` / `streamEvents` (and the functional API). It is surfaced on `runtime.control`, so nodes can read it or call `requestDrain()` themselves, and it is propagated into subgraphs. When a drain is requested, the Pregel loop checks the flag at the top of each superstep (after the previous step's writes are applied and checkpointed): if more tasks remain it saves the checkpoint and throws the new `GraphDrained` error (also under `durability: "exit"`), so the run can be resumed later from the same config. If the graph naturally finishes on that tick it returns normally and the caller can inspect `control.drainRequested`. A drain requested inside a subgraph bubbles up and stops the parent at its next boundary. Draining never cancels work that is already running — pair it with an `AbortSignal` if you need a hard upper bound. - [#2452](https://github.com/langchain-ai/langgraphjs/pull/2452) [`a8e7659`](https://github.com/langchain-ai/langgraphjs/commit/a8e7659a9d22fd84425aaf26bda88667c76b185a) Thanks [@christian-bromann](https://github.com/christian-bromann)! - Add `DeltaChannel` and the writes-history saver API (beta). `DeltaChannel` is a reducer channel that stores only a sentinel in checkpoint blobs instead of the full accumulated value, reconstructing state on read by replaying ancestor writes through a batch reducer. This avoids re-serializing the entire accumulated value at every step (e.g. long message histories). - `DeltaChannel(reducer, { snapshotFrequency })` in `@langchain/langgraph` — count-based snapshot cadence (default `snapshotFrequency=1000`) plus a system bound `DELTA_MAX_SUPERSTEPS_SINCE_SNAPSHOT` (default 5000, env `LANGGRAPH_DELTA_MAX_SUPERSTEPS_SINCE_SNAPSHOT`). - `messagesDeltaReducer` — a batching-invariant messages reducer that coerces raw object/string writes, for use with `DeltaChannel`. - `BaseCheckpointSaver.getDeltaChannelHistory({ config, channels })` (beta) — walks the parent chain returning per-channel `{ writes, seed? }`, with a direct-storage override in `MemorySaver`. - `counters_since_delta_snapshot` added to `CheckpointMetadata`; `DeltaSnapshot` serialization support in the JSON+ serializer. Reconstruction is wired through the Pregel read/execution paths (initialization, `getState`, `updateState`, local reads) and `exit` durability accumulates and anchors delta writes so threads remain reconstructible without forcing snapshots. - [#2451](https://github.com/langchain-ai/langgraphjs/pull/2451) [`d65a920`](https://github.com/langchain-ai/langgraphjs/commit/d65a9209d7fad603f45562c2b28c3d25502c8318) Thanks [@christian-bromann](https://github.com/christian-bromann)! - feat(langgraph): add node-level error handlers `StateGraph.addNode(name, fn, { errorHandler })` now accepts a first-class node-level error handler. The handler runs ONLY after the failing node's `retryPolicy` is exhausted, so retry and handling stay decoupled. It receives a typed `NodeError { node, error }` and the typed node input state, can return a state update, and can route to a recovery branch via `new Command({ goto })` (saga / compensation flows). Failure provenance is checkpointed (via a reserved `ERROR_SOURCE_NODE` write) so handlers observe the same context after a checkpoint resume. Uncaught node errors without a handler still abort the run as before, and `GraphBubbleUp` errors (such as `interrupt()`) are never swallowed by a handler. `StateGraph.setNodeDefaults({ errorHandler })` now also accepts a graph-wide default handler. It is materialized at `compile()` as a single shared handler and invoked for every regular node that does not set its own `errorHandler`. A per-node handler always takes precedence, the default never catches a failure raised by an error-handler node itself (handler failures fail the run), and the default is not inherited by subgraphs. Ports the Python feature from langchain-ai/langgraph#7233. - [#2450](https://github.com/langchain-ai/langgraphjs/pull/2450) [`2f6d873`](https://github.com/langchain-ai/langgraphjs/commit/2f6d87368e590ae2fc2a7990fd13cb0a5fe3c198) Thanks [@christian-bromann](https://github.com/christian-bromann)! - Add node-level timeouts. A `timeout` option is now supported on `StateGraph.addNode`, the functional API (`task`/`entrypoint`), and the `Send` constructor. Pass a number of milliseconds for a hard wall-clock cap, or a `TimeoutPolicy` for finer control: ```ts import { TimeoutPolicy } from "@langchain/langgraph"; // hard wall-clock cap on each attempt builder.addNode("agent", agentFn, { timeout: 60_000 }); // full control builder.addNode("agent", agentFn, { timeout: { runTimeout: 60_000, // hard wall-clock cap, never refreshed idleTimeout: 10_000, // cap on time without observable progress refreshOn: "auto", // "auto" | "heartbeat" }, }); // per-task override new Send("agent", state, { timeout: { idleTimeout: 5_000 } }); ``` When a timeout fires, a `NodeTimeoutError` (carrying `node`, `kind` (`"run"`/`"idle"`), `timeout`, `elapsed`, `runTimeout`, `idleTimeout`) is raised, the attempt's buffered writes are dropped, and the node's `AbortSignal` is aborted. `idleTimeout` is refreshed by observable progress (writes, custom stream-writer calls, child-task scheduling, callback events) or an explicit `runtime.heartbeat()` call. The timer resets per retry attempt, and `NodeTimeoutError` is retryable under the default retry policy. Ports langchain-ai/langgraph#7599, [#7646](https://github.com/langchain-ai/langgraphjs/issues/7646), and [#7659](https://github.com/langchain-ai/langgraphjs/issues/7659). - [#2461](https://github.com/langchain-ai/langgraphjs/pull/2461) [`801d955`](https://github.com/langchain-ai/langgraphjs/commit/801d955d391f9fd9326a6696bff6c2f039883301) Thanks [@christian-bromann](https://github.com/christian-bromann)! - Add `StateGraph.setNodeDefaults()` for setting graph-wide node policy defaults (`retryPolicy`, `cachePolicy`). Per-node values passed to `addNode` always take precedence, and defaults are resolved at `compile()` time so call order does not matter. Defaults are not inherited by subgraphs. Ports Python's `set_node_defaults()` (langchain-ai/langgraph#7747). ### Patch Changes - [#2179](https://github.com/langchain-ai/langgraphjs/pull/2179) [`01c67df`](https://github.com/langchain-ai/langgraphjs/commit/01c67dfa4dfea98509d6e1f35fa16de8c5d6a7c4) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(core): time travel replay/fork for graphs with interrupts and subgraphs Ports Python fixes for stale RESUME writes during replay, wrong subgraph checkpoint loading during time travel, missing fork checkpoints on replay, and direct-to-subgraph time travel. - [#2514](https://github.com/langchain-ai/langgraphjs/pull/2514) [`9e0201d`](https://github.com/langchain-ai/langgraphjs/commit/9e0201d8bd2d85490ca49e7e62126bda32b9121b) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(schema): expose StateSchema JSON schemas for Studio introspection Route StateSchema runtime definitions through getJsonSchema() and getInputJsonSchema() so LangGraph Studio receives state, input, and context schemas when graphs use the StateSchema primitive. Fixes [#2466](https://github.com/langchain-ai/langgraphjs/issues/2466) - [#2471](https://github.com/langchain-ai/langgraphjs/pull/2471) [`9b96f60`](https://github.com/langchain-ai/langgraphjs/commit/9b96f60af64c0d25f780cfe00c1cb7698f3b5773) Thanks [@christian-bromann](https://github.com/christian-bromann)! - perf(core): skip debug checkpoint snapshots when not streaming them Avoid building full-state `mapDebugCheckpoint` payloads on every tick when no consumer subscribed to `checkpoints` or `debug` stream modes. v3 companion checkpoint envelopes are unchanged (they come from values metadata). - [#2472](https://github.com/langchain-ai/langgraphjs/pull/2472) [`8e06ace`](https://github.com/langchain-ai/langgraphjs/commit/8e06ace95cd2279a8cf9d350f01268a253376dc9) Thanks [@christian-bromann](https://github.com/christian-bromann)! - perf(core): index pending writes for O(1) task-prep lookups Build a PendingWritesIndex once per \_prepareNextTasks call so resume and skip-done-task checks avoid repeated linear scans over checkpointPendingWrites. - [#2473](https://github.com/langchain-ai/langgraphjs/pull/2473) [`a8b0036`](https://github.com/langchain-ai/langgraphjs/commit/a8b0036557333d16c95dfe51ccd61ee4cfdc600b) Thanks [@christian-bromann](https://github.com/christian-bromann)! - perf(core): optimize applyWrites, interrupt seen, and channel errors Reduce allocations in \_applyWrites, fix O(N²) interrupt versions_seen updates, skip stack traces on EmptyChannelError control flow, and cache task lists in the pregel loop and runner. - [#2444](https://github.com/langchain-ai/langgraphjs/pull/2444) [`4096933`](https://github.com/langchain-ai/langgraphjs/commit/4096933741e44d065e9b172f3bf86a621a88cc1e) Thanks [@christian-bromann](https://github.com/christian-bromann)! - feat(remote): add RemoteGraph v3 streaming support Expose the v3 `streamEvents` surface for `RemoteGraph` by adapting remote SDK thread streams to the local `GraphRunStream` shape. - Updated dependencies \[[`a8e7659`](https://github.com/langchain-ai/langgraphjs/commit/a8e7659a9d22fd84425aaf26bda88667c76b185a), [`2f6d873`](https://github.com/langchain-ai/langgraphjs/commit/2f6d87368e590ae2fc2a7990fd13cb0a5fe3c198)]: - @langchain/langgraph-checkpoint@1.1.0 ## @langchain/langgraph-checkpoint-mongodb@1.3.4 ### Patch Changes - [#2517](https://github.com/langchain-ai/langgraphjs/pull/2517) [`67a4f8d`](https://github.com/langchain-ai/langgraphjs/commit/67a4f8da580eb527fa6f201a4c72895754fe37f7) Thanks [@jackjin1997](https://github.com/jackjin1997)! - fix: `MongoDBSaver.putWrites` now honors `WRITES_IDX_MAP`, pinning special channels (`__error__`, `__scheduled__`, `__interrupt__`, `__resume__`) to fixed negative indices instead of the call-local ordinal. Previously a mixed `putWrites([[...regular...], [INTERRUPT, …]], taskId)` placed the INTERRUPT at a positive idx that could collide with a regular write at the same `(task_id, idx)`, and the unconditional `$set` upsert silently overwrote whichever row landed there first. The conflict-resolution clause now matches the Postgres / SQLite (TS and Python) checkpointers: `$set` only when every channel is a special one, `$setOnInsert` otherwise. ## @langchain/langgraph-checkpoint-postgres@1.0.3 ### Patch Changes - [#2512](https://github.com/langchain-ai/langgraphjs/pull/2512) [`375c73f`](https://github.com/langchain-ai/langgraphjs/commit/375c73fcd1ef06145301df80466fda35c0a99385) Thanks [@jackjin1997](https://github.com/jackjin1997)! - fix: reject SQL `LIKE` wildcards (`%`, `_`) and the backslash escape character in `PostgresStore` namespace labels. `BaseStore.search()` matches namespaces via `namespace_path LIKE ${prefix}%`, and these characters in caller-supplied namespace labels are interpreted as wildcards by Postgres even through a bound parameter — letting a namespace prefix of `["%"]` match every namespace in the store across tenants. `validateNamespace` now throws for these characters at all `search` / `get` / `put` entrypoints, keeping store-wide consistency. CWE-1336. ## @langchain/langgraph-checkpoint-redis@1.0.8 ### Patch Changes - [#2518](https://github.com/langchain-ai/langgraphjs/pull/2518) [`9182ea3`](https://github.com/langchain-ai/langgraphjs/commit/9182ea35ecc1f932eb864fa7dc4fb32a00c5f7d6) Thanks [@jackjin1997](https://github.com/jackjin1997)! - fix: `RedisSaver.putWrites` now honors `WRITES_IDX_MAP`, pinning special channels (`__error__`, `__scheduled__`, `__interrupt__`, `__resume__`) to fixed negative indices in their Redis key (`checkpoint_write:…:<idx>`) instead of the call-local ordinal. Previously a mixed `putWrites([[…regular…], [INTERRUPT, …]], taskId)` placed the INTERRUPT key at the positive idx of its position in the batch, where a peer task's regular write at the same idx would overwrite it via the unconditional `JSON.SET`. The conflict-resolution clause now matches Postgres / SQLite / MongoDB: unguarded `JSON.SET` when every write is a special channel, `JSON.SET … NX` (insert-or-ignore) otherwise. ## @langchain/langgraph-checkpoint-sqlite@1.0.3 ### Patch Changes - [#2516](https://github.com/langchain-ai/langgraphjs/pull/2516) [`f6a6d26`](https://github.com/langchain-ai/langgraphjs/commit/f6a6d26b7e69003c4fa052f3cd3319f3e72f0f8f) Thanks [@jackjin1997](https://github.com/jackjin1997)! - fix: `SqliteSaver.putWrites` now honors `WRITES_IDX_MAP`, pinning special channels (`__error__`, `__scheduled__`, `__interrupt__`, `__resume__`) to fixed negative indices instead of the call-local ordinal. Previously a follow-up `putWrites([[INTERRUPT, …]], taskId)` for the same checkpoint silently `REPLACE`d the regular write previously stored at `idx=0` for that task, losing data. The conflict-resolution clause also now matches the Python checkpointer contract: `OR REPLACE` only when every channel is a special one (so e.g. INTERRUPT→RESUME state transitions overwrite), `OR IGNORE` otherwise. ## @langchain/angular@1.0.21 ### Patch Changes - [#2515](https://github.com/langchain-ai/langgraphjs/pull/2515) [`49b8c1a`](https://github.com/langchain-ai/langgraphjs/commit/49b8c1a04cf03a77069a955816b0f5af2f68ab41) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix: make AnyStream a true supertype so selector hooks need no cast A concrete `useStream<typeof agent>()` handle was not assignable to `AnyStream` because generic-computed covariant members (`toolCalls`, `values`) don't widen under `any` — `InferToolCalls<any>[]` resolves to `AssembledToolCall<…, never>[]`, narrower than a concrete handle. Override those members with their widest forms (preserving each framework's reactivity wrapper — plain arrays for React/Svelte, `ShallowRef` for Vue, `Signal` for Angular) so the message/tool/value selector hooks accept a fully-typed stream without an `as AnyStream` cast. ## @langchain/react@1.0.21 ### Patch Changes - [#2515](https://github.com/langchain-ai/langgraphjs/pull/2515) [`49b8c1a`](https://github.com/langchain-ai/langgraphjs/commit/49b8c1a04cf03a77069a955816b0f5af2f68ab41) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix: make AnyStream a true supertype so selector hooks need no cast A concrete `useStream<typeof agent>()` handle was not assignable to `AnyStream` because generic-computed covariant members (`toolCalls`, `values`) don't widen under `any` — `InferToolCalls<any>[]` resolves to `AssembledToolCall<…, never>[]`, narrower than a concrete handle. Override those members with their widest forms (preserving each framework's reactivity wrapper — plain arrays for React/Svelte, `ShallowRef` for Vue, `Signal` for Angular) so the message/tool/value selector hooks accept a fully-typed stream without an `as AnyStream` cast. ## @langchain/svelte@1.0.21 ### Patch Changes - [#2515](https://github.com/langchain-ai/langgraphjs/pull/2515) [`49b8c1a`](https://github.com/langchain-ai/langgraphjs/commit/49b8c1a04cf03a77069a955816b0f5af2f68ab41) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix: make AnyStream a true supertype so selector hooks need no cast A concrete `useStream<typeof agent>()` handle was not assignable to `AnyStream` because generic-computed covariant members (`toolCalls`, `values`) don't widen under `any` — `InferToolCalls<any>[]` resolves to `AssembledToolCall<…, never>[]`, narrower than a concrete handle. Override those members with their widest forms (preserving each framework's reactivity wrapper — plain arrays for React/Svelte, `ShallowRef` for Vue, `Signal` for Angular) so the message/tool/value selector hooks accept a fully-typed stream without an `as AnyStream` cast. ## @langchain/vue@1.0.21 ### Patch Changes - [#2515](https://github.com/langchain-ai/langgraphjs/pull/2515) [`49b8c1a`](https://github.com/langchain-ai/langgraphjs/commit/49b8c1a04cf03a77069a955816b0f5af2f68ab41) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix: make AnyStream a true supertype so selector hooks need no cast A concrete `useStream<typeof agent>()` handle was not assignable to `AnyStream` because generic-computed covariant members (`toolCalls`, `values`) don't widen under `any` — `InferToolCalls<any>[]` resolves to `AssembledToolCall<…, never>[]`, narrower than a concrete handle. Override those members with their widest forms (preserving each framework's reactivity wrapper — plain arrays for React/Svelte, `ShallowRef` for Vue, `Signal` for Angular) so the message/tool/value selector hooks accept a fully-typed stream without an `as AnyStream` cast. ## @example/ai-elements@0.1.36 ### Patch Changes - Updated dependencies \[[`01c67df`](https://github.com/langchain-ai/langgraphjs/commit/01c67dfa4dfea98509d6e1f35fa16de8c5d6a7c4), [`d12d269`](https://github.com/langchain-ai/langgraphjs/commit/d12d2693308e37951266bc8197daa656daa6e2aa), [`a8e7659`](https://github.com/langchain-ai/langgraphjs/commit/a8e7659a9d22fd84425aaf26bda88667c76b185a), [`49b8c1a`](https://github.com/langchain-ai/langgraphjs/commit/49b8c1a04cf03a77069a955816b0f5af2f68ab41), [`9e0201d`](https://github.com/langchain-ai/langgraphjs/commit/9e0201d8bd2d85490ca49e7e62126bda32b9121b), [`9b96f60`](https://github.com/langchain-ai/langgraphjs/commit/9b96f60af64c0d25f780cfe00c1cb7698f3b5773), [`8e06ace`](https://github.com/langchain-ai/langgraphjs/commit/8e06ace95cd2279a8cf9d350f01268a253376dc9), [`d65a920`](https://github.com/langchain-ai/langgraphjs/commit/d65a9209d7fad603f45562c2b28c3d25502c8318), [`2f6d873`](https://github.com/langchain-ai/langgraphjs/commit/2f6d87368e590ae2fc2a7990fd13cb0a5fe3c198), [`a8b0036`](https://github.com/langchain-ai/langgraphjs/commit/a8b0036557333d16c95dfe51ccd61ee4cfdc600b), [`4096933`](https://github.com/langchain-ai/langgraphjs/commit/4096933741e44d065e9b172f3bf86a621a88cc1e), [`801d955`](https://github.com/langchain-ai/langgraphjs/commit/801d955d391f9fd9326a6696bff6c2f039883301)]: - @langchain/langgraph@1.4.0 - @langchain/react@1.0.21 ## @examples/assistant-ui-claude@0.1.36 ### Patch Changes - Updated dependencies \[[`01c67df`](https://github.com/langchain-ai/langgraphjs/commit/01c67dfa4dfea98509d6e1f35fa16de8c5d6a7c4), [`d12d269`](https://github.com/langchain-ai/langgraphjs/commit/d12d2693308e37951266bc8197daa656daa6e2aa), [`a8e7659`](https://github.com/langchain-ai/langgraphjs/commit/a8e7659a9d22fd84425aaf26bda88667c76b185a), [`49b8c1a`](https://github.com/langchain-ai/langgraphjs/commit/49b8c1a04cf03a77069a955816b0f5af2f68ab41), [`9e0201d`](https://github.com/langchain-ai/langgraphjs/commit/9e0201d8bd2d85490ca49e7e62126bda32b9121b), [`9b96f60`](https://github.com/langchain-ai/langgraphjs/commit/9b96f60af64c0d25f780cfe00c1cb7698f3b5773), [`8e06ace`](https://github.com/langchain-ai/langgraphjs/commit/8e06ace95cd2279a8cf9d350f01268a253376dc9), [`d65a920`](https://github.com/langchain-ai/langgraphjs/commit/d65a9209d7fad603f45562c2b28c3d25502c8318), [`2f6d873`](https://github.com/langchain-ai/langgraphjs/commit/2f6d87368e590ae2fc2a7990fd13cb0a5fe3c198), [`a8b0036`](https://github.com/langchain-ai/langgraphjs/commit/a8b0036557333d16c95dfe51ccd61ee4cfdc600b), [`4096933`](https://github.com/langchain-ai/langgraphjs/commit/4096933741e44d065e9b172f3bf86a621a88cc1e), [`801d955`](https://github.com/langchain-ai/langgraphjs/commit/801d955d391f9fd9326a6696bff6c2f039883301)]: - @langchain/langgraph@1.4.0 - @langchain/react@1.0.21 ## @examples/ui-angular@0.0.46 ### Patch Changes - Updated dependencies \[[`01c67df`](https://github.com/langchain-ai/langgraphjs/commit/01c67dfa4dfea98509d6e1f35fa16de8c5d6a7c4), [`d12d269`](https://github.com/langchain-ai/langgraphjs/commit/d12d2693308e37951266bc8197daa656daa6e2aa), [`a8e7659`](https://github.com/langchain-ai/langgraphjs/commit/a8e7659a9d22fd84425aaf26bda88667c76b185a), [`49b8c1a`](https://github.com/langchain-ai/langgraphjs/commit/49b8c1a04cf03a77069a955816b0f5af2f68ab41), [`9e0201d`](https://github.com/langchain-ai/langgraphjs/commit/9e0201d8bd2d85490ca49e7e62126bda32b9121b), [`9b96f60`](https://github.com/langchain-ai/langgraphjs/commit/9b96f60af64c0d25f780cfe00c1cb7698f3b5773), [`8e06ace`](https://github.com/langchain-ai/langgraphjs/commit/8e06ace95cd2279a8cf9d350f01268a253376dc9), [`d65a920`](https://github.com/langchain-ai/langgraphjs/commit/d65a9209d7fad603f45562c2b28c3d25502c8318), [`2f6d873`](https://github.com/langchain-ai/langgraphjs/commit/2f6d87368e590ae2fc2a7990fd13cb0a5fe3c198), [`a8b0036`](https://github.com/langchain-ai/langgraphjs/commit/a8b0036557333d16c95dfe51ccd61ee4cfdc600b), [`4096933`](https://github.com/langchain-ai/langgraphjs/commit/4096933741e44d065e9b172f3bf86a621a88cc1e), [`801d955`](https://github.com/langchain-ai/langgraphjs/commit/801d955d391f9fd9326a6696bff6c2f039883301)]: - @langchain/langgraph@1.4.0 - @langchain/angular@1.0.21 ## @examples/ui-multimodal@0.0.22 ### Patch Changes - Updated dependencies \[[`01c67df`](https://github.com/langchain-ai/langgraphjs/commit/01c67dfa4dfea98509d6e1f35fa16de8c5d6a7c4), [`d12d269`](https://github.com/langchain-ai/langgraphjs/commit/d12d2693308e37951266bc8197daa656daa6e2aa), [`a8e7659`](https://github.com/langchain-ai/langgraphjs/commit/a8e7659a9d22fd84425aaf26bda88667c76b185a), [`49b8c1a`](https://github.com/langchain-ai/langgraphjs/commit/49b8c1a04cf03a77069a955816b0f5af2f68ab41), [`9e0201d`](https://github.com/langchain-ai/langgraphjs/commit/9e0201d8bd2d85490ca49e7e62126bda32b9121b), [`9b96f60`](https://github.com/langchain-ai/langgraphjs/commit/9b96f60af64c0d25f780cfe00c1cb7698f3b5773), [`8e06ace`](https://github.com/langchain-ai/langgraphjs/commit/8e06ace95cd2279a8cf9d350f01268a253376dc9), [`d65a920`](https://github.com/langchain-ai/langgraphjs/commit/d65a9209d7fad603f45562c2b28c3d25502c8318), [`2f6d873`](https://github.com/langchain-ai/langgraphjs/commit/2f6d87368e590ae2fc2a7990fd13cb0a5fe3c198), [`a8b0036`](https://github.com/langchain-ai/langgraphjs/commit/a8b0036557333d16c95dfe51ccd61ee4cfdc600b), [`4096933`](https://github.com/langchain-ai/langgraphjs/commit/4096933741e44d065e9b172f3bf86a621a88cc1e), [`801d955`](https://github.com/langchain-ai/langgraphjs/commit/801d955d391f9fd9326a6696bff6c2f039883301)]: - @langchain/langgraph@1.4.0 - @langchain/react@1.0.21 ## @examples/ui-react@0.0.22 ### Patch Changes - Updated dependencies \[[`01c67df`](https://github.com/langchain-ai/langgraphjs/commit/01c67dfa4dfea98509d6e1f35fa16de8c5d6a7c4), [`d12d269`](https://github.com/langchain-ai/langgraphjs/commit/d12d2693308e37951266bc8197daa656daa6e2aa), [`a8e7659`](https://github.com/langchain-ai/langgraphjs/commit/a8e7659a9d22fd84425aaf26bda88667c76b185a), [`49b8c1a`](https://github.com/langchain-ai/langgraphjs/commit/49b8c1a04cf03a77069a955816b0f5af2f68ab41), [`9e0201d`](https://github.com/langchain-ai/langgraphjs/commit/9e0201d8bd2d85490ca49e7e62126bda32b9121b), [`9b96f60`](https://github.com/langchain-ai/langgraphjs/commit/9b96f60af64c0d25f780cfe00c1cb7698f3b5773), [`8e06ace`](https://github.com/langchain-ai/langgraphjs/commit/8e06ace95cd2279a8cf9d350f01268a253376dc9), [`d65a920`](https://github.com/langchain-ai/langgraphjs/commit/d65a9209d7fad603f45562c2b28c3d25502c8318), [`2f6d873`](https://github.com/langchain-ai/langgraphjs/commit/2f6d87368e590ae2fc2a7990fd13cb0a5fe3c198), [`a8b0036`](https://github.com/langchain-ai/langgraphjs/commit/a8b0036557333d16c95dfe51ccd61ee4cfdc600b), [`4096933`](https://github.com/langchain-ai/langgraphjs/commit/4096933741e44d065e9b172f3bf86a621a88cc1e), [`801d955`](https://github.com/langchain-ai/langgraphjs/commit/801d955d391f9fd9326a6696bff6c2f039883301)]: - @langchain/langgraph@1.4.0 - @langchain/react@1.0.21 ## langgraph@1.0.40 ### Patch Changes - Updated dependencies \[[`01c67df`](https://github.com/langchain-ai/langgraphjs/commit/01c67dfa4dfea98509d6e1f35fa16de8c5d6a7c4), [`d12d269`](https://github.com/langchain-ai/langgraphjs/commit/d12d2693308e37951266bc8197daa656daa6e2aa), [`a8e7659`](https://github.com/langchain-ai/langgraphjs/commit/a8e7659a9d22fd84425aaf26bda88667c76b185a), [`9e0201d`](https://github.com/langchain-ai/langgraphjs/commit/9e0201d8bd2d85490ca49e7e62126bda32b9121b), [`9b96f60`](https://github.com/langchain-ai/langgraphjs/commit/9b96f60af64c0d25f780cfe00c1cb7698f3b5773), [`8e06ace`](https://github.com/langchain-ai/langgraphjs/commit/8e06ace95cd2279a8cf9d350f01268a253376dc9), [`d65a920`](https://github.com/langchain-ai/langgraphjs/commit/d65a9209d7fad603f45562c2b28c3d25502c8318), [`2f6d873`](https://github.com/langchain-ai/langgraphjs/commit/2f6d87368e590ae2fc2a7990fd13cb0a5fe3c198), [`a8b0036`](https://github.com/langchain-ai/langgraphjs/commit/a8b0036557333d16c95dfe51ccd61ee4cfdc600b), [`4096933`](https://github.com/langchain-ai/langgraphjs/commit/4096933741e44d065e9b172f3bf86a621a88cc1e), [`801d955`](https://github.com/langchain-ai/langgraphjs/commit/801d955d391f9fd9326a6696bff6c2f039883301)]: - @langchain/langgraph@1.4.0 Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>@langchain/angular@1.0.21 @langchain/langgraph-checkpoint-mongodb@1.3.4 @langchain/langgraph-checkpoint-postgres@1.0.3 @langchain/langgraph-checkpoint-redis@1.0.8 @langchain/langgraph-checkpoint-sqlite@1.0.3 @langchain/langgraph-checkpoint@1.1.0 @langchain/langgraph@1.4.0 @langchain/react@1.0.21 @langchain/svelte@1.0.21 @langchain/vue@1.0.21 |
||
|
|
9182ea35ec |
fix(langgraph-checkpoint-redis): honor WRITES_IDX_MAP for special channels in putWrites (#2518)
## Summary Third in the series following #2516 (SQLite) and #2517 (MongoDB). `RedisSaver.putWrites` stored each write at the call-local ordinal `idx` — the key suffix in `checkpoint_write:<thread>:<ns>:<ckpt>:<task>:<idx>` was just the loop index — and always used unguarded `JSON.SET`, ignoring `WRITES_IDX_MAP`. - A follow-up `putWrites([[INTERRUPT, value]], taskId)` for the same checkpoint computed `idx=0` and collided with the task's first regular write key; the unconditional `JSON.SET` silently overwrote whichever row landed there first. - A mixed call like `[[foo, …], [bar, …], [INTERRUPT, …]]` shifted the INTERRUPT to idx=2, where a peer task storing a regular write at the same idx for the same task_id would clobber it. ### Cross-impl parity after this PR | Checkpointer | `WRITES_IDX_MAP` | Conflict clause | |---|---|---| | Memory (TS) | ✅ | gated by `idx >= 0` | | Postgres (TS) | ✅ | `OR REPLACE` vs `INSERT` based on `all special` | | SQLite (TS, #2516) | ✅ | `OR REPLACE` vs `OR IGNORE` based on `all special` | | MongoDB (TS, #2517) | ✅ | `$set` vs `$setOnInsert` based on `all special` | | **Redis (TS, this PR)** | ✅ | `JSON.SET` vs `JSON.SET … NX` based on `all special` | ### Fix 1. Key suffix now resolves to `WRITES_IDX_MAP[channel] ?? idx`, so ERROR / SCHEDULED / INTERRUPT / RESUME land at fixed negative indices that can't collide with per-step regular writes. 2. The `JSON.SET` call switches between unguarded and the `NX` modifier depending on whether every write targets a special channel. State transitions like INTERRUPT → RESUME still overwrite (both special); a regular write from one task can never silently overwrite another concurrent task's regular write at the same idx. ### Tests Mock-based unit test in a new `putWrites.test.ts` (no Redis needed) captures every `client.json.set` call site and asserts: - Mixed regular + INTERRUPT batch → key tails `[-3, 0, 1]` (vs the pre-fix `[0, 1, 2]`) and every JSON.SET carries `{ NX: true }`. - Special-only batch (RESUME) → key tail `-4` and no NX (so state transitions can overwrite). **Reverse-verified**: with the fix reverted both new tests fail. ## AI Disclosure Identified via cross-implementation review against #2516 and #2517 — same root cause class, different storage layer. |
||
|
|
4096933741 |
fix(core): add RemoteGraph v3 streaming support (#2444)
## Summary
- Add `RemoteGraph.streamEvents(..., { version: "v3" })` support backed
by SDK `ThreadStream`.
- Adapt remote v3 streams to the local `GraphRunStream` surface,
including values, messages, lifecycle, output, interrupts, abort, and
SSE encoding.
- Replace external-env RemoteGraph integration coverage with a local
LangGraph API server test.
|
||
|
|
67a4f8da58 |
fix(langgraph-checkpoint-mongodb): honor WRITES_IDX_MAP for special channels in putWrites (#2517)
## Summary Follow-up to #2516 (which fixed the same bug for `SqliteSaver`). `MongoDBSaver.putWrites` stored every write at the call-local ordinal `idx` and always used `$set`, ignoring `WRITES_IDX_MAP`. So: - A follow-up `putWrites([[INTERRUPT, value]], taskId)` for the same checkpoint computed `idx=0` and collided with the task's first regular write — the unconditional `$set` upsert silently overwrote whichever row landed there first. - A mixed call `putWrites([[foo, …], [bar, …], [INTERRUPT, …]], taskId)` shifted the INTERRUPT to idx=2, where a peer task storing a regular write at the same idx for the same task_id would clobber it. The fix mirrors `BaseCheckpointSaver.put_writes` semantics and the Postgres / SQLite (TS and Python) implementations. ### Cross-impl parity after this PR | Checkpointer | `WRITES_IDX_MAP` | Conflict clause | |---|---|---| | Memory (TS) | ✅ | gated by `idx >= 0` | | Postgres (TS) | ✅ | `OR REPLACE` vs `INSERT` based on `all special` | | SQLite (TS, #2516) | ✅ | `OR REPLACE` vs `OR IGNORE` based on `all special` | | **MongoDB (TS, this PR)** | ✅ | `$set` vs `$setOnInsert` based on `all special` | | Redis (TS) | ❌ | follow-up needed | ### Fix 1. `idx` resolves to `WRITES_IDX_MAP[channel] ?? idx`, so ERROR / SCHEDULED / INTERRUPT / RESUME land at fixed negative indices that can't collide with per-step regular writes. 2. The update operator switches between `$set` and `$setOnInsert` depending on whether every write targets a special channel. State transitions like INTERRUPT → RESUME still overwrite (both special); a regular write from one task can never silently overwrite another concurrent task's regular write at the same idx. When timestamps are enabled, the `$setOnInsert` path also defers `upserted_at` to insert-only, so a no-op upsert against a peer task's existing row doesn't bump that row's "last modified" stamp. ### Tests Mock-based unit test (no real MongoDB needed) captures `bulkWrite` operations and asserts: - Mixed regular + INTERRUPT batch → indices `[-3, 0, 1]` (vs the pre-fix `[0, 1, 2]`) and every op uses `$setOnInsert`. - Special-only batch (RESUME) → idx `-4` and uses `$set`. **Reverse-verified**: with the fix reverted the test fails with `Received [0, 1, 2]`. ## AI Disclosure Identified via cross-implementation review against the SQLite fix in #2516 — same root cause class, separate test surface. |
||
|
|
92f77927fb | fix(api): fix peer dep range | ||
|
|
01c67dfa4d |
fix(core): replay bug, direct to subgraphs (#2179)
## Summary Ports Python time-travel fixes ([#7038](https://github.com/langchain-ai/langgraph/pull/7038), [#7115](https://github.com/langchain-ai/langgraph/pull/7115), [#7498](https://github.com/langchain-ai/langgraph/pull/7498), [#7499](https://github.com/langchain-ai/langgraph/pull/7499)) into `@langchain/langgraph` so replay/fork behave correctly with interrupts and nested subgraphs. - **Stale `RESUME` on replay** — Replaying from a checkpoint before an interrupt no longer consumes cached resume writes; interrupts re-fire with the correct payload. - **Subgraph checkpoint loading on time travel** — Introduces `ReplayState` (`CONFIG_KEY_REPLAY_STATE`) so nested subgraphs load the checkpoint that existed at the replay point on first visit, then resume normal head loading within the same run. - **Parent fork checkpoints on replay** — Time travel runs through `PregelLoop._first()` (not `stream()` delegation on the parent `Pregel`), creating an eager `source: "fork"` checkpoint and propagating `ReplayState` to subgraphs. - **Direct-to-subgraph time travel** — `getState()` subgraph delegation is guarded with `CONFIG_KEY_READ`; direct subgraph configs strip stale `RESUME` writes and prefer explicit `checkpoint_id` over `checkpoint_map` when both are set. - **Streaming** — Fixes subgraph interrupt namespace when streaming with `subgraphs: true` (empty `checkpoint_ns` no longer becomes `[""]`; parent emits interrupts under the deepest `checkpoint_map` namespace). Closes #2325 (supersedes the earlier partial port). ### Implementation notes | Area | Change | |------|--------| | `pregel/replay.ts` | New `ReplayState` class (mirrors Python) | | `pregel/loop.ts` | Replay/time-travel detection, fork creation, `RESUME` stripping, `ReplayState` wiring, stream namespace helpers | | `pregel/index.ts` | `getState` subgraph delegation guard only (removed `stream()` bypass that skipped parent fork creation) | | Tests | `time_travel.test.ts` (14), `time_travel_extended.test.ts` (33), shared `time_travel_helpers.ts`, Vitest matchers `toBeInterrupted` / `toHaveInterruptValue` | --------- Co-authored-by: Cursor <cursoragent@cursor.com> |
||
|
|
a8e7659a9d |
feat(core): DeltaChannel + writes-history saver API (#2452)
`DeltaChannel` is a reducer channel that stores only a sentinel in
checkpoint blobs instead of the full accumulated value, reconstructing
state on read by replaying ancestor writes through a batch reducer. This
avoids re-serializing the entire accumulated value at every step (e.g.
long message histories).
- `DeltaChannel(reducer, { snapshotFrequency })` in
`@langchain/langgraph`, count-based snapshot cadence (default
`snapshotFrequency=1000`) plus a system bound
`DELTA_MAX_SUPERSTEPS_SINCE_SNAPSHOT` (default 5000, env
`LANGGRAPH_DELTA_MAX_SUPERSTEPS_SINCE_SNAPSHOT`).
- `messagesDeltaReducer` — a batching-invariant messages reducer that
coerces raw object/string writes, for use with `DeltaChannel`.
- `BaseCheckpointSaver.getDeltaChannelHistory({ config, channels })`
(beta), walks the parent chain returning per-channel `{ writes, seed?
}`, with a direct-storage override in `MemorySaver`.
- `counters_since_delta_snapshot` added to `CheckpointMetadata`;
`DeltaSnapshot` serialization support in the JSON+ serializer.
Reconstruction is wired through the Pregel read/execution paths
(initialization, `getState`, `updateState`, local reads) and `exit`
durability accumulates and anchors delta writes so threads remain
reconstructible without forcing snapshots.
|
||
|
|
d12d269330 |
feat(langgraph): cooperative graph drain via RunControl (#2449)
## Summary Ports Python PR [langchain-ai/langgraph#7274](https://github.com/langchain-ai/langgraph/pull/7274) ("allow graph to graceful shutdown/drain by request") to LangGraphJS. Adds cooperative, between-superstep draining so a run can be asked to stop at the next superstep boundary, persist its checkpoint, and surface a resumable terminal error. This is the JS PR for the **Graph draining / graceful shutdown** parity unit. ## What's added - **`RunControl`** (new `pregel/runtime.ts`, exported from `@langchain/langgraph`): a run-scoped handle with `requestDrain(reason = "shutdown")` and read-only `drainRequested` / `drainReason`. - **`GraphDrained`** (`errors.ts`): a `GraphBubbleUp` subclass carrying `reason`, thrown when a run exits early due to drain. Plus an `isGraphDrained` guard. - **`control` option** on `invoke` / `stream` / `streamEvents` / `invoke`'s functional-API equivalents. It is surfaced on `runtime.control` (nodes can read it or call `requestDrain()`), and propagated into subgraphs. A fresh `RunControl` is provided per run when none is passed. ## Semantics (cooperative, between-superstep) `requestDrain()` flips a flag. The Pregel loop checks it at the top of each `tick()`, **after** the previous superstep's writes have been applied and checkpointed and the next tasks have been prepared. It never preempts work that is already running. | Scenario | Behavior | |---|---| | Node mid-execution | Runs to completion; drain takes effect at the next superstep. | | Graph naturally finishes on the same tick where drain was requested | Returns normally (status `done`). No `GraphDrained`. Caller can inspect `control.drainRequested`. | | More tasks remain | Saves the last completed superstep's checkpoint (also under `durability: "exit"`) and throws `GraphDrained(reason)`. Resume with `invoke(null, config)`. | | Subgraph requests drain | `GraphDrained` bubbles up through the parent loop and stops it at its own next boundary; the parent's checkpoint is saved and resumable. | Draining does **not** cancel async work. Pair it with an `AbortSignal` if you need a hard upper bound (see the `drain then cancel after a graceful timeout` test). ## Files - `errors.ts` — `GraphDrained` + `isGraphDrained` - `pregel/runtime.ts` — `RunControl` - `pregel/runnable_types.ts` — `control?: RunControl` on `Runtime` - `pregel/types.ts` — `control` on `PregelOptions` - `pregel/utils/config.ts`, `constants.ts` — config-key wiring - `pregel/loop.ts` — `"draining"` status + drain check at the tick boundary - `pregel/index.ts` — option wiring + raising `GraphDrained` - `pregel/runner.ts` — subgraph drain bubble-up handling ## Tests `libs/langgraph-core/src/tests/run_control.test.ts` (14 tests, all sync + async where applicable): drain stops the next step (sync/async), terminal-step drain finishes normally, exit- and default-durability resume, pre-drained control, subgraph → parent bubble + resume, external concurrent drain, drain-then-cancel via `AbortSignal`, reading/`requestDrain()` via `runtime.control`, `stream()` accepts control, and functional-API in-flight `task` futures still resolve. Full package suite passes (1358 + 14, 0 failures); lint and format are clean. ## Notable divergence from Python Python added `"drained"` to a local `SubgraphStatus` literal. The JS v3 stream lifecycle uses `AgentStatus` from the external `@langchain/protocol` package, which has no `"drained"` member, so `GraphDrained` propagates through streams as the terminal error rather than as a new lifecycle status. The parity-relevant signal — the `GraphDrained` exception — is what consumers catch. Noted in the changeset. ## Source - Python PR: https://github.com/langchain-ai/langgraph/pull/7274 - Parity plan section: Graph draining / graceful shutdown |
||
|
|
d65a9209d7 |
feat(langgraph): add node-level error handlers (#2451)
`StateGraph.addNode(name, fn, { errorHandler })` now accepts a
first-class node-level error handler. The handler runs ONLY after the
failing node's `retryPolicy` is exhausted, so retry and handling stay
decoupled. It receives a typed `NodeError { node, error }`, can return a
state update, and can route to a recovery branch via `new Command({ goto
})` (saga / compensation flows).
Failure provenance is checkpointed (via a reserved `ERROR_SOURCE_NODE`
write) so handlers observe the same context after a checkpoint resume.
Uncaught node errors without a handler still abort the run as before,
and `GraphBubbleUp` errors (such as `interrupt()`) are never swallowed
by a handler.
Ports the Python feature from langchain-ai/langgraph#7233.
|
||
|
|
2f6d87368e |
feat(langgraph): add node-level timeouts (timeout on addNode, task, entrypoint, Send) (#2450)
A `timeout` option is now supported on `StateGraph.addNode`, the
functional API (`task`/`entrypoint`), and the `Send` constructor. Pass a
number of milliseconds for a hard wall-clock cap, or a `TimeoutPolicy`
for finer control:
```ts
import { TimeoutPolicy } from "@langchain/langgraph";
// hard wall-clock cap on each attempt
builder.addNode("agent", agentFn, { timeout: 60_000 });
// full control
builder.addNode("agent", agentFn, {
timeout: {
runTimeout: 60_000, // hard wall-clock cap, never refreshed
idleTimeout: 10_000, // cap on time without observable progress
refreshOn: "auto", // "auto" | "heartbeat"
},
});
// per-task override
new Send("agent", state, { idleTimeout: 5_000 });
```
When a timeout fires, a `NodeTimeoutError` (carrying `node`, `kind`
(`"run"`/`"idle"`), `timeout`, `elapsed`, `runTimeout`, `idleTimeout`)
is raised, the attempt's buffered writes are dropped, and the node's
`AbortSignal` is aborted. `idleTimeout` is refreshed by observable
progress (writes, custom stream-writer calls, child-task scheduling,
callback events) or an explicit `runtime.heartbeat()` call. The timer
resets per retry attempt, and `NodeTimeoutError` is retryable under the
default retry policy.
Ports langchain-ai/langgraph `#7599`, `#7646`, and `#7659`.
|
||
|
|
f6a6d26b7e |
fix(langgraph-checkpoint-sqlite): honor WRITES_IDX_MAP for special channels in putWrites (#2516)
## Summary `SqliteSaver.putWrites` stored every write at the call-local ordinal `idx`, ignoring `WRITES_IDX_MAP`. So when an `INTERRUPT` (or `ERROR` / `SCHEDULED` / `RESUME`) followed a regular write for the same task, both landed at `idx=0` and the table PK `(thread_id, checkpoint_ns, checkpoint_id, task_id, idx)` collided — `INSERT OR REPLACE` silently dropped the regular write. Other checkpointer implementations (Memory in `libs/checkpoint`, Postgres) and the **Python** SQLite checkpointer (`langgraph/checkpoint/sqlite/__init__.py`) all pin special channels to fixed negative indices via `WRITES_IDX_MAP` so they can't collide with per-step regular writes. ### Cross-impl parity before this PR | Checkpointer | `WRITES_IDX_MAP` | Conflict clause | |---|---|---| | Memory (TS) | ✅ | gated by `idx >= 0` | | Postgres (TS) | ✅ | `OR REPLACE` vs `INSERT` based on `all special` | | Python SQLite | ✅ | `OR REPLACE` vs `OR IGNORE` based on `all special` | | **TS SQLite** | ❌ | always `OR REPLACE` | ### Fix 1. `idx` resolves to `WRITES_IDX_MAP[channel] ?? idx`. 2. Statement switches between `INSERT OR REPLACE` and `INSERT OR IGNORE` depending on whether every write targets a special channel, matching `langgraph/checkpoint/sqlite/__init__.py`. INTERRUPT→RESUME state transitions overwrite (both special); concurrent tasks can't clobber each other's regular writes at the same idx. ### Tests New regression test interleaves regular and special-channel writes across two tasks (`task_A` does regular writes → INTERRUPT → RESUME, `task_B` does a regular write). All five logical writes survive `getTuple().pendingWrites`. **Reverse-verified**: without the fix, `task_A:foo` and `task_A:__interrupt__` both disappear from the round-trip — the test fails with `Set { task_A:__resume__, task_A:bar, task_B:baz }`. ## AI Disclosure This bug was identified via cross-implementation review against the Python SQLite checkpointer and TS `MemorySaver` / `PostgresSaver`, with AI assistance. The fix mirrors the Python reference implementation. |
||
|
|
49b8c1a04c |
fix: make AnyStream a true supertype so selector hooks need no cast (#2515)
## Summary - `AnyStream` (`UseStreamReturn<any, any, any>`) was not actually a supertype of concrete stream handles: members computed from the generics in covariant positions don't collapse under `any`. `toolCalls` resolves via `InferToolCalls<any>` to `AssembledToolCall<string, …, never>[]`, whose `never` output slot is narrower than a concrete handle's `unknown`, so `UseStreamReturn<typeof agent>` failed to assign and every `useMessages`/`useToolCalls`/`useValues` (`inject*` on Angular) call required an `as AnyStream` cast. - Redefined `AnyStream` in all four framework packages to `Omit` the generic-computed members and re-add them at their widest forms, preserving each framework's reactivity wrapper: plain arrays for React/Svelte, `Readonly<ShallowRef<…>>` for Vue, `Signal<…>` for Angular. React also drops `~stateType` (the only package that has that member). - Retyped each package's internal `getRegistry` to accept `AnyStream`, removed React's duplicate local `AnyStream` in `selectors.ts` in favor of the public type, and corrected the misleading doc comments. - Downstream (`langchainplus` agent-chat-v2) can drop its `stream as AnyStream` casts once these ship. |
||
|
|
801d955d39 |
feat(langgraph): add StateGraph.setNodeDefaults() for graph-wide node policy defaults (#2461)
## Summary
- Add `StateGraph.setNodeDefaults({ retryPolicy?, cachePolicy? })` for
graph-wide node policy defaults, resolved at `compile()` so call order
does not matter; per-node `addNode` options always take precedence.
- Defaults are not inherited by subgraphs (parity with Python #7747).
- Consolidate duplicate `retryPolicy` / `cachePolicy` fields into
exported `NodePolicyOptions` with shared TSDoc; `NodeDefaults` and
`StateGraphAddNodeOptions` both use it; internal specs use
`ResolvedNodePolicies` after boolean `cachePolicy` normalization.
|
||
|
|
9b96f60af6 |
perf(core): gate debug checkpoint snapshots on stream mode (#2471)
## Summary - Skip building full-state `mapDebugCheckpoint` payloads on every tick unless the stream subscribes to `checkpoints` or `debug`. - Gate `mapDebugTasks` the same way for `tasks` or `debug`, including dynamically pushed tasks in `acceptPush`. - v3 `streamEvents` companion `checkpoints` events are unchanged; they are derived from values metadata, not `mapDebugCheckpoint`. This change only skips building full-state mapDebugCheckpoint / pre-run mapDebugTasks payloads when the stream is not subscribed to checkpoints, tasks, or debug. Execution, checkpoint persistence, and emitted chunks for a given streamMode are unchanged, `_emit` already dropped those events for other modes, so this removes wasted work rather than altering behavior. v3 streamEvents companion checkpoints envelopes are unaffected; they come from values metadata via `_emitValuesWithCheckpointMeta`, not from `mapDebugCheckpoint`. Subscribers to checkpoints, tasks, or debug still receive the same debug snapshots as before. --------- Co-authored-by: Cursor <cursoragent@cursor.com> |
||
|
|
8e06ace95c |
perf(core): index pending writes for O(1) task-prep lookups (#2472)
## Summary - Add `PendingWritesIndex` built once in `_prepareNextTasks` with maps for null resume, per-task resume values, and task IDs with successful writes. - Use the index in `_scratchpad` and PULL early-exit checks instead of repeated `find`/`filter`/`some` over `pendingWrites`. - Preserve linear-scan fallbacks when `_prepareSingleTask` is invoked without a pre-built index. This is a performance-only change: task preparation and resume behavior are unchanged. |
||
|
|
a8b0036557 |
perf(core): optimize applyWrites, interrupt seen, and channel errors (#2473)
## Summary - Optimize `_applyWrites`: pre-compute sort paths, `RESERVED_SET`, and a single pass over tasks for version tracking and channel consumption. - Fix `_first` interrupt `versions_seen` updates from O(N²) spreads to one object build (also avoids mutating shallow-copied checkpoint refs). - Skip V8 stack capture for `EmptyChannelError` (control-flow throws on channel reads). - Cache `Object.values(this.tasks)` in `tick()` and `Object.values(this.loop.tasks)` in the runner. |
||
|
|
9e0201d8bd |
fix(core): expose StateSchema JSON schemas for Studio introspection (#2514)
## Summary - Fix schema introspection for graphs built with `StateSchema` so LangGraph Studio receives correct state, input, update, and output JSON schemas. - Add regression coverage for `new StateGraph(StateSchema, z.object(...))`, including context/config schema exposure. - Closes #2466. |
||
|
|
375c73fcd1 |
fix(langgraph-checkpoint-postgres): reject SQL LIKE wildcards in PostgresStore namespace labels (#2512)
## Summary
`BaseStore.search()` on `PostgresStore` matches namespaces via
`namespace_path LIKE \${prefix}%` (bound parameter). The bind protects
against SQL injection but **does not** keep Postgres from interpreting
`%`, `_`, or `\` inside the label itself as `LIKE` wildcards / escape
characters. So a caller-supplied namespace prefix containing `%`
silently widens the prefix into a glob — data leaks across namespaces in
any multi-tenant deployment that pipes configurable values into a
`BaseStore` namespace.
`InMemoryStore` is unaffected — it compares prefixes via literal
`String.startsWith()`.
### Repro (conceptually, against the old `validateNamespace`)
```ts
const store = PostgresStore.fromConnString(url);
// tenant A writes private data
await store.put(["acme", "users", "alice"], "preferences", { theme: "dark" });
// tenant B searches under their own namespace — fine
await store.search(["other-tenant"]);
// but B can also do this, and the search returns A's row:
await store.search(["%"]); // matches every namespace
await store.search(["a%", "users"]); // matches "acme:users", "any:users", ...
```
After this PR `validateNamespace` rejects `%` / `_` / `\` at all
`search` / `get` / `put` / `delete` entrypoints, matching the existing
handling of `.` and empty labels.
### Tests
New `src/store/modules/utils.test.ts` exercises `validateNamespace`
directly (it's a pure function, so no live Postgres needed). 8 new cases
cover each wildcard char in isolation, in combination with other
letters, and at non-first positions; benign characters that *look*
similar (`-`, `:`, digits, unicode) are explicitly allowed.
**Reverse-verified**: with this PR's `utils.ts` reverted, 7 of the 7 new
LIKE-wildcard tests fail (`expected [Function] to throw an error /
Received undefined`).
### Consistency
| Store | Namespace prefix match | Wildcard handling |
|-------|------------------------|--------------------|
| `InMemoryStore` | `String.startsWith()` (literal) | n/a — already safe
|
| `PostgresStore` | `namespace_path LIKE \${prefix}%` | wildcards
rejected at validation (this PR) |
| `RedisStore` (precedent) | `KEYS namespace:*:...` | already rejects
`*`/`?`/`[`/`]`/`\` via `assertSafeKeyComponent` |
CWE-1336 (Improper Neutralization of Special Elements Used in a Template
Engine).
## AI Disclosure
This issue was identified via cross-store consistency review with AI
assistance, and the fix was validated against a focused unit-test suite
plus reverse-verification (test suite fails without the fix).
|
||
|
|
2f88a7116c |
chore: version packages (#2509)
This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated. # Releases ## @langchain/langgraph-sdk@1.9.20 ### Patch Changes - [#2508](https://github.com/langchain-ai/langgraphjs/pull/2508) [`41cd05a`](https://github.com/langchain-ai/langgraphjs/commit/41cd05a411ed262443c2bd1048e1b728b7331ac6) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(sdk): hydrate custom HttpAgentServerAdapter via transport getState StreamController now prefers adapter getState() before client.threads.getState, HttpAgentServerAdapter implements GET /threads/:id/state, and useStream inherits apiUrl from the transport so hydration no longer defaults to localhost:8123. ## @langchain/angular@1.0.20 ### Patch Changes - [#2508](https://github.com/langchain-ai/langgraphjs/pull/2508) [`41cd05a`](https://github.com/langchain-ai/langgraphjs/commit/41cd05a411ed262443c2bd1048e1b728b7331ac6) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(sdk): hydrate custom HttpAgentServerAdapter via transport getState StreamController now prefers adapter getState() before client.threads.getState, HttpAgentServerAdapter implements GET /threads/:id/state, and useStream inherits apiUrl from the transport so hydration no longer defaults to localhost:8123. - Updated dependencies \[[`41cd05a`](https://github.com/langchain-ai/langgraphjs/commit/41cd05a411ed262443c2bd1048e1b728b7331ac6)]: - @langchain/langgraph-sdk@1.9.20 ## @langchain/react@1.0.20 ### Patch Changes - [#2508](https://github.com/langchain-ai/langgraphjs/pull/2508) [`41cd05a`](https://github.com/langchain-ai/langgraphjs/commit/41cd05a411ed262443c2bd1048e1b728b7331ac6) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(sdk): hydrate custom HttpAgentServerAdapter via transport getState StreamController now prefers adapter getState() before client.threads.getState, HttpAgentServerAdapter implements GET /threads/:id/state, and useStream inherits apiUrl from the transport so hydration no longer defaults to localhost:8123. - Updated dependencies \[[`41cd05a`](https://github.com/langchain-ai/langgraphjs/commit/41cd05a411ed262443c2bd1048e1b728b7331ac6)]: - @langchain/langgraph-sdk@1.9.20 ## @langchain/svelte@1.0.20 ### Patch Changes - [#2508](https://github.com/langchain-ai/langgraphjs/pull/2508) [`41cd05a`](https://github.com/langchain-ai/langgraphjs/commit/41cd05a411ed262443c2bd1048e1b728b7331ac6) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(sdk): hydrate custom HttpAgentServerAdapter via transport getState StreamController now prefers adapter getState() before client.threads.getState, HttpAgentServerAdapter implements GET /threads/:id/state, and useStream inherits apiUrl from the transport so hydration no longer defaults to localhost:8123. - Updated dependencies \[[`41cd05a`](https://github.com/langchain-ai/langgraphjs/commit/41cd05a411ed262443c2bd1048e1b728b7331ac6)]: - @langchain/langgraph-sdk@1.9.20 ## @langchain/vue@1.0.20 ### Patch Changes - [#2508](https://github.com/langchain-ai/langgraphjs/pull/2508) [`41cd05a`](https://github.com/langchain-ai/langgraphjs/commit/41cd05a411ed262443c2bd1048e1b728b7331ac6) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(sdk): hydrate custom HttpAgentServerAdapter via transport getState StreamController now prefers adapter getState() before client.threads.getState, HttpAgentServerAdapter implements GET /threads/:id/state, and useStream inherits apiUrl from the transport so hydration no longer defaults to localhost:8123. - Updated dependencies \[[`41cd05a`](https://github.com/langchain-ai/langgraphjs/commit/41cd05a411ed262443c2bd1048e1b728b7331ac6)]: - @langchain/langgraph-sdk@1.9.20 ## @example/ai-elements@0.1.35 ### Patch Changes - Updated dependencies \[[`41cd05a`](https://github.com/langchain-ai/langgraphjs/commit/41cd05a411ed262443c2bd1048e1b728b7331ac6)]: - @langchain/react@1.0.20 ## @examples/assistant-ui-claude@0.1.35 ### Patch Changes - Updated dependencies \[[`41cd05a`](https://github.com/langchain-ai/langgraphjs/commit/41cd05a411ed262443c2bd1048e1b728b7331ac6)]: - @langchain/react@1.0.20 ## @examples/ui-angular@0.0.45 ### Patch Changes - Updated dependencies \[[`41cd05a`](https://github.com/langchain-ai/langgraphjs/commit/41cd05a411ed262443c2bd1048e1b728b7331ac6)]: - @langchain/langgraph-sdk@1.9.20 - @langchain/angular@1.0.20 ## @examples/ui-multimodal@0.0.21 ### Patch Changes - Updated dependencies \[[`41cd05a`](https://github.com/langchain-ai/langgraphjs/commit/41cd05a411ed262443c2bd1048e1b728b7331ac6)]: - @langchain/react@1.0.20 ## @examples/ui-react@0.0.21 ### Patch Changes - Updated dependencies \[[`41cd05a`](https://github.com/langchain-ai/langgraphjs/commit/41cd05a411ed262443c2bd1048e1b728b7331ac6)]: - @langchain/langgraph-sdk@1.9.20 - @langchain/react@1.0.20 Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>@langchain/angular@1.0.20 @langchain/langgraph-sdk@1.9.20 @langchain/react@1.0.20 @langchain/svelte@1.0.20 @langchain/vue@1.0.20 |
||
|
|
41cd05a411 |
fix(sdk): hydrate custom transport without extra client config (#2508)
## Summary
- `StreamController.hydrate()` calls `transport.getState()` when the
adapter implements it, then falls back to `client.threads.getState()`.
- `HttpAgentServerAdapter` / `ProtocolSseTransportAdapter` add
`getState()` via `GET /threads/:threadId/state` (optional `paths.state`
override).
- `resolveClientApiUrl()` lets `useStream` build the hydration `Client`
from the transport’s `apiUrl` when none is passed explicitly.
- React, Vue, and Angular `useStream` hooks use the resolver so
custom-backend apps only need `transport={adapter}`.
|
||
|
|
92ea6ab754 |
chore: version packages (#2507)
This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated. # Releases ## @langchain/langgraph-checkpoint-validation@1.1.0 ### Minor Changes - [#2503](https://github.com/langchain-ai/langgraphjs/pull/2503) [`6e850fb`](https://github.com/langchain-ai/langgraphjs/commit/6e850fbabc842bb495352fbd6ef424c67ab0948f) Thanks [@jkennedyvz](https://github.com/jkennedyvz)! - fix(langgraph-checkpoint-validation): align node engine with vitest ## @langchain/langgraph-api@1.3.0 ### Minor Changes - [#2505](https://github.com/langchain-ai/langgraphjs/pull/2505) [`cad31b4`](https://github.com/langchain-ai/langgraphjs/commit/cad31b42f001a87fcdf57c4c084c655c8762b6a5) Thanks [@christian-bromann](https://github.com/christian-bromann)! - Consolidate the protocol session's channel inference, channel-set validation, and namespace prefix matching onto the shared `@langchain/langgraph/stream` helpers instead of maintaining local copies. This removes duplicated logic across `session/index.mts`, `session/namespace.mts`, `session/internal-types.mts`, and `service.mts`. This also aligns SSE event-sink filtering (`matchesSinkFilter`) with the WebSocket subscription matcher: both now normalize dynamic namespace suffixes (e.g. a `["fetcher"]` namespace filter matches an event emitted under `["fetcher:<uuid>"]`). Previously the SSE path used a stricter exact-segment match. Because the session now imports `@langchain/langgraph/stream`, the `@langchain/langgraph` peer dependency floor is raised to `^1.3.6` (the first release that ships the `/stream` entrypoint). ### Patch Changes - Updated dependencies \[]: - @langchain/langgraph-ui@1.3.0 ## @langchain/langgraph-checkpoint-sqlite@1.0.2 ### Patch Changes - [#2504](https://github.com/langchain-ai/langgraphjs/pull/2504) [`e8a0940`](https://github.com/langchain-ai/langgraphjs/commit/e8a09409ac4a997012e78081160c91188ebe39fc) Thanks [@jackjin1997](https://github.com/jackjin1997)! - fix: `SqliteSaver.list({}, { filter })` now honors arbitrary metadata keys (e.g. `tenant_id`, `env`), matching the behavior of the MongoDB, Postgres, and Redis checkpointers. Previously only `source`, `step`, and `parents` were honored — any other key was silently dropped, returning unfiltered results. ## @langchain/langgraph-cli@1.3.0 ### Patch Changes - Updated dependencies \[[`cad31b4`](https://github.com/langchain-ai/langgraphjs/commit/cad31b42f001a87fcdf57c4c084c655c8762b6a5)]: - @langchain/langgraph-api@1.3.0 ## @langchain/langgraph@1.3.7 ### Patch Changes - [#2505](https://github.com/langchain-ai/langgraphjs/pull/2505) [`cad31b4`](https://github.com/langchain-ai/langgraphjs/commit/cad31b42f001a87fcdf57c4c084c655c8762b6a5) Thanks [@christian-bromann](https://github.com/christian-bromann)! - Add the `@langchain/langgraph/stream` entrypoint — a transport-agnostic backend toolkit for building custom servers on top of the v2 streaming protocol. Alongside the existing `StreamChannel` and `convertToProtocolEvent`, it exposes subscription primitives, typed against a minimal `MatchableEvent` shape so they work on both the core `ProtocolEvent` and the wire-level `Event` from `@langchain/protocol`: - `inferChannel(event)` — map an event to its subscription `Channel` (named `custom:<name>` channels included). - `matchesSubscription(event, definition)` — decide whether a buffered event should be delivered for a `SubscribeParams` filter, honoring channel, namespace prefix/depth, and an optional `since` replay cursor. - `isPrefixMatch(namespace, prefix)` / `normalizeNamespaceSegment(segment)` — namespace prefix matching with dynamic-suffix normalization (e.g. `fetcher:<uuid>` matches the `fetcher` prefix). - `SUPPORTED_CHANNELS` / `isSupportedChannel(value)` — the recognized channel set and a guard for validating subscription requests. - Updated dependencies \[[`cad31b4`](https://github.com/langchain-ai/langgraphjs/commit/cad31b42f001a87fcdf57c4c084c655c8762b6a5)]: - @langchain/langgraph-sdk@1.9.19 ## @langchain/langgraph-sdk@1.9.19 ### Patch Changes - [#2505](https://github.com/langchain-ai/langgraphjs/pull/2505) [`cad31b4`](https://github.com/langchain-ai/langgraphjs/commit/cad31b42f001a87fcdf57c4c084c655c8762b6a5) Thanks [@christian-bromann](https://github.com/christian-bromann)! - Deduplicate the client stream transports: the protocol transport now shares the SSE decoder and `IterableReadableStream` helpers with the legacy transport instead of carrying its own copies. Removes the redundant `transport/decoder.ts` and `transport/stream.ts` shims (and a dead `StreamPart` re-export), importing the shared utilities from `utils/sse.ts` directly. No public API or behavior change. ## @langchain/angular@1.0.19 ### Patch Changes - Updated dependencies \[[`cad31b4`](https://github.com/langchain-ai/langgraphjs/commit/cad31b42f001a87fcdf57c4c084c655c8762b6a5)]: - @langchain/langgraph-sdk@1.9.19 ## @langchain/react@1.0.19 ### Patch Changes - Updated dependencies \[[`cad31b4`](https://github.com/langchain-ai/langgraphjs/commit/cad31b42f001a87fcdf57c4c084c655c8762b6a5)]: - @langchain/langgraph-sdk@1.9.19 ## @langchain/svelte@1.0.19 ### Patch Changes - Updated dependencies \[[`cad31b4`](https://github.com/langchain-ai/langgraphjs/commit/cad31b42f001a87fcdf57c4c084c655c8762b6a5)]: - @langchain/langgraph-sdk@1.9.19 ## @langchain/vue@1.0.19 ### Patch Changes - Updated dependencies \[[`cad31b4`](https://github.com/langchain-ai/langgraphjs/commit/cad31b42f001a87fcdf57c4c084c655c8762b6a5)]: - @langchain/langgraph-sdk@1.9.19 ## @langchain/langgraph-ui@1.3.0 ## @example/ai-elements@0.1.34 ### Patch Changes - Updated dependencies \[[`cad31b4`](https://github.com/langchain-ai/langgraphjs/commit/cad31b42f001a87fcdf57c4c084c655c8762b6a5)]: - @langchain/langgraph@1.3.7 - @langchain/react@1.0.19 ## @examples/assistant-ui-claude@0.1.34 ### Patch Changes - Updated dependencies \[[`cad31b4`](https://github.com/langchain-ai/langgraphjs/commit/cad31b42f001a87fcdf57c4c084c655c8762b6a5)]: - @langchain/langgraph@1.3.7 - @langchain/react@1.0.19 ## @examples/ui-angular@0.0.44 ### Patch Changes - Updated dependencies \[[`cad31b4`](https://github.com/langchain-ai/langgraphjs/commit/cad31b42f001a87fcdf57c4c084c655c8762b6a5), [`cad31b4`](https://github.com/langchain-ai/langgraphjs/commit/cad31b42f001a87fcdf57c4c084c655c8762b6a5)]: - @langchain/langgraph@1.3.7 - @langchain/langgraph-sdk@1.9.19 - @langchain/angular@1.0.19 ## @examples/ui-multimodal@0.0.20 ### Patch Changes - Updated dependencies \[[`cad31b4`](https://github.com/langchain-ai/langgraphjs/commit/cad31b42f001a87fcdf57c4c084c655c8762b6a5)]: - @langchain/langgraph@1.3.7 - @langchain/react@1.0.19 ## @examples/ui-react@0.0.20 ### Patch Changes - Updated dependencies \[[`cad31b4`](https://github.com/langchain-ai/langgraphjs/commit/cad31b42f001a87fcdf57c4c084c655c8762b6a5), [`cad31b4`](https://github.com/langchain-ai/langgraphjs/commit/cad31b42f001a87fcdf57c4c084c655c8762b6a5)]: - @langchain/langgraph@1.3.7 - @langchain/langgraph-sdk@1.9.19 - @langchain/react@1.0.19 ## langgraph@1.0.39 ### Patch Changes - Updated dependencies \[[`cad31b4`](https://github.com/langchain-ai/langgraphjs/commit/cad31b42f001a87fcdf57c4c084c655c8762b6a5)]: - @langchain/langgraph@1.3.7 Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>@langchain/angular@1.0.19 @langchain/langgraph-api@1.3.0 @langchain/langgraph-checkpoint-sqlite@1.0.2 @langchain/langgraph-checkpoint-validation@1.1.0 @langchain/langgraph-cli@1.3.0 @langchain/langgraph-sdk@1.9.19 @langchain/langgraph-ui@1.3.0 @langchain/langgraph@1.3.7 @langchain/react@1.0.19 @langchain/svelte@1.0.19 @langchain/vue@1.0.19 |
||
|
|
cad31b42f0 |
chore(sdk): centralize protocol helpers across core, api, and sdk (#2505)
## Summary - Add `@langchain/langgraph/stream` in `@langchain/langgraph` — a curated backend entrypoint for custom transports with `StreamChannel`, `convertToProtocolEvent`, and shared subscription primitives (`inferChannel`, `matchesSubscription`, `isPrefixMatch`, `normalizeNamespaceSegment`, `SUPPORTED_CHANNELS`, `isSupportedChannel`), typed against a minimal `MatchableEvent` shape. - Refactor `@langchain/langgraph-api` to import those helpers instead of maintaining local copies in the protocol session and SSE sink filter, and raise the `@langchain/langgraph` peer floor to `^1.3.6`. - Align SSE `matchesSinkFilter` with WebSocket subscription matching by using the same namespace suffix normalization (e.g. `["fetcher"]` now matches `["fetcher:<uuid>"]`). - Deduplicate `@langchain/langgraph-sdk` client transports by removing redundant protocol `transport/decoder.ts` and `transport/stream.ts` shims and importing shared utilities from `utils/sse.ts` directly. |
||
|
|
e8a09409ac |
fix(langgraph-checkpoint-sqlite): allow filter on arbitrary metadata keys in list() (#2504)
## Summary
`SqliteSaver.list({}, { filter })` was silently dropping any filter key
that wasn't `source`, `step`, or `parents` — returning the full
unfiltered result set instead. The other checkpointers (MongoDB,
Postgres, Redis) all accept arbitrary metadata keys, so SQLite was the
only odd one out.
### Repro (failing on `main`)
```ts
await saver.put({ configurable: { thread_id: "1" } }, cp, { source: "update", step: 0, parents: {}, tenant_id: "acme" });
await saver.put({ configurable: { thread_id: "2" } }, cp, { source: "update", step: 0, parents: {}, tenant_id: "globex" });
// expected: 1 result (only thread 1)
// actual on main: 2 results (filter silently ignored)
for await (const t of saver.list({}, { filter: { tenant_id: "acme" } })) { ... }
```
### Fix
- Drop the `validCheckpointMetadataKeys` allow-list (`["source", "step",
"parents"]`).
- Pass the JSON path as a bound parameter (`jsonb(...)->? = ?`) so
arbitrary user keys flow through safely without SQL-injection risk.
Validated `better-sqlite3` supports parameterized JSON path on the `->`
operator.
### Tests
New test `should filter on arbitrary metadata keys, not just
CheckpointMetadata keys` exercises three custom keys (`tenant_id`,
`env`, missing) plus combined filters. **Reverse-verified**: with the
fix reverted the new test fails with `expected 2, actual 3` (filter
silently no-ops).
### Consistency parity
| Checkpointer | Arbitrary metadata filter | Before this PR |
|--------------|---------------------------|----------------|
| MongoDB | ✅ via `metadata_search.{key}` (#2186) | ✅ |
| Postgres | ✅ via `metadata @> $1` | ✅ |
| Redis | ✅ via RediSearch tags | ✅ |
| **SQLite** | ✅ via `jsonb(metadata)->? = ?` (this PR) | ❌ |
## AI Disclosure
This bug was identified through cross-checkpointer code review with AI
assistance, and the fix was validated against the existing test suite
plus a new regression test.
---------
Co-authored-by: Christian Bromann <git@bromann.dev>
|
||
|
|
6e850fbabc |
fix(langgraph-checkpoint-validation): align node engine with vitest (#2503)
## Summary - align checkpoint validation package Node engine with Vitest 4 runtime requirements - document the CLI Node requirement - add missing secret file patterns to .gitignore per commit safety preflight ## Testing - Not run per request --------- Co-authored-by: John Kennedy <jkennedyvz@users.noreply.github.com> Co-authored-by: Christian Bromann <git@bromann.dev> |
||
|
|
4468bdf512 |
chore(deps): bump the npm_and_yarn group across 16 directories with 1 update (#2487)
Bumps the npm_and_yarn group with 1 update in the /internal/bench directory: [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest). Bumps the npm_and_yarn group with 1 update in the /internal/environment_tests/test-exports-cf directory: [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest). Bumps the npm_and_yarn group with 1 update in the /libs/checkpoint directory: [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest). Bumps the npm_and_yarn group with 1 update in the /libs/checkpoint-mongodb directory: [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest). Bumps the npm_and_yarn group with 1 update in the /libs/checkpoint-postgres directory: [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest). Bumps the npm_and_yarn group with 1 update in the /libs/checkpoint-redis directory: [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest). Bumps the npm_and_yarn group with 1 update in the /libs/checkpoint-sqlite directory: [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest). Bumps the npm_and_yarn group with 1 update in the /libs/checkpoint-validation directory: [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest). Bumps the npm_and_yarn group with 1 update in the /libs/langgraph-api directory: [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest). Bumps the npm_and_yarn group with 1 update in the /libs/langgraph-cli directory: [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest). Bumps the npm_and_yarn group with 1 update in the /libs/langgraph-core directory: [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest). Bumps the npm_and_yarn group with 1 update in the /libs/langgraph-cua directory: [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest). Bumps the npm_and_yarn group with 1 update in the /libs/langgraph-supervisor directory: [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest). Bumps the npm_and_yarn group with 1 update in the /libs/langgraph-swarm directory: [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest). Bumps the npm_and_yarn group with 1 update in the /libs/langgraph-ui directory: [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest). Bumps the npm_and_yarn group with 1 update in the /libs/sdk directory: [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest). Updates `vitest` from 3.2.4 to 4.1.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/vitest-dev/vitest/releases">vitest's releases</a>.</em></p> <blockquote> <h2>v4.1.0</h2> <p>Vitest 4.1 is out!</p> <p>This release page lists all changes made to the project during the 4.1 beta. To get a review of all the new features, read our <a href="https://vitest.dev/blog/vitest-4-1">blog post</a>.</p> <h3> 🚀 Features</h3> <ul> <li>Return a disposable from doMock() - by <a href="https://github.com/kirkwaiblinger"><code>@kirkwaiblinger</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9332">vitest-dev/vitest#9332</a> <a href="https://github.com/vitest-dev/vitest/commit/e3e659a96"><!-- raw HTML omitted -->(e3e65)<!-- raw HTML omitted --></a></li> <li>Added chai style assertions - by <a href="https://github.com/ronnakamoto"><code>@ronnakamoto</code></a> and <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/8842">vitest-dev/vitest#8842</a> <a href="https://github.com/vitest-dev/vitest/commit/841df9ac5"><!-- raw HTML omitted -->(841df)<!-- raw HTML omitted --></a></li> <li>Update to sinon/fake-timers v15 and add <code>setTickMode</code> to timer controls - by <a href="https://github.com/atscott"><code>@atscott</code></a> and <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/8726">vitest-dev/vitest#8726</a> <a href="https://github.com/vitest-dev/vitest/commit/4b480aaed"><!-- raw HTML omitted -->(4b480)<!-- raw HTML omitted --></a></li> <li>Expose matcher types - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9448">vitest-dev/vitest#9448</a> <a href="https://github.com/vitest-dev/vitest/commit/3e4b913b1"><!-- raw HTML omitted -->(3e4b9)<!-- raw HTML omitted --></a></li> <li>Add <code>toTestSpecification</code> to reported tasks - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9464">vitest-dev/vitest#9464</a> <a href="https://github.com/vitest-dev/vitest/commit/1a4705da9"><!-- raw HTML omitted -->(1a470)<!-- raw HTML omitted --></a></li> <li>Show a warning if <code>vi.mock</code> or <code>vi.hoisted</code> are declared outside of top level of the module - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9387">vitest-dev/vitest#9387</a> <a href="https://github.com/vitest-dev/vitest/commit/5db54a468"><!-- raw HTML omitted -->(5db54)<!-- raw HTML omitted --></a></li> <li>Track and display expectedly failed tests (.fails) in UI and CLI - by <a href="https://github.com/Copilot"><code>@Copilot</code></a>, <strong>sheremet-va</strong> and <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9476">vitest-dev/vitest#9476</a> <a href="https://github.com/vitest-dev/vitest/commit/77d75fd34"><!-- raw HTML omitted -->(77d75)<!-- raw HTML omitted --></a></li> <li>Support tags - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9478">vitest-dev/vitest#9478</a> <a href="https://github.com/vitest-dev/vitest/commit/de7c8a521"><!-- raw HTML omitted -->(de7c8)<!-- raw HTML omitted --></a></li> <li>Implement <code>aroundEach</code> and <code>aroundAll</code> hooks - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9450">vitest-dev/vitest#9450</a> <a href="https://github.com/vitest-dev/vitest/commit/2a8cb9dc2"><!-- raw HTML omitted -->(2a8cb)<!-- raw HTML omitted --></a></li> <li>Stabilize experimental features - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9529">vitest-dev/vitest#9529</a> <a href="https://github.com/vitest-dev/vitest/commit/b5fd2a16a"><!-- raw HTML omitted -->(b5fd2)<!-- raw HTML omitted --></a></li> <li>Accept <code>new</code> or <code>all</code> in <code>--update</code> flag - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9543">vitest-dev/vitest#9543</a> <a href="https://github.com/vitest-dev/vitest/commit/a5acf28a5"><!-- raw HTML omitted -->(a5acf)<!-- raw HTML omitted --></a></li> <li>Support <code>meta</code> in test options - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9535">vitest-dev/vitest#9535</a> <a href="https://github.com/vitest-dev/vitest/commit/7d622e3d1"><!-- raw HTML omitted -->(7d622)<!-- raw HTML omitted --></a></li> <li>Support type inference with a new <code>test.extend</code> syntax - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9550">vitest-dev/vitest#9550</a> <a href="https://github.com/vitest-dev/vitest/commit/e53854fcc"><!-- raw HTML omitted -->(e5385)<!-- raw HTML omitted --></a></li> <li>Support vite 8 beta, fix type issues in the config with different vite versions - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9587">vitest-dev/vitest#9587</a> <a href="https://github.com/vitest-dev/vitest/commit/990281dfd"><!-- raw HTML omitted -->(99028)<!-- raw HTML omitted --></a></li> <li>Add assertion helper to hide internal stack traces - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a> and <strong>Claude Opus 4.6</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9594">vitest-dev/vitest#9594</a> <a href="https://github.com/vitest-dev/vitest/commit/eeb0ae2f8"><!-- raw HTML omitted -->(eeb0a)<!-- raw HTML omitted --></a></li> <li>Store failure screenshots using artifacts API - by <a href="https://github.com/macarie"><code>@macarie</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9588">vitest-dev/vitest#9588</a> <a href="https://github.com/vitest-dev/vitest/commit/24603e3c4"><!-- raw HTML omitted -->(24603)<!-- raw HTML omitted --></a></li> <li>Allow <code>vitest list</code> to statically collect tests instead of running files to collect them - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9630">vitest-dev/vitest#9630</a> <a href="https://github.com/vitest-dev/vitest/commit/7a8e7fc20"><!-- raw HTML omitted -->(7a8e7)<!-- raw HTML omitted --></a></li> <li>Add <code>--detect-async-leaks</code> - by <a href="https://github.com/AriPerkkio"><code>@AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9528">vitest-dev/vitest#9528</a> <a href="https://github.com/vitest-dev/vitest/commit/c594d4af3"><!-- raw HTML omitted -->(c594d)<!-- raw HTML omitted --></a></li> <li>Implement <code>mockThrow</code> and <code>mockThrowOnce</code> - by <a href="https://github.com/thor-juhasz"><code>@thor-juhasz</code></a> and <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9512">vitest-dev/vitest#9512</a> <a href="https://github.com/vitest-dev/vitest/commit/619179fb7"><!-- raw HTML omitted -->(61917)<!-- raw HTML omitted --></a></li> <li>Support <code>update: "none"</code> and add docs about snapshots behavior on CI - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9700">vitest-dev/vitest#9700</a> <a href="https://github.com/vitest-dev/vitest/commit/05f1854e2"><!-- raw HTML omitted -->(05f18)<!-- raw HTML omitted --></a></li> <li>Support playwright <code>launchOptions</code> with <code>connectOptions</code> - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9702">vitest-dev/vitest#9702</a> <a href="https://github.com/vitest-dev/vitest/commit/f0ff1b2a0"><!-- raw HTML omitted -->(f0ff1)<!-- raw HTML omitted --></a></li> <li>Add <code>page/locator.mark</code> API to enhance playwright trace - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9652">vitest-dev/vitest#9652</a> <a href="https://github.com/vitest-dev/vitest/commit/d0ee546fe"><!-- raw HTML omitted -->(d0ee5)<!-- raw HTML omitted --></a></li> <li><strong>api</strong>: <ul> <li>Support tests starting or ending with <code>test</code> in <code>experimental_parseSpecification</code> - by <a href="https://github.com/jgillick"><code>@jgillick</code></a> and <strong>Jeremy Gillick</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9235">vitest-dev/vitest#9235</a> <a href="https://github.com/vitest-dev/vitest/commit/2f367fad3"><!-- raw HTML omitted -->(2f367)<!-- raw HTML omitted --></a></li> <li>Add filters to <code>createSpecification</code> - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9336">vitest-dev/vitest#9336</a> <a href="https://github.com/vitest-dev/vitest/commit/c8e6c7fbf"><!-- raw HTML omitted -->(c8e6c)<!-- raw HTML omitted --></a></li> <li>Expose <code>runTestFiles</code> as alternative to <code>runTestSpecifications</code> - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9443">vitest-dev/vitest#9443</a> <a href="https://github.com/vitest-dev/vitest/commit/43d761821"><!-- raw HTML omitted -->(43d76)<!-- raw HTML omitted --></a></li> <li>Add <code>allowWrite</code> and <code>allowExec</code> options to <code>api</code> - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9350">vitest-dev/vitest#9350</a> <a href="https://github.com/vitest-dev/vitest/commit/20e00ef78"><!-- raw HTML omitted -->(20e00)<!-- raw HTML omitted --></a></li> <li>Allow passing down test cases to <code>toTestSpecification</code> - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9627">vitest-dev/vitest#9627</a> <a href="https://github.com/vitest-dev/vitest/commit/6f17d5ddf"><!-- raw HTML omitted -->(6f17d)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>browser</strong>: <ul> <li>Add <code>userEvent.wheel</code> API - by <a href="https://github.com/macarie"><code>@macarie</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9188">vitest-dev/vitest#9188</a> <a href="https://github.com/vitest-dev/vitest/commit/660801979"><!-- raw HTML omitted -->(66080)<!-- raw HTML omitted --></a></li> <li>Add <code>filterNode</code> option to prettyDOM for filtering browser assertion error output - by <a href="https://github.com/Copilot"><code>@Copilot</code></a>, <strong>sheremet-va</strong> and <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9475">vitest-dev/vitest#9475</a> <a href="https://github.com/vitest-dev/vitest/commit/d3220fcd8"><!-- raw HTML omitted -->(d3220)<!-- raw HTML omitted --></a></li> <li>Support playwright persistent context - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a>, <strong>Claude Opus 4.6</strong> and <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9229">vitest-dev/vitest#9229</a> <a href="https://github.com/vitest-dev/vitest/commit/f865d2ba4"><!-- raw HTML omitted -->(f865d)<!-- raw HTML omitted --></a></li> <li>Added <code>detailsPanelPosition</code> option and button - by <a href="https://github.com/shairez"><code>@shairez</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9525">vitest-dev/vitest#9525</a> <a href="https://github.com/vitest-dev/vitest/commit/c8a31147c"><!-- raw HTML omitted -->(c8a31)<!-- raw HTML omitted --></a></li> <li>Use BlazeDiff instead of pixelmatch - by <a href="https://github.com/macarie"><code>@macarie</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9514">vitest-dev/vitest#9514</a> <a href="https://github.com/vitest-dev/vitest/commit/309362089"><!-- raw HTML omitted -->(30936)<!-- raw HTML omitted --></a></li> <li>Add <code>findElement</code> and enable strict mode in webdriverio and preview - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9677">vitest-dev/vitest#9677</a> <a href="https://github.com/vitest-dev/vitest/commit/c3f37721c"><!-- raw HTML omitted -->(c3f37)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>cli</strong>: <ul> <li>Add <a href="https://github.com/bomb"><code>@bomb</code></a>.sh/tab completions - by <a href="https://github.com/AmirSa12"><code>@AmirSa12</code></a> and <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/8639">vitest-dev/vitest#8639</a> <a href="https://github.com/vitest-dev/vitest/commit/200f31704"><!-- raw HTML omitted -->(200f3)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>coverage</strong>: <ul> <li>Support <code>ignore start/stop</code> ignore hints - by <a href="https://github.com/AriPerkkio"><code>@AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9204">vitest-dev/vitest#9204</a> <a href="https://github.com/vitest-dev/vitest/commit/e59c94ba6"><!-- raw HTML omitted -->(e59c9)<!-- raw HTML omitted --></a></li> <li>Add <code>coverage.changed</code> option to report only changed files - by <a href="https://github.com/kykim00"><code>@kykim00</code></a> and <a href="https://github.com/AriPerkkio"><code>@AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9521">vitest-dev/vitest#9521</a> <a href="https://github.com/vitest-dev/vitest/commit/1d9392c67"><!-- raw HTML omitted -->(1d939)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>experimental</strong>: <ul> <li>Add <code>onModuleRunner</code> hook to <code>worker.init</code> - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9286">vitest-dev/vitest#9286</a> <a href="https://github.com/vitest-dev/vitest/commit/e977f3deb"><!-- raw HTML omitted -->(e977f)<!-- raw HTML omitted --></a></li> <li>Option to disable the module runner - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> and <a href="https://github.com/AriPerkkio"><code>@AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9210">vitest-dev/vitest#9210</a> <a href="https://github.com/vitest-dev/vitest/commit/9be6121ee"><!-- raw HTML omitted -->(9be61)<!-- raw HTML omitted --></a></li> </ul> </li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/vitest-dev/vitest/commit/4150b913171bda3971a4a4c47c633c26d0c6ae45"><code>4150b91</code></a> chore: release v4.1.0</li> <li><a href="https://github.com/vitest-dev/vitest/commit/1de0aa22dd6311a93546a75a3c58a6be519c1baf"><code>1de0aa2</code></a> fix: correctly identify concurrent test during static analysis (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/9846">#9846</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/c3cac1c1b5a91d921942e9391fbd94841717363f"><code>c3cac1c</code></a> fix: use isAgent check, not just TTY, for watch mode (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/9841">#9841</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/eab68ba2b8ea6f89717c0b885c573579659d7c3b"><code>eab68ba</code></a> chore(deps): update all non-major dependencies (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/9824">#9824</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/031f02a89be34491c441b4da9c4e2bacb7db71df"><code>031f02a</code></a> fix: allow catch/finally for async assertion (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/9827">#9827</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/3e9e096a231fa0ec6475da82e36cbd6fcc9bc8f9"><code>3e9e096</code></a> feat(reporters): add <code>agent</code> reporter to reduce ai agent token usage (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/9779">#9779</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/0c2c01361a95dd26d0d7fd7bc38bcca8dbc6e5d2"><code>0c2c013</code></a> chore: release v4.1.0-beta.6</li> <li><a href="https://github.com/vitest-dev/vitest/commit/8181e06e765f4d043818b244c76795022fa78ff6"><code>8181e06</code></a> fix: <code>hideSkippedTests</code> should not hide <code>test.todo</code> (fix <a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/9562">#9562</a>) (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/9781">#9781</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/a8216b0014b83612e40ef49f919d5293b68717b3"><code>a8216b0</code></a> fix: manual and redirect mock shouldn't <code>load</code> or <code>transform</code> original module...</li> <li><a href="https://github.com/vitest-dev/vitest/commit/689a22a1b8c79595f6f4ae82d2b43c895d7f1c50"><code>689a22a</code></a> fix(browser): types of <code>getCDPSession</code> and <code>cdp()</code> (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/9716">#9716</a>)</li> <li>Additional commits viewable in <a href="https://github.com/vitest-dev/vitest/commits/v4.1.0/packages/vitest">compare view</a></li> </ul> </details> <details> <summary>Maintainer changes</summary> <p>This version was pushed to npm by <a href="https://www.npmjs.com/~GitHub%20Actions">GitHub Actions</a>, a new releaser for vitest since your current version.</p> </details> <br /> Updates `vitest` from 0.34.3 to 4.1.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/vitest-dev/vitest/releases">vitest's releases</a>.</em></p> <blockquote> <h2>v4.1.0</h2> <p>Vitest 4.1 is out!</p> <p>This release page lists all changes made to the project during the 4.1 beta. To get a review of all the new features, read our <a href="https://vitest.dev/blog/vitest-4-1">blog post</a>.</p> <h3> 🚀 Features</h3> <ul> <li>Return a disposable from doMock() - by <a href="https://github.com/kirkwaiblinger"><code>@kirkwaiblinger</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9332">vitest-dev/vitest#9332</a> <a href="https://github.com/vitest-dev/vitest/commit/e3e659a96"><!-- raw HTML omitted -->(e3e65)<!-- raw HTML omitted --></a></li> <li>Added chai style assertions - by <a href="https://github.com/ronnakamoto"><code>@ronnakamoto</code></a> and <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/8842">vitest-dev/vitest#8842</a> <a href="https://github.com/vitest-dev/vitest/commit/841df9ac5"><!-- raw HTML omitted -->(841df)<!-- raw HTML omitted --></a></li> <li>Update to sinon/fake-timers v15 and add <code>setTickMode</code> to timer controls - by <a href="https://github.com/atscott"><code>@atscott</code></a> and <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/8726">vitest-dev/vitest#8726</a> <a href="https://github.com/vitest-dev/vitest/commit/4b480aaed"><!-- raw HTML omitted -->(4b480)<!-- raw HTML omitted --></a></li> <li>Expose matcher types - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9448">vitest-dev/vitest#9448</a> <a href="https://github.com/vitest-dev/vitest/commit/3e4b913b1"><!-- raw HTML omitted -->(3e4b9)<!-- raw HTML omitted --></a></li> <li>Add <code>toTestSpecification</code> to reported tasks - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9464">vitest-dev/vitest#9464</a> <a href="https://github.com/vitest-dev/vitest/commit/1a4705da9"><!-- raw HTML omitted -->(1a470)<!-- raw HTML omitted --></a></li> <li>Show a warning if <code>vi.mock</code> or <code>vi.hoisted</code> are declared outside of top level of the module - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9387">vitest-dev/vitest#9387</a> <a href="https://github.com/vitest-dev/vitest/commit/5db54a468"><!-- raw HTML omitted -->(5db54)<!-- raw HTML omitted --></a></li> <li>Track and display expectedly failed tests (.fails) in UI and CLI - by <a href="https://github.com/Copilot"><code>@Copilot</code></a>, <strong>sheremet-va</strong> and <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9476">vitest-dev/vitest#9476</a> <a href="https://github.com/vitest-dev/vitest/commit/77d75fd34"><!-- raw HTML omitted -->(77d75)<!-- raw HTML omitted --></a></li> <li>Support tags - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9478">vitest-dev/vitest#9478</a> <a href="https://github.com/vitest-dev/vitest/commit/de7c8a521"><!-- raw HTML omitted -->(de7c8)<!-- raw HTML omitted --></a></li> <li>Implement <code>aroundEach</code> and <code>aroundAll</code> hooks - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9450">vitest-dev/vitest#9450</a> <a href="https://github.com/vitest-dev/vitest/commit/2a8cb9dc2"><!-- raw HTML omitted -->(2a8cb)<!-- raw HTML omitted --></a></li> <li>Stabilize experimental features - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9529">vitest-dev/vitest#9529</a> <a href="https://github.com/vitest-dev/vitest/commit/b5fd2a16a"><!-- raw HTML omitted -->(b5fd2)<!-- raw HTML omitted --></a></li> <li>Accept <code>new</code> or <code>all</code> in <code>--update</code> flag - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9543">vitest-dev/vitest#9543</a> <a href="https://github.com/vitest-dev/vitest/commit/a5acf28a5"><!-- raw HTML omitted -->(a5acf)<!-- raw HTML omitted --></a></li> <li>Support <code>meta</code> in test options - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9535">vitest-dev/vitest#9535</a> <a href="https://github.com/vitest-dev/vitest/commit/7d622e3d1"><!-- raw HTML omitted -->(7d622)<!-- raw HTML omitted --></a></li> <li>Support type inference with a new <code>test.extend</code> syntax - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9550">vitest-dev/vitest#9550</a> <a href="https://github.com/vitest-dev/vitest/commit/e53854fcc"><!-- raw HTML omitted -->(e5385)<!-- raw HTML omitted --></a></li> <li>Support vite 8 beta, fix type issues in the config with different vite versions - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9587">vitest-dev/vitest#9587</a> <a href="https://github.com/vitest-dev/vitest/commit/990281dfd"><!-- raw HTML omitted -->(99028)<!-- raw HTML omitted --></a></li> <li>Add assertion helper to hide internal stack traces - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a> and <strong>Claude Opus 4.6</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9594">vitest-dev/vitest#9594</a> <a href="https://github.com/vitest-dev/vitest/commit/eeb0ae2f8"><!-- raw HTML omitted -->(eeb0a)<!-- raw HTML omitted --></a></li> <li>Store failure screenshots using artifacts API - by <a href="https://github.com/macarie"><code>@macarie</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9588">vitest-dev/vitest#9588</a> <a href="https://github.com/vitest-dev/vitest/commit/24603e3c4"><!-- raw HTML omitted -->(24603)<!-- raw HTML omitted --></a></li> <li>Allow <code>vitest list</code> to statically collect tests instead of running files to collect them - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9630">vitest-dev/vitest#9630</a> <a href="https://github.com/vitest-dev/vitest/commit/7a8e7fc20"><!-- raw HTML omitted -->(7a8e7)<!-- raw HTML omitted --></a></li> <li>Add <code>--detect-async-leaks</code> - by <a href="https://github.com/AriPerkkio"><code>@AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9528">vitest-dev/vitest#9528</a> <a href="https://github.com/vitest-dev/vitest/commit/c594d4af3"><!-- raw HTML omitted -->(c594d)<!-- raw HTML omitted --></a></li> <li>Implement <code>mockThrow</code> and <code>mockThrowOnce</code> - by <a href="https://github.com/thor-juhasz"><code>@thor-juhasz</code></a> and <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9512">vitest-dev/vitest#9512</a> <a href="https://github.com/vitest-dev/vitest/commit/619179fb7"><!-- raw HTML omitted -->(61917)<!-- raw HTML omitted --></a></li> <li>Support <code>update: "none"</code> and add docs about snapshots behavior on CI - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9700">vitest-dev/vitest#9700</a> <a href="https://github.com/vitest-dev/vitest/commit/05f1854e2"><!-- raw HTML omitted -->(05f18)<!-- raw HTML omitted --></a></li> <li>Support playwright <code>launchOptions</code> with <code>connectOptions</code> - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9702">vitest-dev/vitest#9702</a> <a href="https://github.com/vitest-dev/vitest/commit/f0ff1b2a0"><!-- raw HTML omitted -->(f0ff1)<!-- raw HTML omitted --></a></li> <li>Add <code>page/locator.mark</code> API to enhance playwright trace - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9652">vitest-dev/vitest#9652</a> <a href="https://github.com/vitest-dev/vitest/commit/d0ee546fe"><!-- raw HTML omitted -->(d0ee5)<!-- raw HTML omitted --></a></li> <li><strong>api</strong>: <ul> <li>Support tests starting or ending with <code>test</code> in <code>experimental_parseSpecification</code> - by <a href="https://github.com/jgillick"><code>@jgillick</code></a> and <strong>Jeremy Gillick</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9235">vitest-dev/vitest#9235</a> <a href="https://github.com/vitest-dev/vitest/commit/2f367fad3"><!-- raw HTML omitted -->(2f367)<!-- raw HTML omitted --></a></li> <li>Add filters to <code>createSpecification</code> - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9336">vitest-dev/vitest#9336</a> <a href="https://github.com/vitest-dev/vitest/commit/c8e6c7fbf"><!-- raw HTML omitted -->(c8e6c)<!-- raw HTML omitted --></a></li> <li>Expose <code>runTestFiles</code> as alternative to <code>runTestSpecifications</code> - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9443">vitest-dev/vitest#9443</a> <a href="https://github.com/vitest-dev/vitest/commit/43d761821"><!-- raw HTML omitted -->(43d76)<!-- raw HTML omitted --></a></li> <li>Add <code>allowWrite</code> and <code>allowExec</code> options to <code>api</code> - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9350">vitest-dev/vitest#9350</a> <a href="https://github.com/vitest-dev/vitest/commit/20e00ef78"><!-- raw HTML omitted -->(20e00)<!-- raw HTML omitted --></a></li> <li>Allow passing down test cases to <code>toTestSpecification</code> - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9627">vitest-dev/vitest#9627</a> <a href="https://github.com/vitest-dev/vitest/commit/6f17d5ddf"><!-- raw HTML omitted -->(6f17d)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>browser</strong>: <ul> <li>Add <code>userEvent.wheel</code> API - by <a href="https://github.com/macarie"><code>@macarie</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9188">vitest-dev/vitest#9188</a> <a href="https://github.com/vitest-dev/vitest/commit/660801979"><!-- raw HTML omitted -->(66080)<!-- raw HTML omitted --></a></li> <li>Add <code>filterNode</code> option to prettyDOM for filtering browser assertion error output - by <a href="https://github.com/Copilot"><code>@Copilot</code></a>, <strong>sheremet-va</strong> and <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9475">vitest-dev/vitest#9475</a> <a href="https://github.com/vitest-dev/vitest/commit/d3220fcd8"><!-- raw HTML omitted -->(d3220)<!-- raw HTML omitted --></a></li> <li>Support playwright persistent context - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a>, <strong>Claude Opus 4.6</strong> and <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9229">vitest-dev/vitest#9229</a> <a href="https://github.com/vitest-dev/vitest/commit/f865d2ba4"><!-- raw HTML omitted -->(f865d)<!-- raw HTML omitted --></a></li> <li>Added <code>detailsPanelPosition</code> option and button - by <a href="https://github.com/shairez"><code>@shairez</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9525">vitest-dev/vitest#9525</a> <a href="https://github.com/vitest-dev/vitest/commit/c8a31147c"><!-- raw HTML omitted -->(c8a31)<!-- raw HTML omitted --></a></li> <li>Use BlazeDiff instead of pixelmatch - by <a href="https://github.com/macarie"><code>@macarie</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9514">vitest-dev/vitest#9514</a> <a href="https://github.com/vitest-dev/vitest/commit/309362089"><!-- raw HTML omitted -->(30936)<!-- raw HTML omitted --></a></li> <li>Add <code>findElement</code> and enable strict mode in webdriverio and preview - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9677">vitest-dev/vitest#9677</a> <a href="https://github.com/vitest-dev/vitest/commit/c3f37721c"><!-- raw HTML omitted -->(c3f37)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>cli</strong>: <ul> <li>Add <a href="https://github.com/bomb"><code>@bomb</code></a>.sh/tab completions - by <a href="https://github.com/AmirSa12"><code>@AmirSa12</code></a> and <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/8639">vitest-dev/vitest#8639</a> <a href="https://github.com/vitest-dev/vitest/commit/200f31704"><!-- raw HTML omitted -->(200f3)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>coverage</strong>: <ul> <li>Support <code>ignore start/stop</code> ignore hints - by <a href="https://github.com/AriPerkkio"><code>@AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9204">vitest-dev/vitest#9204</a> <a href="https://github.com/vitest-dev/vitest/commit/e59c94ba6"><!-- raw HTML omitted -->(e59c9)<!-- raw HTML omitted --></a></li> <li>Add <code>coverage.changed</code> option to report only changed files - by <a href="https://github.com/kykim00"><code>@kykim00</code></a> and <a href="https://github.com/AriPerkkio"><code>@AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9521">vitest-dev/vitest#9521</a> <a href="https://github.com/vitest-dev/vitest/commit/1d9392c67"><!-- raw HTML omitted -->(1d939)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>experimental</strong>: <ul> <li>Add <code>onModuleRunner</code> hook to <code>worker.init</code> - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9286">vitest-dev/vitest#9286</a> <a href="https://github.com/vitest-dev/vitest/commit/e977f3deb"><!-- raw HTML omitted -->(e977f)<!-- raw HTML omitted --></a></li> <li>Option to disable the module runner - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> and <a href="https://github.com/AriPerkkio"><code>@AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9210">vitest-dev/vitest#9210</a> <a href="https://github.com/vitest-dev/vitest/commit/9be6121ee"><!-- raw HTML omitted -->(9be61)<!-- raw HTML omitted --></a></li> </ul> </li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/vitest-dev/vitest/commit/4150b913171bda3971a4a4c47c633c26d0c6ae45"><code>4150b91</code></a> chore: release v4.1.0</li> <li><a href="https://github.com/vitest-dev/vitest/commit/1de0aa22dd6311a93546a75a3c58a6be519c1baf"><code>1de0aa2</code></a> fix: correctly identify concurrent test during static analysis (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/9846">#9846</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/c3cac1c1b5a91d921942e9391fbd94841717363f"><code>c3cac1c</code></a> fix: use isAgent check, not just TTY, for watch mode (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/9841">#9841</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/eab68ba2b8ea6f89717c0b885c573579659d7c3b"><code>eab68ba</code></a> chore(deps): update all non-major dependencies (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/9824">#9824</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/031f02a89be34491c441b4da9c4e2bacb7db71df"><code>031f02a</code></a> fix: allow catch/finally for async assertion (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/9827">#9827</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/3e9e096a231fa0ec6475da82e36cbd6fcc9bc8f9"><code>3e9e096</code></a> feat(reporters): add <code>agent</code> reporter to reduce ai agent token usage (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/9779">#9779</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/0c2c01361a95dd26d0d7fd7bc38bcca8dbc6e5d2"><code>0c2c013</code></a> chore: release v4.1.0-beta.6</li> <li><a href="https://github.com/vitest-dev/vitest/commit/8181e06e765f4d043818b244c76795022fa78ff6"><code>8181e06</code></a> fix: <code>hideSkippedTests</code> should not hide <code>test.todo</code> (fix <a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/9562">#9562</a>) (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/9781">#9781</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/a8216b0014b83612e40ef49f919d5293b68717b3"><code>a8216b0</code></a> fix: manual and redirect mock shouldn't <code>load</code> or <code>transform</code> original module...</li> <li><a href="https://github.com/vitest-dev/vitest/commit/689a22a1b8c79595f6f4ae82d2b43c895d7f1c50"><code>689a22a</code></a> fix(browser): types of <code>getCDPSession</code> and <code>cdp()</code> (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/9716">#9716</a>)</li> <li>Additional commits viewable in <a href="https://github.com/vitest-dev/vitest/commits/v4.1.0/packages/vitest">compare view</a></li> </ul> </details> <details> <summary>Maintainer changes</summary> <p>This version was pushed to npm by <a href="https://www.npmjs.com/~GitHub%20Actions">GitHub Actions</a>, a new releaser for vitest since your current version.</p> </details> <br /> Updates `vitest` from 0.34.3 to 4.1.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/vitest-dev/vitest/releases">vitest's releases</a>.</em></p> <blockquote> <h2>v4.1.0</h2> <p>Vitest 4.1 is out!</p> <p>This release page lists all changes made to the project during the 4.1 beta. To get a review of all the new features, read our <a href="https://vitest.dev/blog/vitest-4-1">blog post</a>.</p> <h3> 🚀 Features</h3> <ul> <li>Return a disposable from doMock() - by <a href="https://github.com/kirkwaiblinger"><code>@kirkwaiblinger</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9332">vitest-dev/vitest#9332</a> <a href="https://github.com/vitest-dev/vitest/commit/e3e659a96"><!-- raw HTML omitted -->(e3e65)<!-- raw HTML omitted --></a></li> <li>Added chai style assertions - by <a href="https://github.com/ronnakamoto"><code>@ronnakamoto</code></a> and <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/8842">vitest-dev/vitest#8842</a> <a href="https://github.com/vitest-dev/vitest/commit/841df9ac5"><!-- raw HTML omitted -->(841df)<!-- raw HTML omitted --></a></li> <li>Update to sinon/fake-timers v15 and add <code>setTickMode</code> to timer controls - by <a href="https://github.com/atscott"><code>@atscott</code></a> and <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/8726">vitest-dev/vitest#8726</a> <a href="https://github.com/vitest-dev/vitest/commit/4b480aaed"><!-- raw HTML omitted -->(4b480)<!-- raw HTML omitted --></a></li> <li>Expose matcher types - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9448">vitest-dev/vitest#9448</a> <a href="https://github.com/vitest-dev/vitest/commit/3e4b913b1"><!-- raw HTML omitted -->(3e4b9)<!-- raw HTML omitted --></a></li> <li>Add <code>toTestSpecification</code> to reported tasks - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9464">vitest-dev/vitest#9464</a> <a href="https://github.com/vitest-dev/vitest/commit/1a4705da9"><!-- raw HTML omitted -->(1a470)<!-- raw HTML omitted --></a></li> <li>Show a warning if <code>vi.mock</code> or <code>vi.hoisted</code> are declared outside of top level of the module - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9387">vitest-dev/vitest#9387</a> <a href="https://github.com/vitest-dev/vitest/commit/5db54a468"><!-- raw HTML omitted -->(5db54)<!-- raw HTML omitted --></a></li> <li>Track and display expectedly failed tests (.fails) in UI and CLI - by <a href="https://github.com/Copilot"><code>@Copilot</code></a>, <strong>sheremet-va</strong> and <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9476">vitest-dev/vitest#9476</a> <a href="https://github.com/vitest-dev/vitest/commit/77d75fd34"><!-- raw HTML omitted -->(77d75)<!-- raw HTML omitted --></a></li> <li>Support tags - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9478">vitest-dev/vitest#9478</a> <a href="https://github.com/vitest-dev/vitest/commit/de7c8a521"><!-- raw HTML omitted -->(de7c8)<!-- raw HTML omitted --></a></li> <li>Implement <code>aroundEach</code> and <code>aroundAll</code> hooks - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9450">vitest-dev/vitest#9450</a> <a href="https://github.com/vitest-dev/vitest/commit/2a8cb9dc2"><!-- raw HTML omitted -->(2a8cb)<!-- raw HTML omitted --></a></li> <li>Stabilize experimental features - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9529">vitest-dev/vitest#9529</a> <a href="https://github.com/vitest-dev/vitest/commit/b5fd2a16a"><!-- raw HTML omitted -->(b5fd2)<!-- raw HTML omitted --></a></li> <li>Accept <code>new</code> or <code>all</code> in <code>--update</code> flag - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9543">vitest-dev/vitest#9543</a> <a href="https://github.com/vitest-dev/vitest/commit/a5acf28a5"><!-- raw HTML omitted -->(a5acf)<!-- raw HTML omitted --></a></li> <li>Support <code>meta</code> in test options - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9535">vitest-dev/vitest#9535</a> <a href="https://github.com/vitest-dev/vitest/commit/7d622e3d1"><!-- raw HTML omitted -->(7d622)<!-- raw HTML omitted --></a></li> <li>Support type inference with a new <code>test.extend</code> syntax - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9550">vitest-dev/vitest#9550</a> <a href="https://github.com/vitest-dev/vitest/commit/e53854fcc"><!-- raw HTML omitted -->(e5385)<!-- raw HTML omitted --></a></li> <li>Support vite 8 beta, fix type issues in the config with different vite versions - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9587">vitest-dev/vitest#9587</a> <a href="https://github.com/vitest-dev/vitest/commit/990281dfd"><!-- raw HTML omitted -->(99028)<!-- raw HTML omitted --></a></li> <li>Add assertion helper to hide internal stack traces - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a> and <strong>Claude Opus 4.6</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9594">vitest-dev/vitest#9594</a> <a href="https://github.com/vitest-dev/vitest/commit/eeb0ae2f8"><!-- raw HTML omitted -->(eeb0a)<!-- raw HTML omitted --></a></li> <li>Store failure screenshots using artifacts API - by <a href="https://github.com/macarie"><code>@macarie</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9588">vitest-dev/vitest#9588</a> <a href="https://github.com/vitest-dev/vitest/commit/24603e3c4"><!-- raw HTML omitted -->(24603)<!-- raw HTML omitted --></a></li> <li>Allow <code>vitest list</code> to statically collect tests instead of running files to collect them - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9630">vitest-dev/vitest#9630</a> <a href="https://github.com/vitest-dev/vitest/commit/7a8e7fc20"><!-- raw HTML omitted -->(7a8e7)<!-- raw HTML omitted --></a></li> <li>Add <code>--detect-async-leaks</code> - by <a href="https://github.com/AriPerkkio"><code>@AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9528">vitest-dev/vitest#9528</a> <a href="https://github.com/vitest-dev/vitest/commit/c594d4af3"><!-- raw HTML omitted -->(c594d)<!-- raw HTML omitted --></a></li> <li>Implement <code>mockThrow</code> and <code>mockThrowOnce</code> - by <a href="https://github.com/thor-juhasz"><code>@thor-juhasz</code></a> and <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9512">vitest-dev/vitest#9512</a> <a href="https://github.com/vitest-dev/vitest/commit/619179fb7"><!-- raw HTML omitted -->(61917)<!-- raw HTML omitted --></a></li> <li>Support <code>update: "none"</code> and add docs about snapshots behavior on CI - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9700">vitest-dev/vitest#9700</a> <a href="https://github.com/vitest-dev/vitest/commit/05f1854e2"><!-- raw HTML omitted -->(05f18)<!-- raw HTML omitted --></a></li> <li>Support playwright <code>launchOptions</code> with <code>connectOptions</code> - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9702">vitest-dev/vitest#9702</a> <a href="https://github.com/vitest-dev/vitest/commit/f0ff1b2a0"><!-- raw HTML omitted -->(f0ff1)<!-- raw HTML omitted --></a></li> <li>Add <code>page/locator.mark</code> API to enhance playwright trace - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9652">vitest-dev/vitest#9652</a> <a href="https://github.com/vitest-dev/vitest/commit/d0ee546fe"><!-- raw HTML omitted -->(d0ee5)<!-- raw HTML omitted --></a></li> <li><strong>api</strong>: <ul> <li>Support tests starting or ending with <code>test</code> in <code>experimental_parseSpecification</code> - by <a href="https://github.com/jgillick"><code>@jgillick</code></a> and <strong>Jeremy Gillick</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9235">vitest-dev/vitest#9235</a> <a href="https://github.com/vitest-dev/vitest/commit/2f367fad3"><!-- raw HTML omitted -->(2f367)<!-- raw HTML omitted --></a></li> <li>Add filters to <code>createSpecification</code> - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9336">vitest-dev/vitest#9336</a> <a href="https://github.com/vitest-dev/vitest/commit/c8e6c7fbf"><!-- raw HTML omitted -->(c8e6c)<!-- raw HTML omitted --></a></li> <li>Expose <code>runTestFiles</code> as alternative to <code>runTestSpecifications</code> - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9443">vitest-dev/vitest#9443</a> <a href="https://github.com/vitest-dev/vitest/commit/43d761821"><!-- raw HTML omitted -->(43d76)<!-- raw HTML omitted --></a></li> <li>Add <code>allowWrite</code> and <code>allowExec</code> options to <code>api</code> - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9350">vitest-dev/vitest#9350</a> <a href="https://github.com/vitest-dev/vitest/commit/20e00ef78"><!-- raw HTML omitted -->(20e00)<!-- raw HTML omitted --></a></li> <li>Allow passing down test cases to <code>toTestSpecification</code> - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9627">vitest-dev/vitest#9627</a> <a href="https://github.com/vitest-dev/vitest/commit/6f17d5ddf"><!-- raw HTML omitted -->(6f17d)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>browser</strong>: <ul> <li>Add <code>userEvent.wheel</code> API - by <a href="https://github.com/macarie"><code>@macarie</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9188">vitest-dev/vitest#9188</a> <a href="https://github.com/vitest-dev/vitest/commit/660801979"><!-- raw HTML omitted -->(66080)<!-- raw HTML omitted --></a></li> <li>Add <code>filterNode</code> option to prettyDOM for filtering browser assertion error output - by <a href="https://github.com/Copilot"><code>@Copilot</code></a>, <strong>sheremet-va</strong> and <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9475">vitest-dev/vitest#9475</a> <a href="https://github.com/vitest-dev/vitest/commit/d3220fcd8"><!-- raw HTML omitted -->(d3220)<!-- raw HTML omitted --></a></li> <li>Support playwright persistent context - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a>, <strong>Claude Opus 4.6</strong> and <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9229">vitest-dev/vitest#9229</a> <a href="https://github.com/vitest-dev/vitest/commit/f865d2ba4"><!-- raw HTML omitted -->(f865d)<!-- raw HTML omitted --></a></li> <li>Added <code>detailsPanelPosition</code> option and button - by <a href="https://github.com/shairez"><code>@shairez</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9525">vitest-dev/vitest#9525</a> <a href="https://github.com/vitest-dev/vitest/commit/c8a31147c"><!-- raw HTML omitted -->(c8a31)<!-- raw HTML omitted --></a></li> <li>Use BlazeDiff instead of pixelmatch - by <a href="https://github.com/macarie"><code>@macarie</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9514">vitest-dev/vitest#9514</a> <a href="https://github.com/vitest-dev/vitest/commit/309362089"><!-- raw HTML omitted -->(30936)<!-- raw HTML omitted --></a></li> <li>Add <code>findElement</code> and enable strict mode in webdriverio and preview - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9677">vitest-dev/vitest#9677</a> <a href="https://github.com/vitest-dev/vitest/commit/c3f37721c"><!-- raw HTML omitted -->(c3f37)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>cli</strong>: <ul> <li>Add <a href="https://github.com/bomb"><code>@bomb</code></a>.sh/tab completions - by <a href="https://github.com/AmirSa12"><code>@AmirSa12</code></a> and <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/8639">vitest-dev/vitest#8639</a> <a href="https://github.com/vitest-dev/vitest/commit/200f31704"><!-- raw HTML omitted -->(200f3)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>coverage</strong>: <ul> <li>Support <code>ignore start/stop</code> ignore hints - by <a href="https://github.com/AriPerkkio"><code>@AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9204">vitest-dev/vitest#9204</a> <a href="https://github.com/vitest-dev/vitest/commit/e59c94ba6"><!-- raw HTML omitted -->(e59c9)<!-- raw HTML omitted --></a></li> <li>Add <code>coverage.changed</code> option to report only changed files - by <a href="https://github.com/kykim00"><code>@kykim00</code></a> and <a href="https://github.com/AriPerkkio"><code>@AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9521">vitest-dev/vitest#9521</a> <a href="https://github.com/vitest-dev/vitest/commit/1d9392c67"><!-- raw HTML omitted -->(1d939)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>experimental</strong>: <ul> <li>Add <code>onModuleRunner</code> hook to <code>worker.init</code> - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9286">vitest-dev/vitest#9286</a> <a href="https://github.com/vitest-dev/vitest/commit/e977f3deb"><!-- raw HTML omitted -->(e977f)<!-- raw HTML omitted --></a></li> <li>Option to disable the module runner - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> and <a href="https://github.com/AriPerkkio"><code>@AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9210">vitest-dev/vitest#9210</a> <a href="https://github.com/vitest-dev/vitest/commit/9be6121ee"><!-- raw HTML omitted -->(9be61)<!-- raw HTML omitted --></a></li> </ul> </li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/vitest-dev/vitest/commit/4150b913171bda3971a4a4c47c633c26d0c6ae45"><code>4150b91</code></a> chore: release v4.1.0</li> <li><a href="https://github.com/vitest-dev/vitest/commit/1de0aa22dd6311a93546a75a3c58a6be519c1baf"><code>1de0aa2</code></a> fix: correctly identify concurrent test during static analysis (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/9846">#9846</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/c3cac1c1b5a91d921942e9391fbd94841717363f"><code>c3cac1c</code></a> fix: use isAgent check, not just TTY, for watch mode (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/9841">#9841</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/eab68ba2b8ea6f89717c0b885c573579659d7c3b"><code>eab68ba</code></a> chore(deps): update all non-major dependencies (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/9824">#9824</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/031f02a89be34491c441b4da9c4e2bacb7db71df"><code>031f02a</code></a> fix: allow catch/finally for async assertion (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/9827">#9827</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/3e9e096a231fa0ec6475da82e36cbd6fcc9bc8f9"><code>3e9e096</code></a> feat(reporters): add <code>agent</code> reporter to reduce ai agent token usage (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/9779">#9779</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/0c2c01361a95dd26d0d7fd7bc38bcca8dbc6e5d2"><code>0c2c013</code></a> chore: release v4.1.0-beta.6</li> <li><a href="https://github.com/vitest-dev/vitest/commit/8181e06e765f4d043818b244c76795022fa78ff6"><code>8181e06</code></a> fix: <code>hideSkippedTests</code> should not hide <code>test.todo</code> (fix <a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/9562">#9562</a>) (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/9781">#9781</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/a8216b0014b83612e40ef49f919d5293b68717b3"><code>a8216b0</code></a> fix: manual and redirect mock shouldn't <code>load</code> or <code>transform</code> original module...</li> <li><a href="https://github.com/vitest-dev/vitest/commit/689a22a1b8c79595f6f4ae82d2b43c895d7f1c50"><code>689a22a</code></a> fix(browser): types of <code>getCDPSession</code> and <code>cdp()</code> (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/9716">#9716</a>)</li> <li>Additional commits viewable in <a href="https://github.com/vitest-dev/vitest/commits/v4.1.0/packages/vitest">compare view</a></li> </ul> </details> <details> <summary>Maintainer changes</summary> <p>This version was pushed to npm by <a href="https://www.npmjs.com/~GitHub%20Actions">GitHub Actions</a>, a new releaser for vitest since your current version.</p> </details> <br /> Updates `vitest` from 0.34.3 to 4.1.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/vitest-dev/vitest/releases">vitest's releases</a>.</em></p> <blockquote> <h2>v4.1.0</h2> <p>Vitest 4.1 is out!</p> <p>This release page lists all changes made to the project during the 4.1 beta. To get a review of all the new features, read our <a href="https://vitest.dev/blog/vitest-4-1">blog post</a>.</p> <h3> 🚀 Features</h3> <ul> <li>Return a disposable from doMock() - by <a href="https://github.com/kirkwaiblinger"><code>@kirkwaiblinger</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9332">vitest-dev/vitest#9332</a> <a href="https://github.com/vitest-dev/vitest/commit/e3e659a96"><!-- raw HTML omitted -->(e3e65)<!-- raw HTML omitted --></a></li> <li>Added chai style assertions - by <a href="https://github.com/ronnakamoto"><code>@ronnakamoto</code></a> and <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/8842">vitest-dev/vitest#8842</a> <a href="https://github.com/vitest-dev/vitest/commit/841df9ac5"><!-- raw HTML omitted -->(841df)<!-- raw HTML omitted --></a></li> <li>Update to sinon/fake-timers v15 and add <code>setTickMode</code> to timer controls - by <a href="https://github.com/atscott"><code>@atscott</code></a> and <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/8726">vitest-dev/vitest#8726</a> <a href="https://github.com/vitest-dev/vitest/commit/4b480aaed"><!-- raw HTML omitted -->(4b480)<!-- raw HTML omitted --></a></li> <li>Expose matcher types - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9448">vitest-dev/vitest#9448</a> <a href="https://github.com/vitest-dev/vitest/commit/3e4b913b1"><!-- raw HTML omitted -->(3e4b9)<!-- raw HTML omitted --></a></li> <li>Add <code>toTestSpecification</code> to reported tasks - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9464">vitest-dev/vitest#9464</a> <a href="https://github.com/vitest-dev/vitest/commit/1a4705da9"><!-- raw HTML omitted -->(1a470)<!-- raw HTML omitted --></a></li> <li>Show a warning if <code>vi.mock</code> or <code>vi.hoisted</code> are declared outside of top level of the module - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9387">vitest-dev/vitest#9387</a> <a href="https://github.com/vitest-dev/vitest/commit/5db54a468"><!-- raw HTML omitted -->(5db54)<!-- raw HTML omitted --></a></li> <li>Track and display expectedly failed tests (.fails) in UI and CLI - by <a href="https://github.com/Copilot"><code>@Copilot</code></a>, <strong>sheremet-va</strong> and <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9476">vitest-dev/vitest#9476</a> <a href="https://github.com/vitest-dev/vitest/commit/77d75fd34"><!-- raw HTML omitted -->(77d75)<!-- raw HTML omitted --></a></li> <li>Support tags - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9478">vitest-dev/vitest#9478</a> <a href="https://github.com/vitest-dev/vitest/commit/de7c8a521"><!-- raw HTML omitted -->(de7c8)<!-- raw HTML omitted --></a></li> <li>Implement <code>aroundEach</code> and <code>aroundAll</code> hooks - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9450">vitest-dev/vitest#9450</a> <a href="https://github.com/vitest-dev/vitest/commit/2a8cb9dc2"><!-- raw HTML omitted -->(2a8cb)<!-- raw HTML omitted --></a></li> <li>Stabilize experimental features - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9529">vitest-dev/vitest#9529</a> <a href="https://github.com/vitest-dev/vitest/commit/b5fd2a16a"><!-- raw HTML omitted -->(b5fd2)<!-- raw HTML omitted --></a></li> <li>Accept <code>new</code> or <code>all</code> in <code>--update</code> flag - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9543">vitest-dev/vitest#9543</a> <a href="https://github.com/vitest-dev/vitest/commit/a5acf28a5"><!-- raw HTML omitted -->(a5acf)<!-- raw HTML omitted --></a></li> <li>Support <code>meta</code> in test options - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9535">vitest-dev/vitest#9535</a> <a href="https://github.com/vitest-dev/vitest/commit/7d622e3d1"><!-- raw HTML omitted -->(7d622)<!-- raw HTML omitted --></a></li> <li>Support type inference with a new <code>test.extend</code> syntax - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9550">vitest-dev/vitest#9550</a> <a href="https://github.com/vitest-dev/vitest/commit/e53854fcc"><!-- raw HTML omitted -->(e5385)<!-- raw HTML omitted --></a></li> <li>Support vite 8 beta, fix type issues in the config with different vite versions - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9587">vitest-dev/vitest#9587</a> <a href="https://github.com/vitest-dev/vitest/commit/990281dfd"><!-- raw HTML omitted -->(99028)<!-- raw HTML omitted --></a></li> <li>Add assertion helper to hide internal stack traces - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a> and <strong>Claude Opus 4.6</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9594">vitest-dev/vitest#9594</a> <a href="https://github.com/vitest-dev/vitest/commit/eeb0ae2f8"><!-- raw HTML omitted -->(eeb0a)<!-- raw HTML omitted --></a></li> <li>Store failure screenshots using artifacts API - by <a href="https://github.com/macarie"><code>@macarie</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9588">vitest-dev/vitest#9588</a> <a href="https://github.com/vitest-dev/vitest/commit/24603e3c4"><!-- raw HTML omitted -->(24603)... _Description has been truncated_ --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: John Kennedy <jkennedyvz@users.noreply.github.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
133d0bd52e |
chore: version packages (#2501)
This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated. # Releases ## @langchain/langgraph-sdk@1.9.18 ### Patch Changes - [#2500](https://github.com/langchain-ai/langgraphjs/pull/2500) [`f67772f`](https://github.com/langchain-ai/langgraphjs/commit/f67772ff3f7ac13d81576d395d7529de4eb4390b) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(sdk): resume useChannel subscriptions across serial runs Enable `resumeOnPause` on the channel projection so `useChannel` keeps accumulating events across prompts on the same thread. Clarify selector docs and JSDoc: `useChannel` for the full event stream, `useExtension` for the latest payload. ## @langchain/angular@1.0.18 ### Patch Changes - [#2500](https://github.com/langchain-ai/langgraphjs/pull/2500) [`f67772f`](https://github.com/langchain-ai/langgraphjs/commit/f67772ff3f7ac13d81576d395d7529de4eb4390b) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(sdk): resume useChannel subscriptions across serial runs Enable `resumeOnPause` on the channel projection so `useChannel` keeps accumulating events across prompts on the same thread. Clarify selector docs and JSDoc: `useChannel` for the full event stream, `useExtension` for the latest payload. - Updated dependencies \[[`f67772f`](https://github.com/langchain-ai/langgraphjs/commit/f67772ff3f7ac13d81576d395d7529de4eb4390b)]: - @langchain/langgraph-sdk@1.9.18 ## @langchain/react@1.0.18 ### Patch Changes - [#2500](https://github.com/langchain-ai/langgraphjs/pull/2500) [`f67772f`](https://github.com/langchain-ai/langgraphjs/commit/f67772ff3f7ac13d81576d395d7529de4eb4390b) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(sdk): resume useChannel subscriptions across serial runs Enable `resumeOnPause` on the channel projection so `useChannel` keeps accumulating events across prompts on the same thread. Clarify selector docs and JSDoc: `useChannel` for the full event stream, `useExtension` for the latest payload. - Updated dependencies \[[`f67772f`](https://github.com/langchain-ai/langgraphjs/commit/f67772ff3f7ac13d81576d395d7529de4eb4390b)]: - @langchain/langgraph-sdk@1.9.18 ## @langchain/svelte@1.0.18 ### Patch Changes - [#2500](https://github.com/langchain-ai/langgraphjs/pull/2500) [`f67772f`](https://github.com/langchain-ai/langgraphjs/commit/f67772ff3f7ac13d81576d395d7529de4eb4390b) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(sdk): resume useChannel subscriptions across serial runs Enable `resumeOnPause` on the channel projection so `useChannel` keeps accumulating events across prompts on the same thread. Clarify selector docs and JSDoc: `useChannel` for the full event stream, `useExtension` for the latest payload. - Updated dependencies \[[`f67772f`](https://github.com/langchain-ai/langgraphjs/commit/f67772ff3f7ac13d81576d395d7529de4eb4390b)]: - @langchain/langgraph-sdk@1.9.18 ## @langchain/vue@1.0.18 ### Patch Changes - [#2500](https://github.com/langchain-ai/langgraphjs/pull/2500) [`f67772f`](https://github.com/langchain-ai/langgraphjs/commit/f67772ff3f7ac13d81576d395d7529de4eb4390b) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(sdk): resume useChannel subscriptions across serial runs Enable `resumeOnPause` on the channel projection so `useChannel` keeps accumulating events across prompts on the same thread. Clarify selector docs and JSDoc: `useChannel` for the full event stream, `useExtension` for the latest payload. - Updated dependencies \[[`f67772f`](https://github.com/langchain-ai/langgraphjs/commit/f67772ff3f7ac13d81576d395d7529de4eb4390b)]: - @langchain/langgraph-sdk@1.9.18 ## @example/ai-elements@0.1.33 ### Patch Changes - Updated dependencies \[[`f67772f`](https://github.com/langchain-ai/langgraphjs/commit/f67772ff3f7ac13d81576d395d7529de4eb4390b)]: - @langchain/react@1.0.18 ## @examples/assistant-ui-claude@0.1.33 ### Patch Changes - Updated dependencies \[[`f67772f`](https://github.com/langchain-ai/langgraphjs/commit/f67772ff3f7ac13d81576d395d7529de4eb4390b)]: - @langchain/react@1.0.18 ## @examples/ui-angular@0.0.43 ### Patch Changes - Updated dependencies \[[`f67772f`](https://github.com/langchain-ai/langgraphjs/commit/f67772ff3f7ac13d81576d395d7529de4eb4390b)]: - @langchain/langgraph-sdk@1.9.18 - @langchain/angular@1.0.18 ## @examples/ui-multimodal@0.0.19 ### Patch Changes - Updated dependencies \[[`f67772f`](https://github.com/langchain-ai/langgraphjs/commit/f67772ff3f7ac13d81576d395d7529de4eb4390b)]: - @langchain/react@1.0.18 ## @examples/ui-react@0.0.19 ### Patch Changes - Updated dependencies \[[`f67772f`](https://github.com/langchain-ai/langgraphjs/commit/f67772ff3f7ac13d81576d395d7529de4eb4390b)]: - @langchain/langgraph-sdk@1.9.18 - @langchain/react@1.0.18 Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>@langchain/angular@1.0.18 @langchain/langgraph-sdk@1.9.18 @langchain/react@1.0.18 @langchain/svelte@1.0.18 @langchain/vue@1.0.18 |
||
|
|
f67772ff3f |
fix(sdk): resume useChannel subscriptions across serial runs (#2500)
## Summary - Fix `channelProjection` to pass `resumeOnPause: true`, matching `extensionProjection`, so `useChannel` continues receiving events after each run's terminal lifecycle event instead of going silent after the first prompt on a thread. - Add a unit test that simulates a paused subscription resuming with a second event batch, and a React browser integration test asserting `useChannel` event count grows across two serial submits (3 → 6). - Update selector JSDoc and `selectors.md` / `selector-composables.md` across React, Vue, Svelte, and Angular to document the complementary roles: `useChannel` = full bounded event history across runs; `useExtension` = latest payload only. |
||
|
|
c418781870 |
chore: version packages (#2495)
This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated. # Releases ## @langchain/langgraph-api@1.2.5 ### Patch Changes - [`658a076`](https://github.com/langchain-ai/langgraphjs/commit/658a076d5b50af9f5b96ab99f26ed629da6e182f) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(langgraph): forward named custom stream channels consistently Forward remote `StreamChannel` emissions as `custom:<name>` protocol events and normalize them back to custom-channel payloads in the API session. This aligns JavaScript stream-channel forwarding with the protocol subscription shape used by remote clients, so `custom:<name>` subscriptions receive extension channel data consistently. - Updated dependencies \[]: - @langchain/langgraph-ui@1.2.5 ## @langchain/langgraph-cli@1.2.5 ### Patch Changes - Updated dependencies \[[`658a076`](https://github.com/langchain-ai/langgraphjs/commit/658a076d5b50af9f5b96ab99f26ed629da6e182f)]: - @langchain/langgraph-api@1.2.5 ## @langchain/langgraph@1.3.6 ### Patch Changes - [`658a076`](https://github.com/langchain-ai/langgraphjs/commit/658a076d5b50af9f5b96ab99f26ed629da6e182f) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(langgraph): forward named custom stream channels consistently Forward remote `StreamChannel` emissions as `custom:<name>` protocol events and normalize them back to custom-channel payloads in the API session. This aligns JavaScript stream-channel forwarding with the protocol subscription shape used by remote clients, so `custom:<name>` subscriptions receive extension channel data consistently. - Updated dependencies \[[`0a0e04e`](https://github.com/langchain-ai/langgraphjs/commit/0a0e04e9ff7e82fd08411cc0094e1f94729a1e1e), [`658a076`](https://github.com/langchain-ai/langgraphjs/commit/658a076d5b50af9f5b96ab99f26ed629da6e182f), [`a9aa8d6`](https://github.com/langchain-ai/langgraphjs/commit/a9aa8d6a9b23f5f7d4c56889fa68697b1e076b31)]: - @langchain/langgraph-sdk@1.9.17 ## @langchain/langgraph-sdk@1.9.17 ### Patch Changes - [#2494](https://github.com/langchain-ai/langgraphjs/pull/2494) [`0a0e04e`](https://github.com/langchain-ai/langgraphjs/commit/0a0e04e9ff7e82fd08411cc0094e1f94729a1e1e) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(sdk): revive automatic optimistic submit echo Echo `submit()` input into `values` / `messages` immediately with client-side id minting and id-based reconciliation as the server streams back. Expose per-message `optimisticStatus` via message metadata (`pending` → `sent` / `failed`), shallow-merge non-message keys with rollback when no `values` arrive, and add an `optimistic: false` hook opt-out. Plumb through React, Vue, Svelte, and Angular with browser e2e coverage. - [`658a076`](https://github.com/langchain-ai/langgraphjs/commit/658a076d5b50af9f5b96ab99f26ed629da6e182f) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(sdk): coalesce duplicate thread read requests Coalesce concurrent identical `threads.getState()` and `threads.getHistory()` reads within the SDK client so transient remounts do not issue duplicate hydrate requests. Request identity includes the prepared URL, body, method, and headers, and coalescing is skipped for caller-provided abort signals, raw response reads, and `onRequest` hooks to preserve auth and cancellation isolation. - [#2497](https://github.com/langchain-ai/langgraphjs/pull/2497) [`a9aa8d6`](https://github.com/langchain-ai/langgraphjs/commit/a9aa8d6a9b23f5f7d4c56889fa68697b1e076b31) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(sdk): reconcile subagents and subgraphs on thread reconnect Seed deep-agent subagent cards from checkpoint messages and subgraph hosts from a single bounded `getHistory` read during `hydrate()`, so parallel fan-out discovery reappears immediately on refresh instead of waiting for SSE replay. Subagent execution namespaces are promoted through the existing guarded discovery state machine (bulk at hydrate, lazily per opened card via the selector layer). The getHistory cost is O(1) in requests regardless of fan-out width. ## @langchain/angular@1.0.17 ### Patch Changes - [#2494](https://github.com/langchain-ai/langgraphjs/pull/2494) [`0a0e04e`](https://github.com/langchain-ai/langgraphjs/commit/0a0e04e9ff7e82fd08411cc0094e1f94729a1e1e) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(sdk): revive automatic optimistic submit echo Echo `submit()` input into `values` / `messages` immediately with client-side id minting and id-based reconciliation as the server streams back. Expose per-message `optimisticStatus` via message metadata (`pending` → `sent` / `failed`), shallow-merge non-message keys with rollback when no `values` arrive, and add an `optimistic: false` hook opt-out. Plumb through React, Vue, Svelte, and Angular with browser e2e coverage. - [#2497](https://github.com/langchain-ai/langgraphjs/pull/2497) [`a9aa8d6`](https://github.com/langchain-ai/langgraphjs/commit/a9aa8d6a9b23f5f7d4c56889fa68697b1e076b31) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(sdk): reconcile subagents and subgraphs on thread reconnect Seed deep-agent subagent cards from checkpoint messages and subgraph hosts from a single bounded `getHistory` read during `hydrate()`, so parallel fan-out discovery reappears immediately on refresh instead of waiting for SSE replay. Subagent execution namespaces are promoted through the existing guarded discovery state machine (bulk at hydrate, lazily per opened card via the selector layer). The getHistory cost is O(1) in requests regardless of fan-out width. - Updated dependencies \[[`0a0e04e`](https://github.com/langchain-ai/langgraphjs/commit/0a0e04e9ff7e82fd08411cc0094e1f94729a1e1e), [`658a076`](https://github.com/langchain-ai/langgraphjs/commit/658a076d5b50af9f5b96ab99f26ed629da6e182f), [`a9aa8d6`](https://github.com/langchain-ai/langgraphjs/commit/a9aa8d6a9b23f5f7d4c56889fa68697b1e076b31)]: - @langchain/langgraph-sdk@1.9.17 ## @langchain/react@1.0.17 ### Patch Changes - [#2494](https://github.com/langchain-ai/langgraphjs/pull/2494) [`0a0e04e`](https://github.com/langchain-ai/langgraphjs/commit/0a0e04e9ff7e82fd08411cc0094e1f94729a1e1e) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(sdk): revive automatic optimistic submit echo Echo `submit()` input into `values` / `messages` immediately with client-side id minting and id-based reconciliation as the server streams back. Expose per-message `optimisticStatus` via message metadata (`pending` → `sent` / `failed`), shallow-merge non-message keys with rollback when no `values` arrive, and add an `optimistic: false` hook opt-out. Plumb through React, Vue, Svelte, and Angular with browser e2e coverage. - [#2497](https://github.com/langchain-ai/langgraphjs/pull/2497) [`a9aa8d6`](https://github.com/langchain-ai/langgraphjs/commit/a9aa8d6a9b23f5f7d4c56889fa68697b1e076b31) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(sdk): reconcile subagents and subgraphs on thread reconnect Seed deep-agent subagent cards from checkpoint messages and subgraph hosts from a single bounded `getHistory` read during `hydrate()`, so parallel fan-out discovery reappears immediately on refresh instead of waiting for SSE replay. Subagent execution namespaces are promoted through the existing guarded discovery state machine (bulk at hydrate, lazily per opened card via the selector layer). The getHistory cost is O(1) in requests regardless of fan-out width. - Updated dependencies \[[`0a0e04e`](https://github.com/langchain-ai/langgraphjs/commit/0a0e04e9ff7e82fd08411cc0094e1f94729a1e1e), [`658a076`](https://github.com/langchain-ai/langgraphjs/commit/658a076d5b50af9f5b96ab99f26ed629da6e182f), [`a9aa8d6`](https://github.com/langchain-ai/langgraphjs/commit/a9aa8d6a9b23f5f7d4c56889fa68697b1e076b31)]: - @langchain/langgraph-sdk@1.9.17 ## @langchain/svelte@1.0.17 ### Patch Changes - [#2494](https://github.com/langchain-ai/langgraphjs/pull/2494) [`0a0e04e`](https://github.com/langchain-ai/langgraphjs/commit/0a0e04e9ff7e82fd08411cc0094e1f94729a1e1e) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(sdk): revive automatic optimistic submit echo Echo `submit()` input into `values` / `messages` immediately with client-side id minting and id-based reconciliation as the server streams back. Expose per-message `optimisticStatus` via message metadata (`pending` → `sent` / `failed`), shallow-merge non-message keys with rollback when no `values` arrive, and add an `optimistic: false` hook opt-out. Plumb through React, Vue, Svelte, and Angular with browser e2e coverage. - [#2497](https://github.com/langchain-ai/langgraphjs/pull/2497) [`a9aa8d6`](https://github.com/langchain-ai/langgraphjs/commit/a9aa8d6a9b23f5f7d4c56889fa68697b1e076b31) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(sdk): reconcile subagents and subgraphs on thread reconnect Seed deep-agent subagent cards from checkpoint messages and subgraph hosts from a single bounded `getHistory` read during `hydrate()`, so parallel fan-out discovery reappears immediately on refresh instead of waiting for SSE replay. Subagent execution namespaces are promoted through the existing guarded discovery state machine (bulk at hydrate, lazily per opened card via the selector layer). The getHistory cost is O(1) in requests regardless of fan-out width. - Updated dependencies \[[`0a0e04e`](https://github.com/langchain-ai/langgraphjs/commit/0a0e04e9ff7e82fd08411cc0094e1f94729a1e1e), [`658a076`](https://github.com/langchain-ai/langgraphjs/commit/658a076d5b50af9f5b96ab99f26ed629da6e182f), [`a9aa8d6`](https://github.com/langchain-ai/langgraphjs/commit/a9aa8d6a9b23f5f7d4c56889fa68697b1e076b31)]: - @langchain/langgraph-sdk@1.9.17 ## @langchain/vue@1.0.17 ### Patch Changes - [#2494](https://github.com/langchain-ai/langgraphjs/pull/2494) [`0a0e04e`](https://github.com/langchain-ai/langgraphjs/commit/0a0e04e9ff7e82fd08411cc0094e1f94729a1e1e) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(sdk): revive automatic optimistic submit echo Echo `submit()` input into `values` / `messages` immediately with client-side id minting and id-based reconciliation as the server streams back. Expose per-message `optimisticStatus` via message metadata (`pending` → `sent` / `failed`), shallow-merge non-message keys with rollback when no `values` arrive, and add an `optimistic: false` hook opt-out. Plumb through React, Vue, Svelte, and Angular with browser e2e coverage. - [#2497](https://github.com/langchain-ai/langgraphjs/pull/2497) [`a9aa8d6`](https://github.com/langchain-ai/langgraphjs/commit/a9aa8d6a9b23f5f7d4c56889fa68697b1e076b31) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(sdk): reconcile subagents and subgraphs on thread reconnect Seed deep-agent subagent cards from checkpoint messages and subgraph hosts from a single bounded `getHistory` read during `hydrate()`, so parallel fan-out discovery reappears immediately on refresh instead of waiting for SSE replay. Subagent execution namespaces are promoted through the existing guarded discovery state machine (bulk at hydrate, lazily per opened card via the selector layer). The getHistory cost is O(1) in requests regardless of fan-out width. - Updated dependencies \[[`0a0e04e`](https://github.com/langchain-ai/langgraphjs/commit/0a0e04e9ff7e82fd08411cc0094e1f94729a1e1e), [`658a076`](https://github.com/langchain-ai/langgraphjs/commit/658a076d5b50af9f5b96ab99f26ed629da6e182f), [`a9aa8d6`](https://github.com/langchain-ai/langgraphjs/commit/a9aa8d6a9b23f5f7d4c56889fa68697b1e076b31)]: - @langchain/langgraph-sdk@1.9.17 ## @langchain/langgraph-ui@1.2.5 ## @example/ai-elements@0.1.32 ### Patch Changes - Updated dependencies \[[`658a076`](https://github.com/langchain-ai/langgraphjs/commit/658a076d5b50af9f5b96ab99f26ed629da6e182f), [`0a0e04e`](https://github.com/langchain-ai/langgraphjs/commit/0a0e04e9ff7e82fd08411cc0094e1f94729a1e1e), [`a9aa8d6`](https://github.com/langchain-ai/langgraphjs/commit/a9aa8d6a9b23f5f7d4c56889fa68697b1e076b31)]: - @langchain/langgraph@1.3.6 - @langchain/react@1.0.17 ## @examples/assistant-ui-claude@0.1.32 ### Patch Changes - Updated dependencies \[[`658a076`](https://github.com/langchain-ai/langgraphjs/commit/658a076d5b50af9f5b96ab99f26ed629da6e182f), [`0a0e04e`](https://github.com/langchain-ai/langgraphjs/commit/0a0e04e9ff7e82fd08411cc0094e1f94729a1e1e), [`a9aa8d6`](https://github.com/langchain-ai/langgraphjs/commit/a9aa8d6a9b23f5f7d4c56889fa68697b1e076b31)]: - @langchain/langgraph@1.3.6 - @langchain/react@1.0.17 ## @examples/ui-angular@0.0.42 ### Patch Changes - Updated dependencies \[[`658a076`](https://github.com/langchain-ai/langgraphjs/commit/658a076d5b50af9f5b96ab99f26ed629da6e182f), [`0a0e04e`](https://github.com/langchain-ai/langgraphjs/commit/0a0e04e9ff7e82fd08411cc0094e1f94729a1e1e), [`658a076`](https://github.com/langchain-ai/langgraphjs/commit/658a076d5b50af9f5b96ab99f26ed629da6e182f), [`a9aa8d6`](https://github.com/langchain-ai/langgraphjs/commit/a9aa8d6a9b23f5f7d4c56889fa68697b1e076b31)]: - @langchain/langgraph@1.3.6 - @langchain/langgraph-sdk@1.9.17 - @langchain/angular@1.0.17 ## @examples/ui-multimodal@0.0.18 ### Patch Changes - Updated dependencies \[[`658a076`](https://github.com/langchain-ai/langgraphjs/commit/658a076d5b50af9f5b96ab99f26ed629da6e182f), [`0a0e04e`](https://github.com/langchain-ai/langgraphjs/commit/0a0e04e9ff7e82fd08411cc0094e1f94729a1e1e), [`a9aa8d6`](https://github.com/langchain-ai/langgraphjs/commit/a9aa8d6a9b23f5f7d4c56889fa68697b1e076b31)]: - @langchain/langgraph@1.3.6 - @langchain/react@1.0.17 ## @examples/ui-react@0.0.18 ### Patch Changes - Updated dependencies \[[`658a076`](https://github.com/langchain-ai/langgraphjs/commit/658a076d5b50af9f5b96ab99f26ed629da6e182f), [`0a0e04e`](https://github.com/langchain-ai/langgraphjs/commit/0a0e04e9ff7e82fd08411cc0094e1f94729a1e1e), [`658a076`](https://github.com/langchain-ai/langgraphjs/commit/658a076d5b50af9f5b96ab99f26ed629da6e182f), [`a9aa8d6`](https://github.com/langchain-ai/langgraphjs/commit/a9aa8d6a9b23f5f7d4c56889fa68697b1e076b31)]: - @langchain/langgraph@1.3.6 - @langchain/langgraph-sdk@1.9.17 - @langchain/react@1.0.17 ## langgraph@1.0.38 ### Patch Changes - Updated dependencies \[[`658a076`](https://github.com/langchain-ai/langgraphjs/commit/658a076d5b50af9f5b96ab99f26ed629da6e182f)]: - @langchain/langgraph@1.3.6 Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>@langchain/angular@1.0.17 @langchain/langgraph-api@1.2.5 @langchain/langgraph-cli@1.2.5 @langchain/langgraph-sdk@1.9.17 @langchain/langgraph-ui@1.2.5 @langchain/langgraph@1.3.6 @langchain/react@1.0.17 @langchain/svelte@1.0.17 @langchain/vue@1.0.17 |
||
|
|
658a076d5b | chore: update changesets | ||
|
|
a9aa8d6a9b |
fix(sdk): reconcile subagents and subgraphs on thread reconnect (#2497)
## Summary - Subagent cards are seeded from checkpoint messages and subgraph hosts from a single bounded `getHistory` during `hydrate()`, so reconnecting to a thread restores parallel fan-out discovery immediately instead of waiting for full SSE replay. - Subagent execution namespaces are resolved from history through the existing guarded discovery state machine — bulk-promoted at hydrate, and lazily per opened card via a selector-layer trigger added to React/Vue/Svelte/Angular. - `getHistory` usage is bounded (one page + at most one `before`-cursor fallback) and O(1) in requests regardless of how many subagents/subgraphs ran in parallel. --------- Co-authored-by: open-swe[bot] <215916821+open-swe[bot]@users.noreply.github.com> |
||
|
|
f552c05813 |
chore(deps): bump hono from 4.12.18 to 4.12.21 (#2492)
Bumps [hono](https://github.com/honojs/hono) from 4.12.18 to 4.12.21. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/honojs/hono/releases">hono's releases</a>.</em></p> <blockquote> <h2>v4.12.21</h2> <h2>Security fixes</h2> <p>This release includes fixes for the following security issues:</p> <h3>app.mount() strips mount prefix using undecoded path, causing incorrect routing for percent-encoded paths</h3> <p>Affects: <code>app.mount()</code>. Fixes prefix stripping using the raw URL pathname instead of the decoded path, where percent-encoded characters in the mount prefix or path could cause the prefix to be removed at the wrong position, resulting in the sub-application receiving an incorrect path. GHSA-2gcr-mfcq-wcc3</p> <h3>IP Restriction bypasses static deny rules for non-canonical IPv6</h3> <p>Affects: <code>hono/ip-restriction</code>. Fixes IP address comparison using string equality, where non-canonical IPv6 representations of a denied address — such as compressed forms or hex-notation IPv4-mapped addresses — could bypass static deny rules. GHSA-xrhx-7g5j-rcj5</p> <h3>Cookie helper does not sanitize sameSite and priority, allowing Set-Cookie injection</h3> <p>Affects: <code>hono/cookie</code>. Fixes missing validation of <code>sameSite</code> and <code>priority</code> options against injection characters (<code>;</code>, <code>\r</code>, <code>\n</code>), where user-controlled input passed to either option could inject additional attributes into the Set-Cookie response header. GHSA-3hrh-pfw6-9m5x</p> <h3>JWT middleware accepts any Authorization scheme, not only Bearer</h3> <p>Affects: <code>hono/jwt</code>, <code>hono/jwk</code>. Fixes missing scheme validation in the Authorization header, where any two-part header value was accepted regardless of the scheme name, allowing non-Bearer schemes to pass JWT authentication. GHSA-f577-qrjj-4474</p> <hr /> <p>Users who use <code>app.mount()</code>, <code>hono/ip-restriction</code>, <code>hono/cookie</code>, or <code>hono/jwt</code>/<code>hono/jwk</code> are encouraged to upgrade to this version.</p> <h2>v4.12.20</h2> <h2>What's Changed</h2> <ul> <li>fix(route): preserve the base path of the mounted route() app by <a href="https://github.com/usualoma"><code>@usualoma</code></a> in <a href="https://redirect.github.com/honojs/hono/pull/4942">honojs/hono#4942</a></li> <li>fix(jsx): widen jsx and jsxFn children to Child[] by <a href="https://github.com/ashunar0"><code>@ashunar0</code></a> in <a href="https://redirect.github.com/honojs/hono/pull/4947">honojs/hono#4947</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/ashunar0"><code>@ashunar0</code></a> made their first contribution in <a href="https://redirect.github.com/honojs/hono/pull/4947">honojs/hono#4947</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/honojs/hono/compare/v4.12.19...v4.12.20">https://github.com/honojs/hono/compare/v4.12.19...v4.12.20</a></p> <h2>v4.12.19</h2> <h2>What's Changed</h2> <ul> <li>ci: pin GitHub Actions to SHAs by <a href="https://github.com/yusukebe"><code>@yusukebe</code></a> in <a href="https://redirect.github.com/honojs/hono/pull/4932">honojs/hono#4932</a></li> <li>fix(serveStatic): make options parameter optional in all adapters by <a href="https://github.com/mixelburg"><code>@mixelburg</code></a> in <a href="https://redirect.github.com/honojs/hono/pull/4934">honojs/hono#4934</a></li> <li>fix(cookie): return the first cookie when there are multiple cookies with the same name by <a href="https://github.com/usualoma"><code>@usualoma</code></a> in <a href="https://redirect.github.com/honojs/hono/pull/4922">honojs/hono#4922</a></li> <li>feat(bearer-auth): make bearerAuth generic for typed context in verifyToken by <a href="https://github.com/justinnais"><code>@justinnais</code></a> in <a href="https://redirect.github.com/honojs/hono/pull/4913">honojs/hono#4913</a></li> <li>feat(cache): key cache entries by configured vary headers by <a href="https://github.com/usualoma"><code>@usualoma</code></a> in <a href="https://redirect.github.com/honojs/hono/pull/4915">honojs/hono#4915</a></li> <li>feat(request): add <code>bytes()</code> by <a href="https://github.com/yusukebe"><code>@yusukebe</code></a> in <a href="https://redirect.github.com/honojs/hono/pull/4921">honojs/hono#4921</a></li> <li>fix(stream): upgrade <code>@hono/node-server</code> to v2 and fix abort handling by <a href="https://github.com/yusukebe"><code>@yusukebe</code></a> in <a href="https://redirect.github.com/honojs/hono/pull/4940">honojs/hono#4940</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/justinnais"><code>@justinnais</code></a> made their first contribution in <a href="https://redirect.github.com/honojs/hono/pull/4913">honojs/hono#4913</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/honojs/hono/compare/v4.12.18...v4.12.19">https://github.com/honojs/hono/compare/v4.12.18...v4.12.19</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/honojs/hono/commit/a83ddb882e0c0b8c336050dba087bb2e1b12488e"><code>a83ddb8</code></a> 4.12.21</li> <li><a href="https://github.com/honojs/hono/commit/6cbb025ff87fca1a3d00d0ccca0eaf3a6385c3f1"><code>6cbb025</code></a> Merge commit from fork</li> <li><a href="https://github.com/honojs/hono/commit/c831020fb1fa2e929d222f6c84e1abfe013e512b"><code>c831020</code></a> Merge commit from fork</li> <li><a href="https://github.com/honojs/hono/commit/905aedbc20661e0e2fa378783a7ec44a5c3df43d"><code>905aedb</code></a> Merge commit from fork</li> <li><a href="https://github.com/honojs/hono/commit/5463db2735476959b8af67756f4e513f4fe19115"><code>5463db2</code></a> Merge commit from fork</li> <li><a href="https://github.com/honojs/hono/commit/c657a39ccc8d3194d345d9e82c8587bd25b5b6e8"><code>c657a39</code></a> 4.12.20</li> <li><a href="https://github.com/honojs/hono/commit/eb2d0c238adbcee5933d0f8c15f1a65a88f50565"><code>eb2d0c2</code></a> fix(jsx): widen jsx and jsxFn children to Child[] (<a href="https://redirect.github.com/honojs/hono/issues/4947">#4947</a>)</li> <li><a href="https://github.com/honojs/hono/commit/dcabbece347817ef7193439c39d28546b8ac3a85"><code>dcabbec</code></a> fix(route): preserve the base path of the mounted route() app (<a href="https://redirect.github.com/honojs/hono/issues/4942">#4942</a>)</li> <li><a href="https://github.com/honojs/hono/commit/7e62bcd22fa4e8f0e83cb564bac85e32f5434dd3"><code>7e62bcd</code></a> 4.12.19</li> <li><a href="https://github.com/honojs/hono/commit/e2f252a8745eb25f06485b8d43e8410bf027c8ef"><code>e2f252a</code></a> fix(stream): upgrade <code>@hono/node-server</code> to v2 and fix abort handling (<a href="https://redirect.github.com/honojs/hono/issues/4940">#4940</a>)</li> <li>Additional commits viewable in <a href="https://github.com/honojs/hono/compare/v4.12.18...v4.12.21">compare view</a></li> </ul> </details> <br /> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
0a0e04e9ff |
fix(sdk): revive automatic optimistic submit echo (#2494)
## Summary - revive automatic optimistic updates to `@langchain/langgraph-sdk`: `submit()` input is echoed into `values` / `messages` immediately, messages without ids get client-minted ids for server reconciliation, and non-message keys are shallow-merged with rollback when no `values` snapshot arrives. - Track per-message lifecycle via `useMessageMetadata(...).optimisticStatus` (`pending` → `sent` / `failed`); failed optimistic messages are kept for retry UX and dropped on `hydrate()`. - Plumb `optimistic?: boolean` through React, Vue, Svelte, and Angular `useStream` hooks (defaults to enabled) and document the v1 migration path replacing legacy `optimisticValues`. - Add browser e2e tests across all four framework SDKs covering message happy path, id reconciliation, failure handling, opt-out, and non-message state convergence/rollback. |
||
|
|
28fbf1dc4e |
chore: version packages (#2490)
This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated. # Releases ## @langchain/langgraph@1.3.5 ### Patch Changes - [#2489](https://github.com/langchain-ai/langgraphjs/pull/2489) [`e3a1933`](https://github.com/langchain-ai/langgraphjs/commit/e3a1933a8825a515d847b38b24a0743f4d418646) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(core): keep stream chunks as three-element tuples Emit lightweight checkpoint envelopes as separate `[namespace, "checkpoints", envelope]` chunks before paired `values` chunks. Public `stream()` always yields `[namespace, mode, payload]`; the v3 protocol path surfaces envelopes via `convertToProtocolEvent`. - Updated dependencies \[[`244c24e`](https://github.com/langchain-ai/langgraphjs/commit/244c24eaccff4009df7d83e4320e51a4b310b15f)]: - @langchain/langgraph-sdk@1.9.16 ## @langchain/langgraph-sdk@1.9.16 ### Patch Changes - [#2486](https://github.com/langchain-ai/langgraphjs/pull/2486) [`244c24e`](https://github.com/langchain-ai/langgraphjs/commit/244c24eaccff4009df7d83e4320e51a4b310b15f) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(sdk): surface resumed run failures on stream.error Route `respond()` and `respondAll()` through a coordinator dispatch path that writes the reactive `rootStore.error` slot when a resumed run reaches a failed terminal or when `input.respond` dispatch fails, matching submit() behavior so framework consumers (e.g. API-key retry UIs) observe resume failures via `stream.error` instead of only `isLoading` transitions. ## @langchain/angular@1.0.16 ### Patch Changes - Updated dependencies \[[`244c24e`](https://github.com/langchain-ai/langgraphjs/commit/244c24eaccff4009df7d83e4320e51a4b310b15f)]: - @langchain/langgraph-sdk@1.9.16 ## @langchain/react@1.0.16 ### Patch Changes - Updated dependencies \[[`244c24e`](https://github.com/langchain-ai/langgraphjs/commit/244c24eaccff4009df7d83e4320e51a4b310b15f)]: - @langchain/langgraph-sdk@1.9.16 ## @langchain/svelte@1.0.16 ### Patch Changes - Updated dependencies \[[`244c24e`](https://github.com/langchain-ai/langgraphjs/commit/244c24eaccff4009df7d83e4320e51a4b310b15f)]: - @langchain/langgraph-sdk@1.9.16 ## @langchain/vue@1.0.16 ### Patch Changes - Updated dependencies \[[`244c24e`](https://github.com/langchain-ai/langgraphjs/commit/244c24eaccff4009df7d83e4320e51a4b310b15f)]: - @langchain/langgraph-sdk@1.9.16 ## @example/ai-elements@0.1.31 ### Patch Changes - Updated dependencies \[[`e3a1933`](https://github.com/langchain-ai/langgraphjs/commit/e3a1933a8825a515d847b38b24a0743f4d418646)]: - @langchain/langgraph@1.3.5 - @langchain/react@1.0.16 ## @examples/assistant-ui-claude@0.1.31 ### Patch Changes - Updated dependencies \[[`e3a1933`](https://github.com/langchain-ai/langgraphjs/commit/e3a1933a8825a515d847b38b24a0743f4d418646)]: - @langchain/langgraph@1.3.5 - @langchain/react@1.0.16 ## @examples/ui-angular@0.0.41 ### Patch Changes - Updated dependencies \[[`244c24e`](https://github.com/langchain-ai/langgraphjs/commit/244c24eaccff4009df7d83e4320e51a4b310b15f), [`e3a1933`](https://github.com/langchain-ai/langgraphjs/commit/e3a1933a8825a515d847b38b24a0743f4d418646)]: - @langchain/langgraph-sdk@1.9.16 - @langchain/langgraph@1.3.5 - @langchain/angular@1.0.16 ## @examples/ui-multimodal@0.0.17 ### Patch Changes - Updated dependencies \[[`e3a1933`](https://github.com/langchain-ai/langgraphjs/commit/e3a1933a8825a515d847b38b24a0743f4d418646)]: - @langchain/langgraph@1.3.5 - @langchain/react@1.0.16 ## @examples/ui-react@0.0.17 ### Patch Changes - Updated dependencies \[[`244c24e`](https://github.com/langchain-ai/langgraphjs/commit/244c24eaccff4009df7d83e4320e51a4b310b15f), [`e3a1933`](https://github.com/langchain-ai/langgraphjs/commit/e3a1933a8825a515d847b38b24a0743f4d418646)]: - @langchain/langgraph-sdk@1.9.16 - @langchain/langgraph@1.3.5 - @langchain/react@1.0.16 ## langgraph@1.0.37 ### Patch Changes - Updated dependencies \[[`e3a1933`](https://github.com/langchain-ai/langgraphjs/commit/e3a1933a8825a515d847b38b24a0743f4d418646)]: - @langchain/langgraph@1.3.5 Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>@langchain/angular@1.0.16 @langchain/langgraph-sdk@1.9.16 @langchain/langgraph@1.3.5 @langchain/react@1.0.16 @langchain/svelte@1.0.16 @langchain/vue@1.0.16 |
||
|
|
c6528b2ff4 |
chore(sdk): update vitest browser dependency (#2493)
Updating Vitest dependencies due to vulnerability concerns. |
||
|
|
e3a1933a88 |
fix(core): keep stream() on 3-tuple shape (#2489)
## Summary
- Fixes `ValueError: too many values to unpack (expected 3)` when JS
graphs on `@langchain/langgraph` >=1.3 stream through the legacy path
(plain `stream()` / `streamEvents` v2 → `on_chain_stream`), which
affected deepagents 1.10.x and similar stacks on runtimes that expect
Python's 3-tuple stream shape.
- **Root cause:** `_streamIterator` always yielded a 4-element
`[namespace, mode, payload, meta]` when `subgraphs` + multi-mode and a
checkpointer were active, even though `StreamChunkMeta` is only for the
native v3 protocol stream (`streamEvents(..., { version: "v3" })` /
`pump()`).
- **Fix:** Introduce `isV3` and only append `meta` when `options.version
=== "v3"`; all other consumers get the Python-aligned 3-tuple
`[namespace, mode, payload]`.
- **Tests:** Add `stream() shape parity with Python` regression coverage
(3-tuples for subgraphs + multi-mode with checkpointer; v3 still emits
companion `checkpoints` events).
|
||
|
|
db75ba3d5b |
docs(sdk): update event based streaming migration guide (#2488)
This patch updates the migration docs to the new event based streaming mechanism. Improves wording and correctness. |
||
|
|
244c24eacc |
fix(sdk): surface resumed run failures on stream.error (#2486)
## Summary - Route `respond()` / `respondAll()` through `SubmitCoordinator.dispatchResume()` so resumed runs write failures to the reactive `rootStore.error` slot (same path `submit()` uses), instead of only toggling `isLoading` via the lifecycle listener. - Arm a background terminal watch before dispatch so `respond()` still resolves on `input.respond` while a later `failed` lifecycle populates `stream.error`. - Add controller tests for failed resume, dispatch failure, and batched `respondAll()` failure. |
||
|
|
a4919b667e |
chore(deps): bump the langchain group across 1 directory with 8 updates (#2476)
Bumps the langchain group with 8 updates in the / directory: | Package | From | To | | --- | --- | --- | | [@langchain/anthropic](https://github.com/langchain-ai/langchainjs) | `1.3.28` | `1.4.0` | | [@langchain/core](https://github.com/langchain-ai/langchainjs) | `1.1.44` | `1.1.48` | | [langchain](https://github.com/langchain-ai/langchainjs) | `1.4.0-dev-1777615538778` | `1.4.4` | | [@langchain/openai](https://github.com/langchain-ai/langchainjs) | `1.4.5` | `1.4.7` | | [@langchain/groq](https://github.com/langchain-ai/langchainjs) | `1.2.0` | `1.2.1` | | [@langchain/mistralai](https://github.com/langchain-ai/langchainjs) | `1.0.8` | `1.1.0` | | [@langchain/classic](https://github.com/langchain-ai/langchainjs) | `1.0.32` | `1.0.34` | | [langsmith](https://github.com/langchain-ai/langsmith-sdk) | `0.6.0` | `0.7.4` | Updates `@langchain/anthropic` from 1.3.28 to 1.4.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/langchain-ai/langchainjs/releases">@langchain/anthropic's releases</a>.</em></p> <blockquote> <h2><code>@langchain/anthropic</code><a href="https://github.com/1"><code>@1</code></a>.4.0</h2> <h3>Minor Changes</h3> <ul> <li><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/10777">#10777</a> <a href="https://github.com/langchain-ai/langchainjs/commit/0cfcfc66897d8fafeb7e7ed90b7299eace9a7c37"><code>0cfcfc6</code></a> Thanks <a href="https://github.com/jonaslalin"><code>@jonaslalin</code></a>! - feat(anthropic): support strict tool calling for custom tools</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/langchain-ai/langchainjs/commits/@langchain/anthropic@1.4.0">compare view</a></li> </ul> </details> <br /> Updates `@langchain/core` from 1.1.44 to 1.1.48 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/langchain-ai/langchainjs/releases">@langchain/core's releases</a>.</em></p> <blockquote> <h2><code>@langchain/core</code><a href="https://github.com/1"><code>@1</code></a>.1.48</h2> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/10832">#10832</a> <a href="https://github.com/langchain-ai/langchainjs/commit/1b24369a970ad6f56f1f428027f48601f87e62eb"><code>1b24369</code></a> Thanks <a href="https://github.com/info-arnav"><code>@info-arnav</code></a>! - fix(core, openrouter): make CJS default re-exports callable</p> </li> <li> <p><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/10666">#10666</a> <a href="https://github.com/langchain-ai/langchainjs/commit/2bb55b053f49f89e81e3252a7af08e86d71ddd95"><code>2bb55b0</code></a> Thanks <a href="https://github.com/hnustwjj"><code>@hnustwjj</code></a>! - feat(openrouter): surface reasoning content as v1 standard content blocks</p> <p><code>convertOpenRouterResponseToBaseMessage</code> and <code>convertOpenRouterDeltaToBaseMessageChunk</code> now copy OpenRouter's <code>reasoning</code> (flat string) and <code>reasoning_details</code> (structured array) fields onto <code>additional_kwargs.reasoning_content</code> / <code>additional_kwargs.reasoning_details</code>. A new <code>ChatOpenRouterTranslator</code> is registered in <code>@langchain/core</code> under the <code>"openrouter"</code> provider key so <code>AIMessage.contentBlocks</code> emits standard <code>{type: "reasoning"}</code> blocks alongside text and tool calls.</p> <p>Previously, reasoning text returned by reasoning-capable models routed through OpenRouter (DeepSeek R1, Minimax M2, Claude extended thinking, o-series, etc.) was silently dropped: only the <code>reasoning_tokens</code> count was preserved via <code>usage_metadata</code>. Consumers using standard content blocks (including the frontend agent UI patterns shown in the docs) could not display the model's chain of thought.</p> </li> <li> <p><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/10918">#10918</a> <a href="https://github.com/langchain-ai/langchainjs/commit/3999fab55870c6eea22d6d90c08aa472f9b2fac3"><code>3999fab</code></a> Thanks <a href="https://github.com/christian-bromann"><code>@christian-bromann</code></a>! - fix(openai): stream custom tool calls through Responses API chunks</p> </li> </ul> <h2><code>@langchain/core</code><a href="https://github.com/1"><code>@1</code></a>.1.47</h2> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/10906">#10906</a> <a href="https://github.com/langchain-ai/langchainjs/commit/f61b3450f275831e47e69c08899b4a2b67b4bdb3"><code>f61b345</code></a> Thanks <a href="https://github.com/hntrl"><code>@hntrl</code></a>! - feat(core): add uuid v6 utility support</p> <p>Add <code>v6</code> UUID generation support to <code>@langchain/core/utils/uuid</code> by vendoring the upstream uuidjs <code>v6</code> implementation and its <code>v1ToV6</code> helper, exporting <code>v6</code> from the UUID utils index, and adding tests for deterministic generation, buffer/offset behavior, validation/versioning, and ordering.</p> </li> <li> <p><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/10872">#10872</a> <a href="https://github.com/langchain-ai/langchainjs/commit/a64007997a4940f51bba3c1c83dae89d1ccfb692"><code>a640079</code></a> Thanks <a href="https://github.com/hntrl"><code>@hntrl</code></a>! - chore(deps): remove redundant <code>@types/uuid</code> declarations</p> <p>Remove <code>@types/uuid</code> from package manifests that rely on <code>@langchain/core/utils/uuid</code> or do not require uuid type stubs directly, and refresh the lockfile entries accordingly.</p> </li> <li> <p><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/10792">#10792</a> <a href="https://github.com/langchain-ai/langchainjs/commit/3682268cd1844b2573b01f07bee367e21cb7bdc7"><code>3682268</code></a> Thanks <a href="https://github.com/Genmin"><code>@Genmin</code></a>! - fix(core): apply v1 message casting after implicit streaming aggregation</p> </li> <li> <p><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/10901">#10901</a> <a href="https://github.com/langchain-ai/langchainjs/commit/f26fc4a6f461d6d0f86d59bd00197ad510432c4a"><code>f26fc4a</code></a> Thanks <a href="https://github.com/christian-bromann"><code>@christian-bromann</code></a>! - fix(testing): share fakeModel invocation state across bindTools instances</p> </li> </ul> <h2><code>@langchain/core</code><a href="https://github.com/1"><code>@1</code></a>.1.46</h2> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/10847">#10847</a> <a href="https://github.com/langchain-ai/langchainjs/commit/1659e7d36e31e315c890fa98f43db887f7a2d52b"><code>1659e7d</code></a> Thanks <a href="https://github.com/hntrl"><code>@hntrl</code></a>! - chore(core): reduce transitive dependency exposure and tighten release hygiene</p> <p>Remove direct runtime dependencies on <code>ansi-styles</code>, <code>camelcase</code>, and <code>decamelize</code> by inlining equivalent logic in core internals, and enable npm provenance in the release workflow.</p> </li> <li> <p><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/10790">#10790</a> <a href="https://github.com/langchain-ai/langchainjs/commit/ef78bc6a21f9a8808ba95c98db2023f0a6b51bcc"><code>ef78bc6</code></a> Thanks <a href="https://github.com/Genmin"><code>@Genmin</code></a>! - fix(core): keep different content block types separate when merging chunks</p> </li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/langchain-ai/langchainjs/commits/@langchain/core@1.1.48">compare view</a></li> </ul> </details> <br /> Updates `langchain` from 1.4.0-dev-1777615538778 to 1.4.4 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/langchain-ai/langchainjs/releases">langchain's releases</a>.</em></p> <blockquote> <h2>langchain@1.4.2</h2> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/10900">#10900</a> <a href="https://github.com/langchain-ai/langchainjs/commit/6bbddca1f8f7f280583fd839bb40c00bf19a0d51"><code>6bbddca</code></a> Thanks <a href="https://github.com/christian-bromann"><code>@christian-bromann</code></a>! - fix(langchain): unwrap tool message outputs in agent streams</p> </li> <li> <p><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/10706">#10706</a> <a href="https://github.com/langchain-ai/langchainjs/commit/4ecb6606feae3156a07de67e39e2027f857c476e"><code>4ecb660</code></a> Thanks <a href="https://github.com/JadenKim-dev"><code>@JadenKim-dev</code></a>! - fix(langchain): set name on todoListMiddleware ToolMessages</p> </li> </ul> <h2>langchain@1.4.1</h2> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/10879">#10879</a> <a href="https://github.com/langchain-ai/langchainjs/commit/eb480cb6df8e0fa792826155bfa00a6db4536444"><code>eb480cb</code></a> Thanks <a href="https://github.com/vignesh-gep"><code>@vignesh-gep</code></a>! - fix(langchain/createAgent): throw on terminal <code>providerStrategy</code> parse failure instead of silently resolving with <code>structuredResponse: undefined</code></p> <p>When <code>createAgent</code> was configured with <code>responseFormat</code> resolving to a <code>providerStrategy</code> (either passed explicitly or auto-promoted from a bare Zod / JSON schema for models whose profile reports <code>structuredOutput: true</code>), and the model produced a terminal response (no <code>tool_calls</code>) whose text could not be JSON-parsed or did not satisfy the schema, the agent silently exited with no <code>structuredResponse</code>, surfacing later as <code>TypeError: Cannot read properties of undefined</code>. The agent now throws a <code>StructuredOutputParsingError</code> in that case while still allowing the agent loop to continue when tool calls are present. Closes <a href="https://redirect.github.com/langchain-ai/langchainjs/issues/10878">#10878</a>.</p> </li> <li> <p><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/10872">#10872</a> <a href="https://github.com/langchain-ai/langchainjs/commit/a64007997a4940f51bba3c1c83dae89d1ccfb692"><code>a640079</code></a> Thanks <a href="https://github.com/hntrl"><code>@hntrl</code></a>! - chore(deps): remove redundant <code>@types/uuid</code> declarations</p> <p>Remove <code>@types/uuid</code> from package manifests that rely on <code>@langchain/core/utils/uuid</code> or do not require uuid type stubs directly, and refresh the lockfile entries accordingly.</p> </li> <li> <p><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/10160">#10160</a> <a href="https://github.com/langchain-ai/langchainjs/commit/bba900c7c8781c7efec856d5d3e539a93f14e797"><code>bba900c</code></a> Thanks <a href="https://github.com/JadenKim-dev"><code>@JadenKim-dev</code></a>! - fix(langchain): prevent llmToolSelectorMiddleware from leaking into message stream</p> </li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/langchain-ai/langchainjs/commits/@langchain/openai@1.4.4">compare view</a></li> </ul> </details> <br /> Updates `@langchain/openai` from 1.4.5 to 1.4.7 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/langchain-ai/langchainjs/releases">@langchain/openai's releases</a>.</em></p> <blockquote> <h2><code>@langchain/openai</code><a href="https://github.com/1"><code>@1</code></a>.4.7</h2> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/10918">#10918</a> <a href="https://github.com/langchain-ai/langchainjs/commit/3999fab55870c6eea22d6d90c08aa472f9b2fac3"><code>3999fab</code></a> Thanks <a href="https://github.com/christian-bromann"><code>@christian-bromann</code></a>! - fix(openai): stream custom tool calls through Responses API chunks</p> </li> <li> <p><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/10791">#10791</a> <a href="https://github.com/langchain-ai/langchainjs/commit/fce9ab418901323618fdfaaa9fc350fa1c0d50e0"><code>fce9ab4</code></a> Thanks <a href="https://github.com/Genmin"><code>@Genmin</code></a>! - fix(openai): preserve top-level Responses API ids on AI messages</p> </li> </ul> <h2><code>@langchain/openai</code><a href="https://github.com/1"><code>@1</code></a>.4.6</h2> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/10902">#10902</a> <a href="https://github.com/langchain-ai/langchainjs/commit/229a7ad67b9a7ebd8df3ca451e0b8195bea0190e"><code>229a7ad</code></a> Thanks <a href="https://github.com/christian-bromann"><code>@christian-bromann</code></a>! - fix(openai): preserve v1 assistant tool calls</p> </li> <li> <p><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/10895">#10895</a> <a href="https://github.com/langchain-ai/langchainjs/commit/36fb0ef1dc76c096dcfa0c777e10c9f9365a5240"><code>36fb0ef</code></a> Thanks <a href="https://github.com/BertBR"><code>@BertBR</code></a>! - fix(openai): guard bare <code>JSON.parse</code> in Responses API converter against trailing non-whitespace characters</p> <p><code>convertResponsesDeltaToChatGenerationChunk</code> previously called <code>JSON.parse(msg.text)</code> directly when <code>response.text.format.type === "json_schema"</code>. Some models (observed with <code>gpt-5-mini</code> on <code>service_tier: "auto"</code>) intermittently emit trailing non-whitespace characters (extra tokens, control characters) after a valid JSON object, causing a <code>SyntaxError</code> that propagates as an unhandled exception and kills the entire streaming response mid-flight. The parse is now wrapped in a <code>try</code>/<code>catch</code>: on failure, <code>additional_kwargs.parsed</code> is left undefined, the stream completes normally, and the existing <code>withStructuredOutput</code> pipeline handles the typed failure — <code>includeRaw: true</code> returns <code>{ raw, parsed: null }</code> via its <code>withFallbacks</code> wrapper, <code>includeRaw: false</code> throws a typed <code>OutputParserException</code> that the caller can catch and retry. Closes <a href="https://redirect.github.com/langchain-ai/langchainjs/issues/10894">#10894</a>.</p> </li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/langchain-ai/langchainjs/commits/@langchain/openai@1.4.7">compare view</a></li> </ul> </details> <br /> Updates `@langchain/groq` from 1.2.0 to 1.2.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/langchain-ai/langchainjs/releases">@langchain/groq's releases</a>.</em></p> <blockquote> <h2><code>@langchain/groq</code><a href="https://github.com/1"><code>@1</code></a>.2.1</h2> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/10872">#10872</a> <a href="https://github.com/langchain-ai/langchainjs/commit/a64007997a4940f51bba3c1c83dae89d1ccfb692"><code>a640079</code></a> Thanks <a href="https://github.com/hntrl"><code>@hntrl</code></a>! - chore(deps): remove redundant <code>@types/uuid</code> declarations</p> <p>Remove <code>@types/uuid</code> from package manifests that rely on <code>@langchain/core/utils/uuid</code> or do not require uuid type stubs directly, and refresh the lockfile entries accordingly.</p> </li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/langchain-ai/langchainjs/commit/1b19e4f84d747b481879363b4884c20eb1c0f1a4"><code>1b19e4f</code></a> chore: version packages (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/10899">#10899</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/426e3aba21016d9ee070c3d130f74ae0047c9ce5"><code>426e3ab</code></a> chore: fix uuid changeset (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/10916">#10916</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/245c98216ce4a6c4340954711a7ad60203283424"><code>245c982</code></a> chore(deps): bump fast-xml-builder from 1.1.5 to 1.2.0 (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/10914">#10914</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/126dac5a7a2fac5978448185893038ac8ea6d994"><code>126dac5</code></a> chore(deps): bump brace-expansion from 5.0.5 to 5.0.6 (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/10912">#10912</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/1abe24becdddce94c5bd2acfaf920b60a683f22b"><code>1abe24b</code></a> chore(deps): bump fast-uri from 3.1.0 to 3.1.2 (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/10913">#10913</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/229a7ad67b9a7ebd8df3ca451e0b8195bea0190e"><code>229a7ad</code></a> fix(openai): preserve v1 assistant tool calls (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/10902">#10902</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/f26fc4a6f461d6d0f86d59bd00197ad510432c4a"><code>f26fc4a</code></a> fix(core): share fakeModel invocation state across bindTools instances (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/10901">#10901</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/a0cd7477e59677c8d15e0e70b374afa0a2410582"><code>a0cd747</code></a> chore(deps): bump fast-xml-builder from 1.1.5 to 1.1.9 (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/10910">#10910</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/b208e625865fc7487876b652f479dbf854263e68"><code>b208e62</code></a> chore(deps): bump ip-address from 10.1.0 to 10.2.0 (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/10909">#10909</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/f7e50fb8b98bd9969c0f5cf0967a06df15453453"><code>f7e50fb</code></a> feat(google): Service tier and custom headers (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/10704">#10704</a>)</li> <li>Additional commits viewable in <a href="https://github.com/langchain-ai/langchainjs/compare/@langchain/groq@1.2.0...@langchain/groq@1.2.1">compare view</a></li> </ul> </details> <br /> Updates `@langchain/mistralai` from 1.0.8 to 1.1.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/langchain-ai/langchainjs/releases">@langchain/mistralai's releases</a>.</em></p> <blockquote> <h2><code>@langchain/mistralai</code><a href="https://github.com/1"><code>@1</code></a>.1.0</h2> <h3>Minor Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/10873">#10873</a> <a href="https://github.com/langchain-ai/langchainjs/commit/a74d574f7f086bea2f5c7a852e869f7d24be2f55"><code>a74d574</code></a> Thanks <a href="https://github.com/baptistejamin"><code>@baptistejamin</code></a>! - chore(mistralai): upgrade to <code>@mistralai/mistralai</code> v2</p> <p>Also populates <code>response_metadata.model</code> on chat completions (was missing before).</p> </li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/langchain-ai/langchainjs/commit/caad0914f068477293009dbf27a220fa96bdc4b8"><code>caad091</code></a> chore: version packages (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/10919">#10919</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/f4a6149e3e754203f5886dd8c2bccaa7a6fd4f81"><code>f4a6149</code></a> chore(deps): bump fast-uri from 3.1.0 to 3.1.2 (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/10926">#10926</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/7b12f6dfa537932073f96b561d7c851b30d69132"><code>7b12f6d</code></a> chore(deps): bump protobufjs from 7.5.6 to 7.6.0 (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/10930">#10930</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/5c6c5fef0cb392e782675ca5926e291a4295a653"><code>5c6c5fe</code></a> chore(deps): bump ws from 5.2.4 to 8.20.0 (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/10915">#10915</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/a8652ceeb5e36434565c96fc1a6bd9a4a36304cc"><code>a8652ce</code></a> docs: fix typos, add Ollama setup, update outdated references (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/10922">#10922</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/2bb55b053f49f89e81e3252a7af08e86d71ddd95"><code>2bb55b0</code></a> feat(openrouter): surface reasoning as v1 standard content blocks (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/10666">#10666</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/4ecb6606feae3156a07de67e39e2027f857c476e"><code>4ecb660</code></a> fix(langchain): set name on todoListMiddleware ToolMessages (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/10706">#10706</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/20f27dff08a4bd5a1a16c1c71a88405c9df82914"><code>20f27df</code></a> fix(ibm): handle API errors in streaming responses (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/10721">#10721</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/45668734c3205e631cdd33ac071bbf733f4558c7"><code>4566873</code></a> feat(ibm): add integration test to IBM implementation (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/10732">#10732</a>)</li> <li><a href="https://github.com/langchain-ai/langchainjs/commit/6e4337fec1a7707c1a1c709a7b6aa0c5efb7b11d"><code>6e4337f</code></a> fix(aws): add claude-haiku-4 to supportedToolChoiceValuesForModel (<a href="https://redirect.github.com/langchain-ai/langchainjs/issues/10743">#10743</a>)</li> <li>Additional commits viewable in <a href="https://github.com/langchain-ai/langchainjs/compare/@langchain/classic@1.0.8...@langchain/mistralai@1.1.0">compare view</a></li> </ul> </details> <br /> Updates `@langchain/classic` from 1.0.32 to 1.0.34 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/langchain-ai/langchainjs/releases">@langchain/classic's releases</a>.</em></p> <blockquote> <h2><code>@langchain/classic</code><a href="https://github.com/1"><code>@1</code></a>.0.34</h2> <h3>Patch Changes</h3> <ul> <li>Updated dependencies [<a href="https://github.com/langchain-ai/langchainjs/commit/3999fab55870c6eea22d6d90c08aa472f9b2fac3"><code>3999fab</code></a>, <a href="https://github.com/langchain-ai/langchainjs/commit/fce9ab418901323618fdfaaa9fc350fa1c0d50e0"><code>fce9ab4</code></a>]: <ul> <li><code>@langchain/openai</code><a href="https://github.com/1"><code>@1</code></a>.4.7</li> </ul> </li> </ul> <h2><code>@langchain/classic</code><a href="https://github.com/1"><code>@1</code></a>.0.33</h2> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/langchain-ai/langchainjs/pull/10872">#10872</a> <a href="https://github.com/langchain-ai/langchainjs/commit/a64007997a4940f51bba3c1c83dae89d1ccfb692"><code>a640079</code></a> Thanks <a href="https://github.com/hntrl"><code>@hntrl</code></a>! - chore(deps): remove redundant <code>@types/uuid</code> declarations</p> <p>Remove <code>@types/uuid</code> from package manifests that rely on <code>@langchain/core/utils/uuid</code> or do not require uuid type stubs directly, and refresh the lockfile entries accordingly.</p> </li> <li> <p>Updated dependencies [<a href="https://github.com/langchain-ai/langchainjs/commit/229a7ad67b9a7ebd8df3ca451e0b8195bea0190e"><code>229a7ad</code></a>, <a href="https://github.com/langchain-ai/langchainjs/commit/36fb0ef1dc76c096dcfa0c777e10c9f9365a5240"><code>36fb0ef</code></a>]:</p> <ul> <li><code>@langchain/openai</code><a href="https://github.com/1"><code>@1</code></a>.4.6</li> </ul> </li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/langchain-ai/langchainjs/commits/@langchain/classic@1.0.34">compare view</a></li> </ul> </details> <br /> Updates `langsmith` from 0.6.0 to 0.7.4 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/langchain-ai/langsmith-sdk/releases">langsmith's releases</a>.</em></p> <blockquote> <h2>v0.7.4</h2> <h2>What's Changed</h2> <ul> <li>fix(google-adk): add wrapt dependency by <a href="https://github.com/QuentinBrosse"><code>@QuentinBrosse</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2436">langchain-ai/langsmith-sdk#2436</a></li> <li>chore: lock dependencies by <a href="https://github.com/QuentinBrosse"><code>@QuentinBrosse</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2439">langchain-ai/langsmith-sdk#2439</a></li> <li>release(py): 0.7.4 by <a href="https://github.com/QuentinBrosse"><code>@QuentinBrosse</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2441">langchain-ai/langsmith-sdk#2441</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/langchain-ai/langsmith-sdk/compare/v0.7.3...v0.7.4">https://github.com/langchain-ai/langsmith-sdk/compare/v0.7.3...v0.7.4</a></p> <h2>v0.7.3</h2> <h2>What's Changed</h2> <ul> <li>fix: propagate tracingEnabled to nested traceables by <a href="https://github.com/hntrl"><code>@hntrl</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2427">langchain-ai/langsmith-sdk#2427</a></li> <li>chore(python): openai agents: delay span start for spans without inputs on start event by <a href="https://github.com/angus-langchain"><code>@angus-langchain</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2424">langchain-ai/langsmith-sdk#2424</a></li> <li>release(py): 0.7.3 by <a href="https://github.com/angus-langchain"><code>@angus-langchain</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2428">langchain-ai/langsmith-sdk#2428</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/langchain-ai/langsmith-sdk/compare/v0.7.2...v0.7.3">https://github.com/langchain-ai/langsmith-sdk/compare/v0.7.2...v0.7.3</a></p> <h2>v0.7.2</h2> <h2>What's Changed</h2> <ul> <li>release(js): 0.5.1 by <a href="https://github.com/jacoblee93"><code>@jacoblee93</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2389">langchain-ai/langsmith-sdk#2389</a></li> <li>fix(js): Remove <a href="https://github.com/internal"><code>@internal</code></a> by <a href="https://github.com/jacoblee93"><code>@jacoblee93</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2391">langchain-ai/langsmith-sdk#2391</a></li> <li>release(js): 0.5.2 by <a href="https://github.com/jacoblee93"><code>@jacoblee93</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2392">langchain-ai/langsmith-sdk#2392</a></li> <li>chore(deps-dev): bump openai from 5.8.2 to 6.18.0 in /js by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2378">langchain-ai/langsmith-sdk#2378</a></li> <li>chore(deps-dev): bump cross-env from 7.0.3 to 10.1.0 in /js by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2379">langchain-ai/langsmith-sdk#2379</a></li> <li>chore(deps-dev): bump the js-minor-and-patch group in /js with 4 updates by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2376">langchain-ai/langsmith-sdk#2376</a></li> <li>chore(deps-dev): bump node-fetch from 2.7.0 to 3.3.2 in /js by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2380">langchain-ai/langsmith-sdk#2380</a></li> <li>Google ADK LangSmith tracing enhancements by <a href="https://github.com/j-broekhuizen"><code>@j-broekhuizen</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2394">langchain-ai/langsmith-sdk#2394</a></li> <li>chore: update dependabot.yml to comply with posture checks by <a href="https://github.com/jkennedyvz"><code>@jkennedyvz</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2393">langchain-ai/langsmith-sdk#2393</a></li> <li>chore(deps): bump cryptography from 46.0.3 to 46.0.5 in /python in the uv group across 1 directory by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2397">langchain-ai/langsmith-sdk#2397</a></li> <li>chore(deps-dev): bump the js-minor-and-patch group in /js with 6 updates by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2398">langchain-ai/langsmith-sdk#2398</a></li> <li>chore(deps-dev): bump eslint-config-prettier from 8.10.0 to 10.1.8 in /js by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2399">langchain-ai/langsmith-sdk#2399</a></li> <li>chore(deps): bump packaging from 25.0 to 26.0 in /python by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2403">langchain-ai/langsmith-sdk#2403</a></li> <li>chore(deps-dev): bump pytest from 8.4.2 to 9.0.2 in /python by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2405">langchain-ai/langsmith-sdk#2405</a></li> <li>chore(deps): bump the py-minor-and-patch group across 1 directory with 20 updates by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2406">langchain-ai/langsmith-sdk#2406</a></li> <li>fix(js): Log Vitest/Jest outputs even if test throws an error by <a href="https://github.com/jacoblee93"><code>@jacoblee93</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2408">langchain-ai/langsmith-sdk#2408</a></li> <li>fix(js): Remove async by <a href="https://github.com/jacoblee93"><code>@jacoblee93</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2409">langchain-ai/langsmith-sdk#2409</a></li> <li>release(js): 0.5.3 by <a href="https://github.com/jacoblee93"><code>@jacoblee93</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2410">langchain-ai/langsmith-sdk#2410</a></li> <li>fix: ignoring p-queue dep by <a href="https://github.com/jkennedyvz"><code>@jkennedyvz</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2414">langchain-ai/langsmith-sdk#2414</a></li> <li>feat(js): add feedback config CRUD and annotation queue rubric items (closes LSPE-67) by <a href="https://github.com/bentanny"><code>@bentanny</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2420">langchain-ai/langsmith-sdk#2420</a></li> <li>fix(js): Add on_start handler for traceable, use in evaluate by <a href="https://github.com/jacoblee93"><code>@jacoblee93</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2421">langchain-ai/langsmith-sdk#2421</a></li> <li>release(js): 0.5.4 by <a href="https://github.com/jacoblee93"><code>@jacoblee93</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2422">langchain-ai/langsmith-sdk#2422</a></li> <li>feat(python): add feedback config CRUD and annotation queue rubric items (closes LSPE-67) by <a href="https://github.com/bentanny"><code>@bentanny</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2419">langchain-ai/langsmith-sdk#2419</a></li> <li>feat(python): add exceptions_to_handle to <a href="https://github.com/traceable"><code>@traceable</code></a> by <a href="https://github.com/QuentinBrosse"><code>@QuentinBrosse</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2423">langchain-ai/langsmith-sdk#2423</a></li> <li>release(py): 0.7.2 by <a href="https://github.com/jacoblee93"><code>@jacoblee93</code></a> in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2426">langchain-ai/langsmith-sdk#2426</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/j-broekhuizen"><code>@j-broekhuizen</code></a> made their first contribution in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2394">langchain-ai/langsmith-sdk#2394</a></li> <li><a href="https://github.com/bentanny"><code>@bentanny</code></a> made their first contribution in <a href="https://redirect.github.com/langchain-ai/langsmith-sdk/pull/2420">langchain-ai/langsmith-sdk#2420</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/langchain-ai/langsmith-sdk/commit/1132e6ce6391d08158a93acb5c96b90521ac3230"><code>1132e6c</code></a> release(py): 0.7.4 (<a href="https://redirect.github.com/langchain-ai/langsmith-sdk/issues/2441">#2441</a>)</li> <li><a href="https://github.com/langchain-ai/langsmith-sdk/commit/8c7cc783806e4a6d71300982d58ecb3c9bc658cd"><code>8c7cc78</code></a> chore: lock dependencies (<a href="https://redirect.github.com/langchain-ai/langsmith-sdk/issues/2439">#2439</a>)</li> <li><a href="https://github.com/langchain-ai/langsmith-sdk/commit/62c256ea56fdee0bc539275c749a427e510ded8f"><code>62c256e</code></a> fix(google-adk): add wrapt dependency (<a href="https://redirect.github.com/langchain-ai/langsmith-sdk/issues/2436">#2436</a>)</li> <li><a href="https://github.com/langchain-ai/langsmith-sdk/commit/e32d4c18a681553f47c93350f03dc0a0f0cc4890"><code>e32d4c1</code></a> release(py): 0.7.3 (<a href="https://redirect.github.com/langchain-ai/langsmith-sdk/issues/2428">#2428</a>)</li> <li><a href="https://github.com/langchain-ai/langsmith-sdk/commit/1c51bf881dafaeb01432db629de7cafaabca79dc"><code>1c51bf8</code></a> chore(python): openai agents: delay span start for spans without inputs on st...</li> <li><a href="https://github.com/langchain-ai/langsmith-sdk/commit/a41bf22dadaea489a156dc06a9d0fbf1a977ff6d"><code>a41bf22</code></a> fix: propagate tracingEnabled to nested traceables (<a href="https://redirect.github.com/langchain-ai/langsmith-sdk/issues/2427">#2427</a>)</li> <li><a href="https://github.com/langchain-ai/langsmith-sdk/commit/3a6e9dac4bf3a940f7ee47e420cc1422f9f4a4b4"><code>3a6e9da</code></a> release(py): 0.7.2 (<a href="https://redirect.github.com/langchain-ai/langsmith-sdk/issues/2426">#2426</a>)</li> <li><a href="https://github.com/langchain-ai/langsmith-sdk/commit/f665e865e7ab7a0ba1de447f2a1cf14c719af00a"><code>f665e86</code></a> feat(python): add exceptions_to_handle to <a href="https://github.com/traceable"><code>@traceable</code></a> (<a href="https://redirect.github.com/langchain-ai/langsmith-sdk/issues/2423">#2423</a>)</li> <li><a href="https://github.com/langchain-ai/langsmith-sdk/commit/565c4a2c5769e698ecffbf7f43131ff9cc467f8d"><code>565c4a2</code></a> feat(python): add feedback config CRUD and annotation queue rubric items (clo...</li> <li><a href="https://github.com/langchain-ai/langsmith-sdk/commit/e1b1fe13c382371ebe4cffa1b95eba3bf74e2f37"><code>e1b1fe1</code></a> release(js): 0.5.4 (<a href="https://redirect.github.com/langchain-ai/langsmith-sdk/issues/2422">#2422</a>)</li> <li>Additional commits viewable in <a href="https://github.com/langchain-ai/langsmith-sdk/compare/v0.6.0...v0.7.4">compare view</a></li> </ul> </details> <br /> --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: John Kennedy <jkennedyvz@users.noreply.github.com> |
||
|
|
34b7f6cfc5 |
chore: version packages (#2485)
This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated. # Releases ## @langchain/langgraph-sdk@1.9.15 ### Patch Changes - [#2484](https://github.com/langchain-ai/langgraphjs/pull/2484) [`9861f42`](https://github.com/langchain-ai/langgraphjs/commit/9861f42cc4fa23d9e80ae45a76d511d7618cda07) Thanks [@christian-bromann](https://github.com/christian-bromann)! - fix(sdk): claim in-flight slot before root pump wait for enqueue Move `#runAbort` and `isLoading` setup ahead of `waitForRootPumpReady()` so `multitaskStrategy: "enqueue"` submits in the same tick land in `queueStore` instead of bypassing the client queue. ## @langchain/angular@1.0.15 ### Patch Changes - Updated dependencies \[[`9861f42`](https://github.com/langchain-ai/langgraphjs/commit/9861f42cc4fa23d9e80ae45a76d511d7618cda07)]: - @langchain/langgraph-sdk@1.9.15 ## @langchain/react@1.0.15 ### Patch Changes - Updated dependencies \[[`9861f42`](https://github.com/langchain-ai/langgraphjs/commit/9861f42cc4fa23d9e80ae45a76d511d7618cda07)]: - @langchain/langgraph-sdk@1.9.15 ## @langchain/svelte@1.0.15 ### Patch Changes - Updated dependencies \[[`9861f42`](https://github.com/langchain-ai/langgraphjs/commit/9861f42cc4fa23d9e80ae45a76d511d7618cda07)]: - @langchain/langgraph-sdk@1.9.15 ## @langchain/vue@1.0.15 ### Patch Changes - Updated dependencies \[[`9861f42`](https://github.com/langchain-ai/langgraphjs/commit/9861f42cc4fa23d9e80ae45a76d511d7618cda07)]: - @langchain/langgraph-sdk@1.9.15 ## @example/ai-elements@0.1.30 ### Patch Changes - Updated dependencies \[]: - @langchain/react@1.0.15 ## @examples/assistant-ui-claude@0.1.30 ### Patch Changes - Updated dependencies \[]: - @langchain/react@1.0.15 ## @examples/ui-angular@0.0.40 ### Patch Changes - Updated dependencies \[[`9861f42`](https://github.com/langchain-ai/langgraphjs/commit/9861f42cc4fa23d9e80ae45a76d511d7618cda07)]: - @langchain/langgraph-sdk@1.9.15 - @langchain/angular@1.0.15 ## @examples/ui-multimodal@0.0.16 ### Patch Changes - Updated dependencies \[]: - @langchain/react@1.0.15 ## @examples/ui-react@0.0.16 ### Patch Changes - Updated dependencies \[[`9861f42`](https://github.com/langchain-ai/langgraphjs/commit/9861f42cc4fa23d9e80ae45a76d511d7618cda07)]: - @langchain/langgraph-sdk@1.9.15 - @langchain/react@1.0.15 Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>@langchain/angular@1.0.15 @langchain/langgraph-sdk@1.9.15 @langchain/react@1.0.15 @langchain/svelte@1.0.15 @langchain/vue@1.0.15 |
||
|
|
9861f42cc4 |
fix(sdk): claim in-flight slot before root pump wait for enqueue (#2484)
## Summary - Fix a race in `SubmitCoordinator.submit()` where `multitaskStrategy: "enqueue"` follow-ups fired in the same tick as the first dispatch could miss `hasActiveRun` and skip the client `queueStore`. - Claim the in-flight slot (`#runAbort`, `isLoading`) before `waitForRootPumpReady()` so concurrent enqueues are recorded client-side and drain sequentially as intended. - Add a regression test for same-tick enqueue behavior. |
||
|
|
8e2b8584c5 |
docs: Update customer_support_small_model example to use non-deprecated methods and add type annotations (#1718)
## Description Updated the `customer_support_small_model.ipynb` example to use non-deprecated API methods and improve TypeScript type safety. ## Changes ### 1. Replace deprecated `_getType()` method - **Before**: `if (trimmedHistory.at(-1)._getType() === "ai")` - **After**: `if (trimmedHistory[trimmedHistory.length - 1].getType() === "ai")` - The `_getType()` method signature is deprecated and should be replaced with `getType()` - Also replaced `.at(-1)` with `[trimmedHistory.length - 1]` to fix TypeScript "possibly undefined" error (ts(2532)) ### 2. Add missing type annotation - **Location**: `addConditionalEdges` callback in `billing_support` node - **Added**: `async (state: typeof StateAnnotation.State) =>` type annotation - Ensures consistency with other conditional edge definitions in the example ## Type of Change - [x] Documentation update - [x] Bug fix (non-breaking change which fixes TypeScript errors) ## Testing - Verified code changes compile without TypeScript errors - Confirmed deprecated method warnings are resolved ## Motivation This PR addresses two issues in the example notebook: 1. **API Deprecation**: The `_getType()` method is deprecated and should be replaced with the public `getType()` API 2. **TypeScript Safety**: Adding explicit type annotations and using safer array access patterns improves type safety and prevents potential runtime errors |