Skip to content

fix(agents): prefer target agent's bound Matrix account for subagent spawns#67508

Merged
gumadeiras merged 24 commits intoopenclaw:mainfrom
lukeboyett:fix/matrix-bound-account-subagent-spawn-squashed
Apr 18, 2026
Merged

fix(agents): prefer target agent's bound Matrix account for subagent spawns#67508
gumadeiras merged 24 commits intoopenclaw:mainfrom
lukeboyett:fix/matrix-bound-account-subagent-spawn-squashed

Conversation

@lukeboyett
Copy link
Copy Markdown
Contributor

@lukeboyett lukeboyett commented Apr 16, 2026

Summary

Fixes Matrix (and other-channel) subagent spawns inheriting the caller's accountId instead of the target agent's bound account, and hardens resolveFirstBoundAccountId with kind-aware multi-tier matching for peer bindings.

  • src/agents/subagent-spawn.ts: adds resolveRequesterOriginForChild(...) that prefers the target agent's bound account via resolveFirstBoundAccountId({ cfg, channelId, agentId: targetAgentId, peerId, peerKind }) before falling back to the caller's accountId. Same-agent spawns short-circuit the lookup and preserve the caller's account. A new extractRequesterPeer helper peels known delivery-target prefixes (<channel>: namespace, then a generic <word>: loop) from agentTo to produce the raw peer id and — for channels whose plugin does not implement inferTargetChatType — infer peerKind from kind-prefixes (room:/channel:/chat: → channel, group:/team: → group, user:/dm:/pm: → direct) and id-embedded markers (Matrix !/@, IRC #). Id-embedded kind markers take precedence over prefix-derived kind so wrappers like room:@user:server classify correctly.
  • src/routing/bound-account-read.ts: resolveFirstBoundAccountId now accepts optional peerId and peerKind, and uses a four-tier precedence model:
    1. Exact peer id match (with kind cross-check when both sides declare one) wins immediately.
    2. Wildcard peer (peer.id: "*") match — only when the caller supplies a peer AND both sides declare a matching kind (treating group/channel as equivalent, mirroring peerKindMatches in resolve-route.ts).
    3. Channel-only binding (no peer) as the default fallback.
    4. Peerless last-resort fallback (first peer-specific or wildcard binding found) for callers that pass no peerId — preserves the pre-existing first-match semantics for cron delivery resolution.
  • Existing cron delivery-target.ts caller is unaffected: it still passes no peerId/peerKind, and the helper returns the same binding it would have before on realistic configs.

Why

A Matrix-bound parent session spawning a child for another agent could seed deliveryContext.accountId with the caller's account before target bindings were consulted. A child intended to post as the target agent's bound identity could end up posting as the caller — broken speaker identity in shared rooms, nondeterministic debugging, and wrong attribution in multi-agent deployments.

The original resolveFirstBoundAccountId also matched only on channel + agent, so multi-room-bound agents with different accounts per room got "first binding wins" regardless of active room. The peer-id/peer-kind aware matching fixes that while staying backward-compatible for callers that don't pass a peer (cron).

Regression coverage

Twelve unit tests in src/routing/bound-account-read.test.ts (new file) exercise the four-tier lookup: exact peer match, wildcard peer beats channel-only (with caller kind), channel-only beats wildcard (no caller kind), peer-specific fallback for peerless callers, non-matching peer skipped, channel mismatch, kind filtering, kind-unknown wildcard skip, exact id with unknown kind, group/channel equivalence, and the agent-on-different-channel no-match case.

Fifteen lifecycle tests in src/agents/openclaw-tools.subagents.sessions-spawn.lifecycle.test.ts (eleven new):

  1. Matrix room-bound route uses the target agent's bound account over the caller's.
  2. Peer-specific binding wins over channel-only binding for the same agent.
  3. Non-matching peer falls back to the channel-only binding.
  4. Wildcard peer binding matches any peer and beats channel-only.
  5. Exact peer binding wins over a wildcard peer binding.
  6. Same-agent subagent spawn preserves the caller's account (no re-resolution).
  7. Channel-side prefixes stripped from agentTo before lookup (Matrix room:<id>).
  8. <channel>:<kind>:<id> targets peel both prefixes (LINE line:group:<id>) and pick the group-kinded binding over a conflicting direct-kinded wildcard.
  9. conversation:<id> prefix stripped for Teams-style targets.
  10. Matrix room:@user:server classified as direct, not channel, so direct-peer bindings match.

Validation

  • pnpm build
  • pnpm check ✓ (typecheck, lint, import cycles, boundary checks)
  • pnpm test:changed ✓ (3777 passed on round 1)
  • Targeted vitest across all nine rounds ✓ (27/27 on current HEAD, 12 unit + 15 lifecycle)
  • Live Matrix readback on a downstream deployment (original round-1 fix): five bound target agents posted from their correct sender identities after rebuilt runtime.

Review iterations

This PR went through eight rounds of bot review (Codex + Greptile) before final approval. Commit history reflects each iteration:

Commit Addressed
5d11d7bb1e Initial fix (Matrix bound-account propagation)
5d0027479e Codex P1: wildcard * treated as literal → three-tier precedence
00b393064c Codex+Greptile P1s: same-agent spawn preserve caller; peerless wildcard; peerless peer-specific fallback
f8430fd70b Codex P1: drop peer.kind → kind-aware matching + plugin inference
d662dc529b Codex P1: unnormalized delivery-target prefixes → normalizeRequesterPeerId
3f673354a4 Three findings: LINE <channel>:<kind>:<id> parsing; peerless wildcard fallback restored; group/channel kind equivalence
173827d6a9 Codex P1: Teams conversation:<id> → generic ^[a-z][a-z0-9_-]*: peeler
249b292111 Codex P1: id-embedded kind markers override prefix-derived kind (Matrix room:@user → direct)

Final state: all twelve bot review threads resolved, Codex Didn't find any major issues on the current HEAD.

AI-assisted

Authored with Claude Code (Claude Opus 4.6, 1M-context). Fully tested locally. I've reviewed the change and understand what it does.

Related / prior art

Known-red CI

  • Install Smoke is red due to a pre-existing build-system gap (build:docker in package.json doesn't run scripts/write-npm-update-compat-sidecars.ts, unlike build-all.mjs). Root cause documented in this comment with a proposed one-line fix — happy to include here or split out per maintainer preference.
  • Run the GPT-5.4 / Opus 4.6 parity gate against the qa-lab mock is red and looks unrelated to this PR.

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps bot commented Apr 16, 2026

Greptile Summary

This PR fixes a bug where Matrix (and other-channel) subagent spawns inherited the caller's accountId instead of the target agent's bound account. It adds resolveRequesterOriginForChild in subagent-spawn.ts to look up the target agent's binding before falling back to the caller's account, and extends resolveFirstBoundAccountId in bound-account-read.ts with a four-tier peer-aware precedence model (exact peer → kind-matched wildcard → channel-only → peerless fallback). Both the algorithm and its edge-case handling are well reasoned. The previous reviewer concern about peerless callers regressing to undefined (cron delivery) is correctly addressed via peerlessPeerSpecificFallback.

Confidence Score: 5/5

Safe to merge — no P0 or P1 issues found; the bug fix is correct and comprehensively tested.

The four-tier precedence model in resolveFirstBoundAccountId is correctly implemented and backward-compatible with peerless cron callers. The prefix-peeling logic in extractRequesterPeer handles all documented delivery-target formats. The same-agent short-circuit and the fallback chain are sound. All previous reviewer concerns are addressed. Twenty-seven tests pass and the implementation was validated against a live Matrix deployment.

No files require special attention.

Reviews (2): Last reviewed commit: "fix(agents): let id-embedded kind marker..." | Re-trigger Greptile

Comment thread src/routing/bound-account-read.ts
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7a0506b007

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/agents/subagent-spawn.ts Outdated
Comment thread src/routing/bound-account-read.ts
@lukeboyett
Copy link
Copy Markdown
Contributor Author

@codex review

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 00b393064c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/routing/bound-account-read.ts
@lukeboyett
Copy link
Copy Markdown
Contributor Author

@codex review

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f8430fd70b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/agents/subagent-spawn.ts Outdated
@lukeboyett
Copy link
Copy Markdown
Contributor Author

@codex review

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d662dc529b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/agents/subagent-spawn.ts Outdated
Comment thread src/routing/bound-account-read.ts Outdated
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f3d8c0f635

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/agents/subagent-spawn.ts Outdated
Comment thread src/routing/bound-account-read.ts Outdated
@lukeboyett
Copy link
Copy Markdown
Contributor Author

@codex review

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f3d8c0f635

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/routing/bound-account-read.ts Outdated
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 3f673354a4

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/agents/subagent-spawn.ts Outdated
@lukeboyett
Copy link
Copy Markdown
Contributor Author

@codex review

@chatgpt-codex-connector
Copy link
Copy Markdown

Codex Review: Didn't find any major issues. 👍

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@lukeboyett
Copy link
Copy Markdown
Contributor Author

@codex review

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 173827d6a9

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/agents/subagent-spawn.ts Outdated
@lukeboyett
Copy link
Copy Markdown
Contributor Author

@codex review

@lukeboyett
Copy link
Copy Markdown
Contributor Author

lukeboyett commented Apr 16, 2026

Install Smoke root cause identified — pre-existing build-system gap, not from this PR.

dist/extensions/qa-channel/runtime-api.js is a hardcoded 109-byte compat stub produced by scripts/write-npm-update-compat-sidecars.ts. That step is listed in scripts/build-all.mjs (run by pnpm build) but is missing from the build:docker script in package.json (run by the CI Dockerfile). I verified by running the script directly — the file comes right back with the exact expected contents.

Why it surfaced here and not elsewhere: most recent main runs of the Install Smoke workflow have "conclusion":"skipped" — the preflight gates on changed-path scope and doesn't trigger install-smoke on typical commits. The files touched by this PR happen to fall in the smoke scope, so it actually executed and hit the longstanding gap. (Earlier hypothesis that our getChannelPlugin import in src/agents/subagent-spawn.ts caused this — retracted. The correlation with commit d662dc529b was coincidence: that commit is simply where the Dockerfile layer cache got invalidated and a fresh build:docker had to run, exposing the gap.)

Proposed one-line fix for package.json:

-    "build:docker": "node scripts/tsdown-build.mjs && node scripts/runtime-postbuild.mjs && node scripts/build-stamp.mjs && …",
+    "build:docker": "node scripts/tsdown-build.mjs && node scripts/runtime-postbuild.mjs && node --import tsx scripts/write-npm-update-compat-sidecars.ts && node scripts/build-stamp.mjs && …",

(Insert scripts/write-npm-update-compat-sidecars.ts between runtime-postbuild and build-stamp, matching the order in build-all.mjs.)

Happy to include that fix in this PR if you'd like — it's pure build-script, trivially reviewable, and gets Install Smoke green. Otherwise I'll leave this PR focused on the routing fix and file the build gap separately. Your call.

The CI Run the GPT-5.4 / Opus 4.6 parity gate against the qa-lab mock failure still looks unrelated to this PR.

@lukeboyett
Copy link
Copy Markdown
Contributor Author

@codex review

@chatgpt-codex-connector
Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Chef's kiss.

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@lukeboyett lukeboyett marked this pull request as draft April 16, 2026 15:39
@lukeboyett lukeboyett marked this pull request as ready for review April 16, 2026 16:34
lukeboyett and others added 20 commits April 18, 2026 14:01
… normalization

Addresses two new Codex P1s on the bound-account lookup path:

1. Strip channel prefix before generic target-kind prefixes
   (src/agents/subagent-spawn.ts)

   normalizeRequesterPeerId stripped a single generic prefix before the
   `<channel>:` namespace, so LINE delivery targets of the form
   `line:group:<id>` ended up as `group:<id>` instead of `<id>` and the
   exact peer-id binding was missed. The helper now peels the channel
   namespace first, then loops over generic prefixes (room:, channel:,
   chat:, user:, dm:, group:) until the raw peer id surfaces.

2. Enforce peer-kind safety for wildcard bindings when caller kind is
   unknown (src/routing/bound-account-read.ts)

   A `peer.id: "*"` binding with an incompatible kind (for example
   direct/*) could still be accepted when the caller did not supply a
   peerKind — channels whose plugin does not implement inferTargetChatType
   (such as Matrix) could then have room-originated spawns resolve to
   the wrong DM-bound account, which is worse than preserving the caller
   account. Wildcard matches now require both sides to declare a
   peer.kind and for the kinds to agree; otherwise the binding is
   skipped. Exact peer-id matches still require id equality, with a
   kind cross-check only when both sides declare a kind (peer ids are
   channel-unique).

   To preserve the existing Matrix-room happy path (the Matrix plugin
   does not expose inferTargetChatType), inferPeerKindForChannel gains a
   conservative fallback that recognizes `!`-prefixed room ids as
   "channel" and `@`-prefixed user ids as "direct", matching the
   existing `normalizeId` convention in extensions/matrix.

Regression coverage:

- src/routing/bound-account-read.test.ts:
  - Skips wildcard peer bindings when caller's peerKind is unknown.
  - Matches exact peer id even when caller's peerKind is unknown.
  - Updated prefers-wildcard-over-channel-only test to pass an explicit
    peerKind reflecting the new strict requirement.
- src/agents/openclaw-tools.subagents.sessions-spawn.lifecycle.test.ts:
  - sessions_spawn peels channel prefix then kind prefix for
    `<channel>:<kind>:<id>` targets — LINE-style `line:group:<id>`
    resolves to the binding configured on the raw peer id.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
…unt lookup

Addresses three further review findings:

1. Parse non-Matrix peer kinds before wildcard account lookup (P1)
   Channels like LINE emit `line:group:<id>` / `line:room:<id>` targets,
   but the Matrix-style heuristic only recognized `@`, `!`, and `#` so
   the kind was lost and wildcard bindings with a declared kind were
   skipped. subagent-spawn now uses a single `extractRequesterPeer`
   helper that tries the channel plugin first, then peels the channel
   namespace, then loops stripping kind-prefixes (`room:`/`channel:` →
   `channel`, `group:` → `group`, `user:`/`dm:` → `direct`, `chat:` →
   `channel`) — capturing the kind from the prefix as authoritative —
   before falling back to the id-only heuristic for Matrix/IRC shapes.

2. Allow wildcard bindings in peerless bound-account fallback (P2)
   Peerless callers (cron delivery resolution passes only
   `channelId`/`agentId`) were blocked by the strict wildcard kind
   safety, silently regressing configs that only declare wildcard peer
   bindings. Peerless callers now accept wildcard bindings as a last-
   resort fallback — the kind-safety rule only applies when the caller
   supplies a peer to verify against.

3. Treat `group` and `channel` peer kinds as equivalent (P1)
   Routing elsewhere (`peerKindMatches` in `src/routing/resolve-route.ts`)
   intentionally accepts group/channel as compatible so a binding
   declared as `peer.kind: "group"` resolves for callers inferred as
   `channel` (Matrix rooms, Mattermost/Slack channels) and vice versa.
   `resolveFirstBoundAccountId` now applies the same semantics in both
   the wildcard and exact-id kind-cross-check branches.

Regression coverage in src/routing/bound-account-read.test.ts:
- Treats group and channel peer kinds as equivalent (both directions).
- Accepts a wildcard peer binding as fallback for peerless callers.
- Skips wildcard peer bindings when the caller's peerKind is unknown.

Regression coverage in openclaw-tools.subagents.sessions-spawn.lifecycle.test.ts:
- sessions_spawn peels channel prefix then kind prefix for
  `<channel>:<kind>:<id>` targets (LINE `line:group:<id>` shape) and
  correctly picks the `group`-kinded binding over a `direct`-kinded
  wildcard binding for the same agent.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
MS Teams inbound context sets OriginatingTo to `conversation:<id>` while
route bindings key on the bare conversationId. The previous hand-rolled
prefix list (`room:`, `channel:`, `chat:`, `group:`, `user:`, `dm:`)
missed `conversation:` (and any future channel-specific namespacing), so
Teams cross-agent subagent spawns fell back to channel-only/caller
account and posted from the wrong identity.

extractRequesterPeer now uses a generic `^[a-z][a-z0-9_-]*:` regex to
peel any lowercase-alpha token-colon prefix, looping until the raw peer
id surfaces. Real-world peer ids never start with a lowercase-alpha
token followed by `:` (Matrix uses `!`/`@`, IRC `#`, Slack/Discord/LINE
alphanumerics, numeric Telegram/WhatsApp, or email-style `user@server`),
so this is safe. Known prefixes are mapped to ChatType for peerKind
inference (`conversation:`/`room:`/`channel:`/`chat:`/`thread:`/`topic:`
→ channel, `group:`/`team:` → group, `user:`/`dm:`/`pm:` → direct).

Regression test: sessions_spawn strips `conversation:` prefix for
Teams-style targets — a binding keyed on the raw conversation id
resolves correctly when the caller's `agentTo` is `conversation:<id>`.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Matrix thread delivery encodes per-user DM targets as `room:@user:server`
— the `room:` wrapper says "channel" but the embedded `@` id marker
says "direct". The previous extractRequesterPeer gated the `@`/`!`/`#`
heuristic on `!inferredKind`, so the prefix-derived kind won and a
direct-kinded peer binding on the same user id was rejected by the
kind-safety check in resolveFirstBoundAccountId. Cross-agent spawns
whose target was bound as a direct Matrix peer could fall back to the
caller account and send from the wrong identity.

The fix removes the `!inferredKind` guard so id-embedded kind markers
always have the final say — they are a more reliable signal than the
delivery-target wrapper, because channel-side prefixes can wrap either
a room or a user id.

Regression test: sessions_spawn classifies Matrix `room:@user` targets
as direct, not channel — the lifecycle suite now configures a
conflicting `channel`-kinded binding on the same user id and asserts
the `direct`-kinded binding wins when the caller's `agentTo` is
`room:@user:example.org`.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
@gumadeiras gumadeiras force-pushed the fix/matrix-bound-account-subagent-spawn-squashed branch from ec114e7 to 9300111 Compare April 18, 2026 18:01
@gumadeiras gumadeiras merged commit c39314c into openclaw:main Apr 18, 2026
9 checks passed
@gumadeiras
Copy link
Copy Markdown
Member

Merged via squash.

Thanks @lukeboyett!

ender-wiggin-ai pushed a commit to stroupaloop/openclaw that referenced this pull request Apr 18, 2026
…spawns (openclaw#67508)

Merged via squash.

Prepared head SHA: 9300111
Co-authored-by: lukeboyett <[email protected]>
Co-authored-by: gumadeiras <[email protected]>
Reviewed-by: @gumadeiras
Eruditi pushed a commit to Eruditi/openclaw that referenced this pull request Apr 19, 2026
…spawns (openclaw#67508)

Merged via squash.

Prepared head SHA: 9300111
Co-authored-by: lukeboyett <[email protected]>
Co-authored-by: gumadeiras <[email protected]>
Reviewed-by: @gumadeiras
Eruditi added a commit to Eruditi/openclaw that referenced this pull request Apr 19, 2026
…spawns (openclaw#67508)

Merged via squash.

Prepared head SHA: 9300111
Co-authored-by: lukeboyett <[email protected]>
Co-authored-by: gumadeiras <[email protected]>
Reviewed-by: @gumadeiras
Mquarmoc pushed a commit to Mquarmoc/openclaw that referenced this pull request Apr 20, 2026
…spawns (openclaw#67508)

Merged via squash.

Prepared head SHA: 9300111
Co-authored-by: lukeboyett <[email protected]>
Co-authored-by: gumadeiras <[email protected]>
Reviewed-by: @gumadeiras
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agents Agent runtime and tooling channel: discord Channel integration: discord channel: msteams Channel integration: msteams channel: slack Channel integration: slack size: XL

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants