Skip to content

fix(deepagents): merge custom middleware by name - #672

Merged
Hunter Lovell (hntrl) merged 9 commits into
mainfrom
hunter/middleware-merge-values
Jul 15, 2026
Merged

fix(deepagents): merge custom middleware by name#672
Hunter Lovell (hntrl) merged 9 commits into
mainfrom
hunter/middleware-merge-values

Conversation

@hntrl

Copy link
Copy Markdown
Member

Summary

Adds middleware override behavior to replace default middleware by .name instead of always being appended.

Changes

  • Add name-keyed middleware merging so custom middleware replaces matching default middleware in-place and appends novel middleware after the core stack.
  • Apply default-slot middleware overrides consistently when constructing main-agent and subagent middleware stacks, while preventing parent-only middleware from propagating unless it matches a subagent default slot.
  • Move harness tool exclusion into a private _ToolExclusionMiddleware helper so excluded tools are stripped after tool-injecting middleware has run.
  • Add coverage for main-agent replacement, subagent/default override propagation, parent-only middleware isolation, profile exclusions, tool-exclusion ordering, and merge precedence.

@changeset-bot

changeset-bot Bot commented Jul 13, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 2b1c1a4

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 3 packages
Name Type
deepagents Patch
deepagents-acp Patch
@deepagents/evals Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercel Bot commented Jul 13, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
deepagentsjs-ui Ready Ready Preview, Comment Jul 15, 2026 1:32am

Request Review

@pkg-pr-new

pkg-pr-new Bot commented Jul 13, 2026

Copy link
Copy Markdown

Open in StackBlitz

deepagents-acp

npm i https://pkg.pr.new/deepagents-acp@672

deepagents

npm i https://pkg.pr.new/deepagents@672

@langchain/sandbox-standard-tests

npm i https://pkg.pr.new/@langchain/sandbox-standard-tests@672

@langchain/daytona

npm i https://pkg.pr.new/@langchain/daytona@672

@langchain/deno

npm i https://pkg.pr.new/@langchain/deno@672

@langchain/modal

npm i https://pkg.pr.new/@langchain/modal@672

@langchain/node-vfs

npm i https://pkg.pr.new/@langchain/node-vfs@672

@langchain/quickjs

npm i https://pkg.pr.new/@langchain/quickjs@672

commit: 2b1c1a4

@open-swe open-swe Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Open SWE Review found 2 potential issues.

Open in WebView Open SWE trace

Comment thread libs/deepagents/src/agent.ts Outdated
Comment thread libs/deepagents/src/agent.ts Outdated
@langchain-ai LangChain (langchain-ai) deleted a comment from open-swe Bot Jul 13, 2026

@open-swe open-swe Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Open SWE Review found 1 potential issue.

Open in WebView Open SWE trace

Comment thread libs/deepagents/src/agent.ts Outdated

@open-swe open-swe Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Open SWE Review found 1 potential issue.

Open in WebView Open SWE trace

Comment thread libs/deepagents/src/agent.ts Outdated
Comment on lines +456 to +467
const novelMiddleware = customMiddleware.filter(
(middleware) => !defaultMiddlewareNames.has(middleware.name),
);

// Apply profile middleware exclusions.
let middleware: AgentMiddleware[] = [
...mergeMiddleware(
coreMiddleware,
customMiddleware.filter((middleware) =>
coreMiddlewareNames.has(middleware.name),
),
),
...novelMiddleware,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Novel duplicate middleware no longer deduplicates

This bypasses mergeMiddleware for custom names that do not match a default. As a result, middleware: [firstFoo, secondFoo] where both entries are named Foo now inserts both instances into the runtime stack, so both hooks execute. Before this split, mergeMiddleware(coreMiddleware, customMiddleware) applied the documented last-wins behavior to novel names as well. Deduplicate the novel subset by name (for example by merging it into an empty base) before spreading it into the stack.

(Refers to lines 456-467)


Your feedback helps Open SWE learn. React with 👍 or 👎 to tell us if this review comment was useful.

@hntrl
Hunter Lovell (hntrl) merged commit cc26c41 into main Jul 15, 2026
22 checks passed
@hntrl
Hunter Lovell (hntrl) deleted the hunter/middleware-merge-values branch July 15, 2026 02:08
@github-actions github-actions Bot mentioned this pull request Jul 15, 2026
Colin Francis (colifran) pushed a commit that referenced this pull request Jul 16, 2026
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
## deepagents@1.11.0

### Minor Changes

- [#671](#671)
[`6ae9d1e`](6ae9d1e)
Thanks [@hntrl](https://github.com/hntrl)! - feat(filesystem): add
allowlist for filesystem middleware tools

- [#669](#669)
[`4643148`](4643148)
Thanks [@hntrl](https://github.com/hntrl)! - feat(deepagents): add
structured system prompt configuration

- [#673](#673)
[`eb18c70`](eb18c70)
Thanks [@hntrl](https://github.com/hntrl)! - feat(backends): add delete
protocol support

Adds a `DeleteResult` type and optional backend `delete` method,
preserves delete through backend protocol adaptation, and implements
file deletion across the built-in state, store, filesystem, composite,
context hub, sandbox, and node-vfs backends.

### Patch Changes

- [#691](#691)
[`39a7049`](39a7049)
Thanks [@colifran](https://github.com/colifran)! - fix(deepagents):
backend adapter drops route prefixes

- [#672](#672)
[`cc26c41`](cc26c41)
Thanks [@hntrl](https://github.com/hntrl)! - fix(deepagents): allow
custom middleware to replace defaults by name
## deepagents-acp@0.1.19

### Patch Changes

- Updated dependencies
[[`39a7049`](39a7049),
[`6ae9d1e`](6ae9d1e),
[`cc26c41`](cc26c41),
[`4643148`](4643148),
[`eb18c70`](eb18c70)]:
  - deepagents@1.11.0
## @langchain/node-vfs@0.2.1

### Patch Changes

- [#673](#673)
[`eb18c70`](eb18c70)
Thanks [@hntrl](https://github.com/hntrl)! - feat(backends): add delete
protocol support

Adds a `DeleteResult` type and optional backend `delete` method,
preserves delete through backend protocol adaptation, and implements
file deletion across the built-in state, store, filesystem, composite,
context hub, sandbox, and node-vfs backends.
## @deepagents/evals@0.0.18

### Patch Changes

- Updated dependencies
[[`39a7049`](39a7049),
[`6ae9d1e`](6ae9d1e),
[`cc26c41`](cc26c41),
[`4643148`](4643148),
[`eb18c70`](eb18c70)]:
  - deepagents@1.11.0

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Hunter Lovell (hntrl) added a commit that referenced this pull request Jul 24, 2026
## Summary

Adds middleware override behavior to replace default middleware by
`.name` instead of always being appended.

## Changes

- Add name-keyed middleware merging so custom middleware replaces
matching default middleware in-place and appends novel middleware after
the core stack.
- Apply default-slot middleware overrides consistently when constructing
main-agent and subagent middleware stacks, while preventing parent-only
middleware from propagating unless it matches a subagent default slot.
- Move harness tool exclusion into a private `_ToolExclusionMiddleware`
helper so excluded tools are stripped after tool-injecting middleware
has run.
- Add coverage for main-agent replacement, subagent/default override
propagation, parent-only middleware isolation, profile exclusions,
tool-exclusion ordering, and merge precedence.
Hunter Lovell (hntrl) pushed a commit that referenced this pull request Jul 24, 2026
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
## deepagents@1.11.0

### Minor Changes

- [#671](#671)
[`6ae9d1e`](6ae9d1e)
Thanks [@hntrl](https://github.com/hntrl)! - feat(filesystem): add
allowlist for filesystem middleware tools

- [#669](#669)
[`4643148`](4643148)
Thanks [@hntrl](https://github.com/hntrl)! - feat(deepagents): add
structured system prompt configuration

- [#673](#673)
[`eb18c70`](eb18c70)
Thanks [@hntrl](https://github.com/hntrl)! - feat(backends): add delete
protocol support

Adds a `DeleteResult` type and optional backend `delete` method,
preserves delete through backend protocol adaptation, and implements
file deletion across the built-in state, store, filesystem, composite,
context hub, sandbox, and node-vfs backends.

### Patch Changes

- [#691](#691)
[`39a7049`](39a7049)
Thanks [@colifran](https://github.com/colifran)! - fix(deepagents):
backend adapter drops route prefixes

- [#672](#672)
[`cc26c41`](cc26c41)
Thanks [@hntrl](https://github.com/hntrl)! - fix(deepagents): allow
custom middleware to replace defaults by name
## deepagents-acp@0.1.19

### Patch Changes

- Updated dependencies
[[`39a7049`](39a7049),
[`6ae9d1e`](6ae9d1e),
[`cc26c41`](cc26c41),
[`4643148`](4643148),
[`eb18c70`](eb18c70)]:
  - deepagents@1.11.0
## @langchain/node-vfs@0.2.1

### Patch Changes

- [#673](#673)
[`eb18c70`](eb18c70)
Thanks [@hntrl](https://github.com/hntrl)! - feat(backends): add delete
protocol support

Adds a `DeleteResult` type and optional backend `delete` method,
preserves delete through backend protocol adaptation, and implements
file deletion across the built-in state, store, filesystem, composite,
context hub, sandbox, and node-vfs backends.
## @deepagents/evals@0.0.18

### Patch Changes

- Updated dependencies
[[`39a7049`](39a7049),
[`6ae9d1e`](6ae9d1e),
[`cc26c41`](cc26c41),
[`4643148`](4643148),
[`eb18c70`](eb18c70)]:
  - deepagents@1.11.0

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant