Skip to content

Add native Devin ACP community distribution - #1

Merged
fenner888 merged 21 commits into
mainfrom
agent/native-devin-acp-community
Jul 27, 2026
Merged

Add native Devin ACP community distribution#1
fenner888 merged 21 commits into
mainfrom
agent/native-devin-acp-community

Conversation

@fenner888

@fenner888 fenner888 commented Jul 26, 2026

Copy link
Copy Markdown
Owner

Purpose

This is the full community-fork integration for builders who want to exercise
Cognition's official Devin CLI in Buzz before the focused upstream preset
merges.

The upstream-compatible contribution is intentionally kept separate and small:
block/buzz#3225. This fork PR also
contains community policy, compatibility handling, distribution isolation,
release tooling, and detailed validation records that do not belong in that
upstream proposal.

What changed

  • add the official devin acp CLI as a catalog-driven native ACP runtime
  • keep KnownAcpRuntime as the single source of runtime capability facts
  • distinguish CLI missing, unauthenticated, ready, and ACP startup-failure states
  • add Devin authentication guidance, the white-background Devin mark, and
    catalog-projected frontend metadata
  • preserve default-model behavior and owner-only invocation
  • keep permission decisions explicit and fail closed
  • prevent duplicate visible publication and retry behavior
  • harden managed-process restart and descendant cleanup
  • isolate the fork's application identity, Keychain service, Nest directory,
    deep-link scheme, and CLI link
  • add a source-first macOS, Linux, and Windows builder preview
  • document installation, rollback, uninstall, security boundaries, live
    acceptance, and upstream patch boundaries

Security and product boundaries

  • Buzz does not redistribute or modify the Devin CLI.
  • Each builder installs and authenticates Cognition's official CLI with their
    own account.
  • No credentials or Devin configuration are copied, inspected, or modified.
  • No bypass or persistent auto-approval mode is enabled.
  • New agents remain one-worker and owner-only by default.
  • This does not claim model switching, Fusion, fan-out, Outposts, cloud handoff,
    or cloud Devin parity.
  • The source preview has no updater and uses no signing credentials.

Validation

  • complete local just ci gate passes
  • focused runtime catalog, normalization, readiness, discovery, permission,
    publication, restart, and regression tests pass
  • desktop frontend production build and Tauri native test suite pass
  • Apple Silicon source preparation and isolated package lifecycle pass
  • live Apple Silicon Devin ACP DM and channel publication pass
  • two separate macOS user contexts prove isolated identities, authenticated
    runtimes, owner-only invocation, allowlist behavior, revocation denial, and
    process cleanup

The current GitHub Actions matrix for the latest commit is:
https://github.com/fenner888/BuzzforDevin/actions/runs/30313919465

Distribution status

This remains a draft because it is the full fork review surface, not the small
upstream merge proposal.

The public testing path is an immutable source-only technical alpha. There
is no unsigned downloadable application. Apple Silicon has completed live
acceptance. Intel macOS, Linux, and Windows are experimental until a real
builder completes the documented Devin ACP acceptance on each host.

Start with
docs/buzz-for-devin-builders.md.

Record the refreshed public-upstream base, local commit split, completed validation, and the remaining submission and release-only gates without representing any push or publication as complete.
Record the DCO-signed commit IDs and draft block/buzz submission without representing review or acceptance as complete.
fenner888 pushed a commit that referenced this pull request Jul 27, 2026
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [@radix-ui/react-alert-dialog](https://radix-ui.com/primitives)
([source](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/alert-dialog))
| [`1.1.19` →
`1.1.23`](https://renovatebot.com/diffs/npm/@radix-ui%2freact-alert-dialog/1.1.19/1.1.23)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@radix-ui%2freact-alert-dialog/1.1.23?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@radix-ui%2freact-alert-dialog/1.1.19/1.1.23?slim=true)
|
| [@radix-ui/react-checkbox](https://radix-ui.com/primitives)
([source](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/checkbox))
| [`1.3.7` →
`1.3.11`](https://renovatebot.com/diffs/npm/@radix-ui%2freact-checkbox/1.3.7/1.3.11)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@radix-ui%2freact-checkbox/1.3.11?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@radix-ui%2freact-checkbox/1.3.7/1.3.11?slim=true)
|
| [@radix-ui/react-dialog](https://radix-ui.com/primitives)
([source](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/dialog))
| [`1.1.19` →
`1.1.23`](https://renovatebot.com/diffs/npm/@radix-ui%2freact-dialog/1.1.19/1.1.23)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@radix-ui%2freact-dialog/1.1.23?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@radix-ui%2freact-dialog/1.1.19/1.1.23?slim=true)
|
| [@radix-ui/react-dismissable-layer](https://radix-ui.com/primitives)
([source](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/dismissable-layer))
| [`1.1.15` →
`1.1.19`](https://renovatebot.com/diffs/npm/@radix-ui%2freact-dismissable-layer/1.1.15/1.1.19)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@radix-ui%2freact-dismissable-layer/1.1.19?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@radix-ui%2freact-dismissable-layer/1.1.15/1.1.19?slim=true)
|
| [@radix-ui/react-dropdown-menu](https://radix-ui.com/primitives)
([source](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/dropdown-menu))
| [`2.1.20` →
`2.1.24`](https://renovatebot.com/diffs/npm/@radix-ui%2freact-dropdown-menu/2.1.20/2.1.24)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@radix-ui%2freact-dropdown-menu/2.1.24?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@radix-ui%2freact-dropdown-menu/2.1.20/2.1.24?slim=true)
|
| [@radix-ui/react-focus-scope](https://radix-ui.com/primitives)
([source](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/focus-scope))
| [`1.1.12` →
`1.1.16`](https://renovatebot.com/diffs/npm/@radix-ui%2freact-focus-scope/1.1.12/1.1.16)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@radix-ui%2freact-focus-scope/1.1.16?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@radix-ui%2freact-focus-scope/1.1.12/1.1.16?slim=true)
|
| [@radix-ui/react-popover](https://radix-ui.com/primitives)
([source](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/popover))
| [`1.1.19` →
`1.1.23`](https://renovatebot.com/diffs/npm/@radix-ui%2freact-popover/1.1.19/1.1.23)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@radix-ui%2freact-popover/1.1.23?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@radix-ui%2freact-popover/1.1.19/1.1.23?slim=true)
|
| [@radix-ui/react-separator](https://radix-ui.com/primitives)
([source](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/separator))
| [`1.1.11` →
`1.1.15`](https://renovatebot.com/diffs/npm/@radix-ui%2freact-separator/1.1.11/1.1.15)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@radix-ui%2freact-separator/1.1.15?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@radix-ui%2freact-separator/1.1.11/1.1.15?slim=true)
|
| [@radix-ui/react-slot](https://radix-ui.com/primitives)
([source](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/slot))
| [`1.3.0` →
`1.3.3`](https://renovatebot.com/diffs/npm/@radix-ui%2freact-slot/1.3.0/1.3.3)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@radix-ui%2freact-slot/1.3.3?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@radix-ui%2freact-slot/1.3.0/1.3.3?slim=true)
|
| [@radix-ui/react-tabs](https://radix-ui.com/primitives)
([source](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/tabs))
| [`1.1.17` →
`1.1.21`](https://renovatebot.com/diffs/npm/@radix-ui%2freact-tabs/1.1.17/1.1.21)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@radix-ui%2freact-tabs/1.1.21?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@radix-ui%2freact-tabs/1.1.17/1.1.21?slim=true)
|
| [@radix-ui/react-toggle](https://radix-ui.com/primitives)
([source](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/toggle))
| [`1.1.14` →
`1.1.18`](https://renovatebot.com/diffs/npm/@radix-ui%2freact-toggle/1.1.14/1.1.18)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@radix-ui%2freact-toggle/1.1.18?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@radix-ui%2freact-toggle/1.1.14/1.1.18?slim=true)
|
| [@radix-ui/react-tooltip](https://radix-ui.com/primitives)
([source](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/tooltip))
| [`1.2.12` →
`1.2.16`](https://renovatebot.com/diffs/npm/@radix-ui%2freact-tooltip/1.2.12/1.2.16)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@radix-ui%2freact-tooltip/1.2.16?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@radix-ui%2freact-tooltip/1.2.12/1.2.16?slim=true)
|

---

> [!WARNING]
> Some dependencies could not be looked up. Check the [Dependency
Dashboard](../issues/1) for more information.

---

### Release Notes

<details>
<summary>radix-ui/primitives
(@&#8203;radix-ui/react-alert-dialog)</summary>

###
[`v1.1.23`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/alert-dialog/CHANGELOG.md#1123)

- Reverted breaking changes that caused compatibility issues with React
Server Components.
- Updated dependencies: `@radix-ui/react-compose-refs@1.1.5`,
`@radix-ui/react-context@1.2.2`, `@radix-ui/react-dialog@1.1.23`,
`@radix-ui/react-primitive@2.1.10`

###
[`v1.1.22`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/alert-dialog/CHANGELOG.md#1122)

- Updated dependencies: `@radix-ui/react-dialog@1.1.22`,
`@radix-ui/react-primitive@2.1.9`

###
[`v1.1.21`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/alert-dialog/CHANGELOG.md#1121)

- Republish through CI to attach provenance attestations. The previous
versions of these packages were published manually outside of CI and
therefore shipped without provenance; this patch re-releases the same
code through the CI pipeline so every package includes an attestation.
- Updated dependencies: `@radix-ui/primitive@1.1.7`,
`@radix-ui/react-compose-refs@1.1.4`, `@radix-ui/react-context@1.2.1`,
`@radix-ui/react-dialog@1.1.21`, `@radix-ui/react-primitive@2.1.8`

###
[`v1.1.20`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/alert-dialog/CHANGELOG.md#1120)

- Improved tree-shaking so bundlers can drop unused components.
Component parts are now marked `/* @&#8203;__PURE__ */` and use named
render functions instead of `Component.displayName = ...` assignments,
which previously prevented dead-code elimination with some bundlers.
- Updated dependencies: `@radix-ui/react-dialog@1.1.20`,
`@radix-ui/primitive@1.1.6`, `@radix-ui/react-compose-refs@1.1.3`,
`@radix-ui/react-context@1.2.0`, `@radix-ui/react-primitive@2.1.7`

</details>

<details>
<summary>radix-ui/primitives (@&#8203;radix-ui/react-checkbox)</summary>

###
[`v1.3.11`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/checkbox/CHANGELOG.md#1311)

- Reverted breaking changes that caused compatibility issues with React
Server Components.
- Updated dependencies: `@radix-ui/react-compose-refs@1.1.5`,
`@radix-ui/react-context@1.2.2`, `@radix-ui/react-presence@1.1.10`,
`@radix-ui/react-primitive@2.1.10`,
`@radix-ui/react-use-controllable-state@1.2.6`,
`@radix-ui/react-use-size@1.1.4`

###
[`v1.3.10`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/checkbox/CHANGELOG.md#1310)

- Updated dependencies: `@radix-ui/react-primitive@2.1.9`

###
[`v1.3.9`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/checkbox/CHANGELOG.md#139)

- Republish through CI to attach provenance attestations. The previous
versions of these packages were published manually outside of CI and
therefore shipped without provenance; this patch re-releases the same
code through the CI pipeline so every package includes an attestation.
- Updated dependencies: `@radix-ui/primitive@1.1.7`,
`@radix-ui/react-compose-refs@1.1.4`, `@radix-ui/react-context@1.2.1`,
`@radix-ui/react-presence@1.1.9`, `@radix-ui/react-primitive@2.1.8`,
`@radix-ui/react-use-controllable-state@1.2.5`,
`@radix-ui/react-use-size@1.1.3`

###
[`v1.3.8`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/checkbox/CHANGELOG.md#138)

- Improved tree-shaking so bundlers can drop unused components.
Component parts are now marked `/* @&#8203;__PURE__ */` and use named
render functions instead of `Component.displayName = ...` assignments,
which previously prevented dead-code elimination with some bundlers.
- Fixed a bug where updating a `Checkbox`, `Switch`, or `RadioGroup`
value programmatically (eg. a "select all" control) while inside a
`<form>` would dispatch a `click` event from the hidden bubble input
that propagated to ancestor `onClick` handlers.
- Updated dependencies: `@radix-ui/react-presence@1.1.8`,
`@radix-ui/react-use-controllable-state@1.2.4`,
`@radix-ui/primitive@1.1.6`, `@radix-ui/react-compose-refs@1.1.3`,
`@radix-ui/react-context@1.2.0`, `@radix-ui/react-primitive@2.1.7`,
`@radix-ui/react-use-size@1.1.2`

</details>

<details>
<summary>radix-ui/primitives (@&#8203;radix-ui/react-dialog)</summary>

###
[`v1.1.23`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/dialog/CHANGELOG.md#1123)

- Reverted breaking changes that caused compatibility issues with React
Server Components.
- Updated dependencies: `@radix-ui/react-compose-refs@1.1.5`,
`@radix-ui/react-context@1.2.2`,
`@radix-ui/react-dismissable-layer@1.1.19`,
`@radix-ui/react-focus-guards@1.1.6`,
`@radix-ui/react-focus-scope@1.1.16`, `@radix-ui/react-id@1.1.4`,
`@radix-ui/react-portal@1.1.17`, `@radix-ui/react-presence@1.1.10`,
`@radix-ui/react-primitive@2.1.10`, `@radix-ui/react-slot@1.3.3`,
`@radix-ui/react-use-controllable-state@1.2.6`,
`@radix-ui/react-use-layout-effect@1.1.4`

###
[`v1.1.22`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/dialog/CHANGELOG.md#1122)

- Updated dependencies: `@radix-ui/react-slot@1.3.2`,
`@radix-ui/react-primitive@2.1.9`,
`@radix-ui/react-dismissable-layer@1.1.18`,
`@radix-ui/react-focus-scope@1.1.15`, `@radix-ui/react-portal@1.1.16`

###
[`v1.1.21`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/dialog/CHANGELOG.md#1121)

- Republish through CI to attach provenance attestations. The previous
versions of these packages were published manually outside of CI and
therefore shipped without provenance; this patch re-releases the same
code through the CI pipeline so every package includes an attestation.
- Updated dependencies: `@radix-ui/primitive@1.1.7`,
`@radix-ui/react-compose-refs@1.1.4`, `@radix-ui/react-context@1.2.1`,
`@radix-ui/react-dismissable-layer@1.1.17`,
`@radix-ui/react-focus-guards@1.1.5`,
`@radix-ui/react-focus-scope@1.1.14`, `@radix-ui/react-id@1.1.3`,
`@radix-ui/react-portal@1.1.15`, `@radix-ui/react-presence@1.1.9`,
`@radix-ui/react-primitive@2.1.8`, `@radix-ui/react-slot@1.3.1`,
`@radix-ui/react-use-controllable-state@1.2.5`,
`@radix-ui/react-use-layout-effect@1.1.3`

###
[`v1.1.20`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/dialog/CHANGELOG.md#1120)

- Fixed broken ARIA references in Dialogs where a title or description
elements are not rendered.
- Improved tree-shaking so bundlers can drop unused components.
Component parts are now marked `/* @&#8203;__PURE__ */` and use named
render functions instead of `Component.displayName = ...` assignments,
which previously prevented dead-code elimination with some bundlers.
- Updated dependencies: `@radix-ui/react-dismissable-layer@1.1.16`,
`@radix-ui/react-focus-scope@1.1.13`, `@radix-ui/react-portal@1.1.14`,
`@radix-ui/react-presence@1.1.8`,
`@radix-ui/react-use-controllable-state@1.2.4`,
`@radix-ui/primitive@1.1.6`, `@radix-ui/react-compose-refs@1.1.3`,
`@radix-ui/react-context@1.2.0`, `@radix-ui/react-focus-guards@1.1.4`,
`@radix-ui/react-id@1.1.2`, `@radix-ui/react-primitive@2.1.7`,
`@radix-ui/react-slot@1.3.0`, `@radix-ui/react-use-layout-effect@1.1.2`

</details>

<details>
<summary>radix-ui/primitives
(@&#8203;radix-ui/react-dismissable-layer)</summary>

###
[`v1.1.19`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/dismissable-layer/CHANGELOG.md#1119)

- Reverted breaking changes that caused compatibility issues with React
Server Components.
- Updated dependencies: `@radix-ui/react-compose-refs@1.1.5`,
`@radix-ui/react-primitive@2.1.10`,
`@radix-ui/react-use-callback-ref@1.1.4`,
`@radix-ui/react-use-effect-event@0.0.5`

###
[`v1.1.18`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/dismissable-layer/CHANGELOG.md#1118)

- Updated dependencies: `@radix-ui/react-primitive@2.1.9`

###
[`v1.1.17`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/dismissable-layer/CHANGELOG.md#1117)

- Republish through CI to attach provenance attestations. The previous
versions of these packages were published manually outside of CI and
therefore shipped without provenance; this patch re-releases the same
code through the CI pipeline so every package includes an attestation.
- Updated dependencies: `@radix-ui/primitive@1.1.7`,
`@radix-ui/react-compose-refs@1.1.4`, `@radix-ui/react-primitive@2.1.8`,
`@radix-ui/react-use-callback-ref@1.1.3`,
`@radix-ui/react-use-effect-event@0.0.4`

###
[`v1.1.16`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/dismissable-layer/CHANGELOG.md#1116)

- Improved tree-shaking so bundlers can drop unused components.
Component parts are now marked `/* @&#8203;__PURE__ */` and use named
render functions instead of `Component.displayName = ...` assignments,
which previously prevented dead-code elimination with some bundlers.
- Updated dependencies: `@radix-ui/primitive@1.1.6`,
`@radix-ui/react-compose-refs@1.1.3`, `@radix-ui/react-primitive@2.1.7`,
`@radix-ui/react-use-callback-ref@1.1.2`,
`@radix-ui/react-use-effect-event@0.0.3`

</details>

<details>
<summary>radix-ui/primitives
(@&#8203;radix-ui/react-dropdown-menu)</summary>

###
[`v2.1.24`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/dropdown-menu/CHANGELOG.md#2124)

- Reverted breaking changes that caused compatibility issues with React
Server Components.
- Updated dependencies: `@radix-ui/react-compose-refs@1.1.5`,
`@radix-ui/react-context@1.2.2`, `@radix-ui/react-id@1.1.4`,
`@radix-ui/react-menu@2.1.24`, `@radix-ui/react-primitive@2.1.10`,
`@radix-ui/react-use-controllable-state@1.2.6`

###
[`v2.1.23`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/dropdown-menu/CHANGELOG.md#2123)

- Updated dependencies: `@radix-ui/react-menu@2.1.23`,
`@radix-ui/react-primitive@2.1.9`

###
[`v2.1.22`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/dropdown-menu/CHANGELOG.md#2122)

- Republish through CI to attach provenance attestations. The previous
versions of these packages were published manually outside of CI and
therefore shipped without provenance; this patch re-releases the same
code through the CI pipeline so every package includes an attestation.
- Updated dependencies: `@radix-ui/primitive@1.1.7`,
`@radix-ui/react-compose-refs@1.1.4`, `@radix-ui/react-context@1.2.1`,
`@radix-ui/react-id@1.1.3`, `@radix-ui/react-menu@2.1.22`,
`@radix-ui/react-primitive@2.1.8`,
`@radix-ui/react-use-controllable-state@1.2.5`

###
[`v2.1.21`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/dropdown-menu/CHANGELOG.md#2121)

- Improved tree-shaking so bundlers can drop unused components.
Component parts are now marked `/* @&#8203;__PURE__ */` and use named
render functions instead of `Component.displayName = ...` assignments,
which previously prevented dead-code elimination with some bundlers.
- Updated dependencies: `@radix-ui/react-menu@2.1.21`,
`@radix-ui/react-use-controllable-state@1.2.4`,
`@radix-ui/primitive@1.1.6`, `@radix-ui/react-compose-refs@1.1.3`,
`@radix-ui/react-context@1.2.0`, `@radix-ui/react-id@1.1.2`,
`@radix-ui/react-primitive@2.1.7`

</details>

<details>
<summary>radix-ui/primitives
(@&#8203;radix-ui/react-focus-scope)</summary>

###
[`v1.1.16`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/focus-scope/CHANGELOG.md#1116)

- Reverted breaking changes that caused compatibility issues with React
Server Components.
- Updated dependencies: `@radix-ui/react-compose-refs@1.1.5`,
`@radix-ui/react-primitive@2.1.10`,
`@radix-ui/react-use-callback-ref@1.1.4`

###
[`v1.1.15`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/focus-scope/CHANGELOG.md#1115)

- Updated dependencies: `@radix-ui/react-primitive@2.1.9`

###
[`v1.1.14`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/focus-scope/CHANGELOG.md#1114)

- Republish through CI to attach provenance attestations. The previous
versions of these packages were published manually outside of CI and
therefore shipped without provenance; this patch re-releases the same
code through the CI pipeline so every package includes an attestation.
- Updated dependencies: `@radix-ui/react-compose-refs@1.1.4`,
`@radix-ui/react-primitive@2.1.8`,
`@radix-ui/react-use-callback-ref@1.1.3`

###
[`v1.1.13`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/focus-scope/CHANGELOG.md#1113)

- Improved tree-shaking so bundlers can drop unused components.
Component parts are now marked `/* @&#8203;__PURE__ */` and use named
render functions instead of `Component.displayName = ...` assignments,
which previously prevented dead-code elimination with some bundlers.
- Updated dependencies: `@radix-ui/react-compose-refs@1.1.3`,
`@radix-ui/react-primitive@2.1.7`,
`@radix-ui/react-use-callback-ref@1.1.2`

</details>

<details>
<summary>radix-ui/primitives (@&#8203;radix-ui/react-popover)</summary>

###
[`v1.1.23`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/popover/CHANGELOG.md#1123)

- Reverted breaking changes that caused compatibility issues with React
Server Components.
- Updated dependencies: `@radix-ui/react-compose-refs@1.1.5`,
`@radix-ui/react-context@1.2.2`,
`@radix-ui/react-dismissable-layer@1.1.19`,
`@radix-ui/react-focus-guards@1.1.6`,
`@radix-ui/react-focus-scope@1.1.16`, `@radix-ui/react-id@1.1.4`,
`@radix-ui/react-popper@1.3.7`, `@radix-ui/react-portal@1.1.17`,
`@radix-ui/react-presence@1.1.10`, `@radix-ui/react-primitive@2.1.10`,
`@radix-ui/react-slot@1.3.3`,
`@radix-ui/react-use-controllable-state@1.2.6`

###
[`v1.1.22`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/popover/CHANGELOG.md#1122)

- Updated dependencies: `@radix-ui/react-slot@1.3.2`,
`@radix-ui/react-primitive@2.1.9`,
`@radix-ui/react-dismissable-layer@1.1.18`,
`@radix-ui/react-focus-scope@1.1.15`, `@radix-ui/react-popper@1.3.6`,
`@radix-ui/react-portal@1.1.16`

###
[`v1.1.21`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/popover/CHANGELOG.md#1121)

- Republish through CI to attach provenance attestations. The previous
versions of these packages were published manually outside of CI and
therefore shipped without provenance; this patch re-releases the same
code through the CI pipeline so every package includes an attestation.
- Updated dependencies: `@radix-ui/primitive@1.1.7`,
`@radix-ui/react-compose-refs@1.1.4`, `@radix-ui/react-context@1.2.1`,
`@radix-ui/react-dismissable-layer@1.1.17`,
`@radix-ui/react-focus-guards@1.1.5`,
`@radix-ui/react-focus-scope@1.1.14`, `@radix-ui/react-id@1.1.3`,
`@radix-ui/react-popper@1.3.5`, `@radix-ui/react-portal@1.1.15`,
`@radix-ui/react-presence@1.1.9`, `@radix-ui/react-primitive@2.1.8`,
`@radix-ui/react-slot@1.3.1`,
`@radix-ui/react-use-controllable-state@1.2.5`,
`@radix-ui/react-use-layout-effect@1.1.3`

###
[`v1.1.20`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/popover/CHANGELOG.md#1120)

- Improved tree-shaking so bundlers can drop unused components.
Component parts are now marked `/* @&#8203;__PURE__ */` and use named
render functions instead of `Component.displayName = ...` assignments,
which previously prevented dead-code elimination with some bundlers.
- Updated dependencies: `@radix-ui/react-popper@1.3.4`,
`@radix-ui/react-dismissable-layer@1.1.16`,
`@radix-ui/react-focus-scope@1.1.13`, `@radix-ui/react-portal@1.1.14`,
`@radix-ui/react-presence@1.1.8`,
`@radix-ui/react-use-controllable-state@1.2.4`,
`@radix-ui/primitive@1.1.6`, `@radix-ui/react-compose-refs@1.1.3`,
`@radix-ui/react-context@1.2.0`, `@radix-ui/react-focus-guards@1.1.4`,
`@radix-ui/react-id@1.1.2`, `@radix-ui/react-primitive@2.1.7`,
`@radix-ui/react-slot@1.3.0`

</details>

<details>
<summary>radix-ui/primitives
(@&#8203;radix-ui/react-separator)</summary>

###
[`v1.1.15`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/separator/CHANGELOG.md#1115)

- Reverted breaking changes that caused compatibility issues with React
Server Components.
- Updated dependencies: `@radix-ui/react-primitive@2.1.10`

###
[`v1.1.14`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/separator/CHANGELOG.md#1114)

- Updated dependencies: `@radix-ui/react-primitive@2.1.9`

###
[`v1.1.13`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/separator/CHANGELOG.md#1113)

- Republish through CI to attach provenance attestations. The previous
versions of these packages were published manually outside of CI and
therefore shipped without provenance; this patch re-releases the same
code through the CI pipeline so every package includes an attestation.
- Updated dependencies: `@radix-ui/react-primitive@2.1.8`

###
[`v1.1.12`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/separator/CHANGELOG.md#1112)

- Improved tree-shaking so bundlers can drop unused components.
Component parts are now marked `/* @&#8203;__PURE__ */` and use named
render functions instead of `Component.displayName = ...` assignments,
which previously prevented dead-code elimination with some bundlers.
- Updated dependencies: `@radix-ui/react-primitive@2.1.7`

</details>

<details>
<summary>radix-ui/primitives (@&#8203;radix-ui/react-slot)</summary>

###
[`v1.3.3`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/slot/CHANGELOG.md#132-133)

- Reverted breaking changes that caused compatibility issues with React
Server Components.

###
[`v1.3.2`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/slot/CHANGELOG.md#132-133)

- Reverted breaking changes that caused compatibility issues with React
Server Components.

###
[`v1.3.1`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/slot/CHANGELOG.md#131)

- Republish through CI to attach provenance attestations. The previous
versions of these packages were published manually outside of CI and
therefore shipped without provenance; this patch re-releases the same
code through the CI pipeline so every package includes an attestation.
- Updated dependencies: `@radix-ui/primitive@1.1.7`,
`@radix-ui/react-compose-refs@1.1.4`

</details>

<details>
<summary>radix-ui/primitives (@&#8203;radix-ui/react-tabs)</summary>

###
[`v1.1.21`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/tabs/CHANGELOG.md#1121)

- Reverted breaking changes that caused compatibility issues with React
Server Components.
- Updated dependencies: `@radix-ui/react-context@1.2.2`,
`@radix-ui/react-direction@1.1.4`, `@radix-ui/react-id@1.1.4`,
`@radix-ui/react-presence@1.1.10`, `@radix-ui/react-primitive@2.1.10`,
`@radix-ui/react-roving-focus@1.1.19`,
`@radix-ui/react-use-controllable-state@1.2.6`

###
[`v1.1.20`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/tabs/CHANGELOG.md#1120)

- Updated dependencies: `@radix-ui/react-primitive@2.1.9`,
`@radix-ui/react-roving-focus@1.1.18`

###
[`v1.1.19`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/tabs/CHANGELOG.md#1119)

- Republish through CI to attach provenance attestations. The previous
versions of these packages were published manually outside of CI and
therefore shipped without provenance; this patch re-releases the same
code through the CI pipeline so every package includes an attestation.
- Updated dependencies: `@radix-ui/primitive@1.1.7`,
`@radix-ui/react-context@1.2.1`, `@radix-ui/react-direction@1.1.3`,
`@radix-ui/react-id@1.1.3`, `@radix-ui/react-presence@1.1.9`,
`@radix-ui/react-primitive@2.1.8`,
`@radix-ui/react-roving-focus@1.1.17`,
`@radix-ui/react-use-controllable-state@1.2.5`

###
[`v1.1.18`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/tabs/CHANGELOG.md#1118)

- Improved tree-shaking so bundlers can drop unused components.
Component parts are now marked `/* @&#8203;__PURE__ */` and use named
render functions instead of `Component.displayName = ...` assignments,
which previously prevented dead-code elimination with some bundlers.
- Updated dependencies: `@radix-ui/react-presence@1.1.8`,
`@radix-ui/react-roving-focus@1.1.16`,
`@radix-ui/react-use-controllable-state@1.2.4`,
`@radix-ui/primitive@1.1.6`, `@radix-ui/react-context@1.2.0`,
`@radix-ui/react-direction@1.1.2`, `@radix-ui/react-id@1.1.2`,
`@radix-ui/react-primitive@2.1.7`

</details>

<details>
<summary>radix-ui/primitives (@&#8203;radix-ui/react-toggle)</summary>

###
[`v1.1.18`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/toggle/CHANGELOG.md#1118)

- Reverted breaking changes that caused compatibility issues with React
Server Components.
- Updated dependencies: `@radix-ui/react-primitive@2.1.10`,
`@radix-ui/react-use-controllable-state@1.2.6`

###
[`v1.1.17`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/toggle/CHANGELOG.md#1117)

- Updated dependencies: `@radix-ui/react-primitive@2.1.9`

###
[`v1.1.16`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/toggle/CHANGELOG.md#1116)

- Republish through CI to attach provenance attestations. The previous
versions of these packages were published manually outside of CI and
therefore shipped without provenance; this patch re-releases the same
code through the CI pipeline so every package includes an attestation.
- Updated dependencies: `@radix-ui/primitive@1.1.7`,
`@radix-ui/react-primitive@2.1.8`,
`@radix-ui/react-use-controllable-state@1.2.5`

###
[`v1.1.15`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/toggle/CHANGELOG.md#1115)

- Improved tree-shaking so bundlers can drop unused components.
Component parts are now marked `/* @&#8203;__PURE__ */` and use named
render functions instead of `Component.displayName = ...` assignments,
which previously prevented dead-code elimination with some bundlers.
- Updated dependencies: `@radix-ui/react-use-controllable-state@1.2.4`,
`@radix-ui/primitive@1.1.6`, `@radix-ui/react-primitive@2.1.7`

</details>

<details>
<summary>radix-ui/primitives (@&#8203;radix-ui/react-tooltip)</summary>

###
[`v1.2.16`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/tooltip/CHANGELOG.md#1216)

- Reverted breaking changes that caused compatibility issues with React
Server Components.
- Updated dependencies: `@radix-ui/react-compose-refs@1.1.5`,
`@radix-ui/react-context@1.2.2`,
`@radix-ui/react-dismissable-layer@1.1.19`, `@radix-ui/react-id@1.1.4`,
`@radix-ui/react-popper@1.3.7`, `@radix-ui/react-portal@1.1.17`,
`@radix-ui/react-presence@1.1.10`, `@radix-ui/react-primitive@2.1.10`,
`@radix-ui/react-slot@1.3.3`,
`@radix-ui/react-use-controllable-state@1.2.6`,
`@radix-ui/react-use-layout-effect@1.1.4`,
`@radix-ui/react-visually-hidden@1.2.11`

###
[`v1.2.15`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/tooltip/CHANGELOG.md#1215)

- Updated dependencies: `@radix-ui/react-slot@1.3.2`,
`@radix-ui/react-primitive@2.1.9`,
`@radix-ui/react-dismissable-layer@1.1.18`,
`@radix-ui/react-popper@1.3.6`, `@radix-ui/react-portal@1.1.16`,
`@radix-ui/react-visually-hidden@1.2.10`

###
[`v1.2.14`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/tooltip/CHANGELOG.md#1214)

- Republish through CI to attach provenance attestations. The previous
versions of these packages were published manually outside of CI and
therefore shipped without provenance; this patch re-releases the same
code through the CI pipeline so every package includes an attestation.
- Updated dependencies: `@radix-ui/primitive@1.1.7`,
`@radix-ui/react-compose-refs@1.1.4`, `@radix-ui/react-context@1.2.1`,
`@radix-ui/react-dismissable-layer@1.1.17`, `@radix-ui/react-id@1.1.3`,
`@radix-ui/react-popper@1.3.5`, `@radix-ui/react-portal@1.1.15`,
`@radix-ui/react-presence@1.1.9`, `@radix-ui/react-primitive@2.1.8`,
`@radix-ui/react-slot@1.3.1`,
`@radix-ui/react-use-controllable-state@1.2.5`,
`@radix-ui/react-use-layout-effect@1.1.3`,
`@radix-ui/react-visually-hidden@1.2.9`

###
[`v1.2.13`](https://github.com/radix-ui/primitives/blob/HEAD/packages/react/tooltip/CHANGELOG.md#1213)

- Fixed a bug where `Tooltip.Content` children were mounted to the DOM
twice.
- Improved tree-shaking so bundlers can drop unused components.
Component parts are now marked `/* @&#8203;__PURE__ */` and use named
render functions instead of `Component.displayName = ...` assignments,
which previously prevented dead-code elimination with some bundlers.
- Updated dependencies: `@radix-ui/react-popper@1.3.4`,
`@radix-ui/react-dismissable-layer@1.1.16`,
`@radix-ui/react-portal@1.1.14`, `@radix-ui/react-presence@1.1.8`,
`@radix-ui/react-visually-hidden@1.2.8`,
`@radix-ui/react-use-controllable-state@1.2.4`,
`@radix-ui/primitive@1.1.6`, `@radix-ui/react-compose-refs@1.1.3`,
`@radix-ui/react-context@1.2.0`, `@radix-ui/react-id@1.1.2`,
`@radix-ui/react-primitive@2.1.7`, `@radix-ui/react-slot@1.3.0`,
`@radix-ui/react-use-layout-effect@1.1.2`

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - Between 12:00 AM and 03:59 AM, only on Monday (`* 0-3 * * 1`)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/block/buzz).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yODAuMCIsInVwZGF0ZWRJblZlciI6IjQzLjI4MC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
fenner888 added 11 commits July 27, 2026 08:33
Document the partial second-user proof, current upstream draft head, refreshed validation counts, and remaining release gates without treating the local rehearsal as release approval.
Agent discovery queried kind:10100, which is an agent's channel-add policy
and carries none of the directory metadata the caller needs. The authoritative
public projection of an agent's identity and inbound-author policy is
kind:30177, so an allowlisted identity could never resolve the agent it had
been granted access to.

Project the directory from kind:30177 instead, taking the agent's public key
from the parameterized replaceable event's `d` tag rather than from content —
a content-supplied key is not authoritative. Build a narrow output object with
only the fields the frontend consumes so later additions to the record cannot
cross this boundary implicitly.

Co-authored-by: Mark Fenner <markfenner57@yahoo.com>
Signed-off-by: Mark Fenner <markfenner57@yahoo.com>
Mention autocomplete filtered candidates against the locally managed agent
set, so an agent owned by someone else was dropped even when the directory
showed the current user on its allowlist. Filter against the eligible set
instead, which is the managed agents plus the relay agents shared with this
user.

Rename isAgentIdentityInManagedList to isAgentIdentityInEligibleSet so the
predicate name matches what it now decides; the members sidebar keeps passing
its managed-only set and is unaffected.

Co-authored-by: Mark Fenner <markfenner57@yahoo.com>
Signed-off-by: Mark Fenner <markfenner57@yahoo.com>
The profile panel is an instance view: it shows the agent's own public key,
runtime state, and stop/restart controls. Its Edit action nonetheless opened
the definition editor whenever the agent was definition-linked, so a change to
"Who can talk to this agent" was written to the definition. A definition's
behavior group is copied onto an instance only when a new instance is minted
from it, and update_persona propagates only display_name and avatar_url to
instances that already exist. The instance kept the policy it had.

Because the inbound-author gate is built from the instance record at spawn,
the dialog could show an allowlist that the running agent did not enforce. The
failure is bidirectional and worse for revocation: an owner who removed an
identity would believe access was revoked while the agent kept honouring the
previous policy.

Route an instance-backed profile to the instance editor via
resolveProfileEditTarget, so the policy on display is the policy in force.
Definition editing is unaffected: the agent library actions menu still opens
it directly, and the instance editor keeps its linked-definition hop.

Also make the instance editor submit its own respond-to state rather than
diffing against the agent prop. The dialog stays mounted while managed-agent
polling can replace that prop, so local form state is the only reliable
snapshot of what the user is saving; Rust validates the merged policy and the
retention layer suppresses unchanged relay publications.

Co-authored-by: Mark Fenner <markfenner57@yahoo.com>
Signed-off-by: Mark Fenner <markfenner57@yahoo.com>
The instance record retains its allowlist across mode toggles on purpose, so
an owner can switch away from allowlist mode and back without retyping
entries. That retention leaked onto the wire: agent_event_content published
respond_to_allowlist unconditionally, so after revoking access the kind:30177
projection still advertised the removed pubkey next to
"respond_to":"owner-only".

Exclude the allowlist from the projection unless the mode is Allowlist. This
matches the field's documented contract, the definition side already does the
same in apply_persona_behavior for the same reason, and spawn agrees, since
build_respond_to_env emits no allowlist variable for other modes.

Access control was never affected. The stale entry granted nothing and did not
restore the agent to the revoked identity's autocomplete, because
relayAgentIsSharedWithUser gates on the mode before consulting membership. The
defect was that a revoked association stayed publicly readable.

Co-authored-by: Mark Fenner <markfenner57@yahoo.com>
Signed-off-by: Mark Fenner <markfenner57@yahoo.com>
Cognition's documentation frames Devin Desktop as an ACP host that launches
agents and injects environment into them. ACP_BACKEND=windsurf is part of that
host-side state: it tells a spawned "devin acp" that its host is Devin Desktop
and therefore supplies credentials over ACP.

When Buzz is the host that claim is false, and inheriting the variable — for
instance when Buzz is launched from a terminal running inside Devin Desktop —
makes the adapter announce that the ACP host is the sole source of credentials
and refuse the stored CLI credentials. Every turn then fails with
"-32000 ACP host has not authenticated" even though devin auth login succeeded.
With the variable absent the same binary falls back to env vars and stored CLI
credentials, and turns succeed.

The leak also corrupted readiness: devin auth status reported "Not logged in"
while contaminated and "Logged in (via Devin)" without it.

Scrub it alongside WINDSURF_API_KEY. One entry covers all three consumers of
that list — process launch, the login/readiness probe, and runtime discovery —
so invocation and readiness are fixed together. Verified in a packaged build:
the desktop process carried ACP_BACKEND while the Devin harness it spawned did
not.

Co-authored-by: Mark Fenner <markfenner57@yahoo.com>
Signed-off-by: Mark Fenner <markfenner57@yahoo.com>
Record what the two-context allowlist pass actually established, and the
defects it surfaced, so none of it is lost between passes.

The allowlist row now passes: the allowlisted identity resolved the agent
through the kind:30177 directory, its channel mention passed the inbound gate,
and the turn published one reply. Revocation is recorded as partial on purpose
— the record, projection, and spawn environment all returned to owner-only,
but only after a restart, and the revoked identity did not re-attempt an
invocation, so the denial is inferred from the enforced spawn environment
rather than observed.

Document that the gate reads the instance record and not the definition, that
revocation is effective only on restart and why that is left unfixed here,
that non-allowlist modes must not republish a retained allowlist, and that
inherited ACP host state must not reach the adapter.

Withdraw the claim that auth_probe_args probes the wrong credential store. It
does not: the probe reported "Not logged in" only because it inherited
ACP_BACKEND, and it passes the same scrub list, so an uncontaminated probe
reads exactly the store the adapter falls back to.

Co-authored-by: Mark Fenner <markfenner57@yahoo.com>
Signed-off-by: Mark Fenner <markfenner57@yahoo.com>
… gap

The revoked identity attempted an invocation and was denied, so the allowlist
removal row now passes rather than being inferred from the spawn environment.

Record the gap that test exposed. Revoking on an instance does not revoke on
its definition: both records hold an independent inbound-author policy behind
separate editors, and after the instance was set back to owner-only the
definition still held the revoked identity in its allowlist, locally and in its
published kind:30175. Since a definition's behavior group is copied onto every
newly minted instance, the next agent created from it would have silently
re-granted access. Clearing the definition removed it from both the record and
the published event, which also confirms apply_persona_behavior clears the list
correctly for non-allowlist modes.

This is the same instance-versus-definition split as the profile routing
defect, seen from the other side. Revocation should either propagate or say
plainly that it has not; until then it is incomplete until both records are
checked.

Co-authored-by: Mark Fenner <markfenner57@yahoo.com>
Signed-off-by: Mark Fenner <markfenner57@yahoo.com>
The revocation test already exercised this row: with agent A back on
owner-only, identity B attempted an invocation and was denied. Record it rather
than leaving it open for a test that has effectively already run.

Co-authored-by: Mark Fenner <markfenner57@yahoo.com>
Signed-off-by: Mark Fenner <markfenner57@yahoo.com>
The directory projection accepted "nobody" and forwarded it verbatim.
RelayAgentInfo deserializes respond_to into RespondTo, which deliberately has
no nobody variant because the desktop exposes no surface for it, so a single
validly signed event carrying that mode failed the whole Vec and every other
agent vanished from discovery.

Project only the modes RespondTo can represent. An unrepresentable mode becomes
absent, and every eligibility check treats absent as not-invocable, so the
projection degrades closed rather than either crashing or over-granting.

Also record two things the review of this branch surfaced. The stale-allowlist
section now separates the finding from its implemented disposition instead of
still reading as open. And the allowlisted-agent autocomplete change is
documented as a deliberate fork divergence from block/buzz a4dfead (block#2149),
which moved upstream the other way on purpose; it is excluded from the upstream
series and needs a maintainer decision before it is ever proposed. Its upstream
E2E test passes here only because that fixture agent is not a channel member,
so green CI must not be read as upstream agreement.

Co-authored-by: Mark Fenner <markfenner57@yahoo.com>
Signed-off-by: Mark Fenner <markfenner57@yahoo.com>
…ts own module

The directory projection and its tests pushed nostr_convert.rs past its
file-size ratchet. Raising the limit is the wrong response: the ratchet exists
to stop exactly this growth, and an authorization-facing projection does not
belong buried among the generic event converters.

Move it to nostr_convert/managed_agents.rs. nostr_convert.rs drops from 1167 to
1014 lines, under its 1126 limit, and the projection gets an obvious home with
its three regression tests beside it. No behaviour change.

Co-authored-by: Mark Fenner <markfenner57@yahoo.com>
Signed-off-by: Mark Fenner <markfenner57@yahoo.com>
fenner888 pushed a commit that referenced this pull request Jul 27, 2026
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [react](https://react.dev/)
([source](https://github.com/react/react/tree/HEAD/packages/react))
| [`19.2.7` →
`19.2.8`](https://renovatebot.com/diffs/npm/react/19.2.7/19.2.8) |
![age](https://developer.mend.io/api/mc/badges/age/npm/react/19.2.8?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/react/19.2.7/19.2.8?slim=true)
|
| [react-dom](https://react.dev/)
([source](https://github.com/react/react/tree/HEAD/packages/react-dom))
| [`19.2.7` →
`19.2.8`](https://renovatebot.com/diffs/npm/react-dom/19.2.7/19.2.8) |
![age](https://developer.mend.io/api/mc/badges/age/npm/react-dom/19.2.8?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/react-dom/19.2.7/19.2.8?slim=true)
|

---

> [!WARNING]
> Some dependencies could not be looked up. Check the [Dependency
Dashboard](../issues/1) for more information.

---

### Release Notes

<details>
<summary>react/react (react)</summary>

###
[`v19.2.8`](https://github.com/react/react/compare/v19.2.7...1dd4ecbdabf826f527fc9a58c05ea70375b7d170)

[Compare
Source](https://github.com/react/react/compare/v19.2.7...v19.2.8)

</details>

<details>
<summary>react/react (react-dom)</summary>

###
[`v19.2.8`](https://github.com/react/react/compare/v19.2.7...1dd4ecbdabf826f527fc9a58c05ea70375b7d170)

[Compare
Source](https://github.com/react/react/compare/v19.2.7...v19.2.8)

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - Between 12:00 AM and 03:59 AM, only on Monday (`* 0-3 * * 1`)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/block/buzz).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yODAuMCIsInVwZGF0ZWRJblZlciI6IjQzLjI4MC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
fenner888 pushed a commit that referenced this pull request Jul 27, 2026
…lock#3058)

This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [org.jetbrains.kotlin.android](https://kotlinlang.org/)
([source](https://github.com/JetBrains/kotlin)) | `2.2.20` →
`2.2.21` |
![age](https://developer.mend.io/api/mc/badges/age/maven/org.jetbrains.kotlin.android:org.jetbrains.kotlin.android.gradle.plugin/2.2.21?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/org.jetbrains.kotlin.android:org.jetbrains.kotlin.android.gradle.plugin/2.2.20/2.2.21?slim=true)
|

---

> [!WARNING]
> Some dependencies could not be looked up. Check the [Dependency
Dashboard](../issues/1) for more information.

---

### Release Notes

<details>
<summary>JetBrains/kotlin (org.jetbrains.kotlin.android)</summary>

###
[`v2.2.21`](https://github.com/JetBrains/kotlin/releases/tag/v2.2.21):
Kotlin 2.2.21

#### Changelog

##### Backend. Wasm

- [`KT-81372`](https://youtrack.jetbrains.com/issue/KT-81372) K/Wasm:
JsException: Exception was thrown while running JavaScript code on
Safari 18.2/18.3
- [`KT-80018`](https://youtrack.jetbrains.com/issue/KT-80018) K/Wasm:
exceptions don't work properly in JavaScriptCore (vm inside Safari,
WebKit)

##### Compiler

- [`KT-81191`](https://youtrack.jetbrains.com/issue/KT-81191) K2: "null
cannot be cast to non-null type ConeTypeParameterLookupTag" with invalid
code
- [`KT-80936`](https://youtrack.jetbrains.com/issue/KT-80936)
NON\_PUBLIC\_CALL\_FROM\_PUBLIC\_INLINE : `@PublishedApi` doesn't work
for fun interfaces

##### JavaScript

- [`KT-79926`](https://youtrack.jetbrains.com/issue/KT-79926) Wrong
export of interfaces with companions with ES Modules
- [`KT-81424`](https://youtrack.jetbrains.com/issue/KT-81424) Kotlin/JS:
Cannot Get / in a simple running application
- [`KT-80873`](https://youtrack.jetbrains.com/issue/KT-80873) KJS:
Stdlib requires ES2020-compatible JS engine due to BigInt type literal

##### Native

- [`KT-79384`](https://youtrack.jetbrains.com/issue/KT-79384) K/N:
Application Not Responding: Thread Deadlock

##### Tools. Gradle

- [`KT-79047`](https://youtrack.jetbrains.com/issue/KT-79047) Gradle
compileKotlin fails with configuration cache
- [`KT-81148`](https://youtrack.jetbrains.com/issue/KT-81148) Publishing
helpers in KGP are incompatible with Isolated Projects
- [`KT-80950`](https://youtrack.jetbrains.com/issue/KT-80950) KGP breaks
configuration cache when signing plugin with GnuPG is applied

##### Tools. Gradle. Multiplatform

- [`KT-61127`](https://youtrack.jetbrains.com/issue/KT-61127) Remove
scoped resolvable and intransitive DependenciesMetadata configurations
used in the pre-IdeMultiplatformImport IDE import
- [`KT-81249`](https://youtrack.jetbrains.com/issue/KT-81249) Kotlin
2.2.20 broke KMP implementation of Parcelize

##### Tools. Gradle. Native

- [`KT-81510`](https://youtrack.jetbrains.com/issue/KT-81510)
`commonizeCInterop` exception with 'kotlinNativeBundleConfiguration' not
found
- [`KT-81134`](https://youtrack.jetbrains.com/issue/KT-81134) Native:
Gradle configuration failure likely related to Klibs cross-compilation
- [`KT-77732`](https://youtrack.jetbrains.com/issue/KT-77732)
`commonizeCInterop` failed with "Unresolved classifier:
platform/posix/size\_t"
- [`KT-80675`](https://youtrack.jetbrains.com/issue/KT-80675) Commonized
cinterops between "test" compilations produce an import failure

##### Tools. Maven

- [`KT-81218`](https://youtrack.jetbrains.com/issue/KT-81218) Kotlin
Maven Plugin 2.2.20: Java classes not resolved with enabled incremental
compilation without daemon

##### Tools. Wasm

- [`KT-80582`](https://youtrack.jetbrains.com/issue/KT-80582) Multiple
reloads when using webpack dev server after 2.2.20-Beta2

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - Between 12:00 AM and 03:59 AM, only on Monday (`* 0-3 * * 1`)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/block/buzz).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yODAuMCIsInVwZGF0ZWRJblZlciI6IjQzLjI4MC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Signed-off-by: Mark Fenner <markfenner57@yahoo.com>
Signed-off-by: Mark Fenner <markfenner57@yahoo.com>
@fenner888
fenner888 marked this pull request as ready for review July 27, 2026 23:54
@fenner888
fenner888 merged commit e3ce70f into main Jul 27, 2026
51 of 52 checks passed

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Devin Review found 1 potential issue.

Open in Devin Review

Comment on lines +1070 to +1081
// Kind:30177 carries identity + inbound-author policy; 10100 is channel-add.
let events = query_relay(
&state,
&[serde_json::json!({
"kinds": [10100],
"kinds": [buzz_core_pkg::kind::KIND_MANAGED_AGENT],
})],
)
.await?;

// The convert helper returns `{"agents": [...]}`. Extract and re-deserialize
// into the strongly-typed `Vec<RelayAgentInfo>` the frontend expects.
let value = nostr_convert::agents_from_events(&events);
let value = nostr_convert::managed_agents_from_events(&events);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🔍 Relay-agent directory switched from kind:10100 to kind:30177 drops channel_ids, affecting "anyone"-mode discovery

list_relay_agents now queries KIND_MANAGED_AGENT (30177) via managed_agents_from_events instead of kind:10100 via agents_from_events (desktop/src-tauri/src/commands/agent_discovery.rs:1070-1081). The old agents_from_events (desktop/src-tauri/src/nostr_convert.rs:472-477) preserved channel_ids from the event content, whereas the new managed_agents_from_events (desktop/src-tauri/src/nostr_convert/managed_agents.rs:62-72) hardcodes "channel_ids": [] and "status": "offline".

This is the intended enabler for allowlist-based discovery (the projection now carries respond_to/respond_to_allowlist, and relayAgentIsSharedWithUser's allowlist branch at desktop/src/features/agents/lib/agentAutocompleteEligibility.ts:21-25 does not need channel IDs). However, the "anyone"-mode branch (agentAutocompleteEligibility.ts:27-30) relies on agent.channelIds intersecting shared channels. With channel_ids now always empty, an anyone-mode relay agent that was previously discoverable via a shared channel will no longer be added to the mentionable set, and any relay agent that publishes only 10100 (not 30177) disappears from the directory entirely. The stale comment at agentAutocompleteEligibility.ts:87 still refers to "kind:10100". The fork docs emphasize the allowlist path but do not appear to address this "anyone"/channel-membership discovery change — worth confirming it is intended and covered.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

fenner888 pushed a commit that referenced this pull request Jul 31, 2026
…3813)

## What

Clearing an edit to empty and hitting accept now **deletes the message**
instead of hanging. One of Sam's frequent workflows is to delete a
message by editing it, clearing the text, and pressing Enter — which
previously no-op'd (a deliberate guard blocked empty edits).

## How

Pure client-side wiring — **no relay, schema, or Rust changes.**

1. **`MessageComposer.tsx`** — the edit path had a guard that *blocked*
empty edits (`if (!trimmed && !hasMedia) return;`). That guard is simply
**removed**, so empty content flows through the normal edit path to
`onEditSave("", [], [])`. `buildOutgoingMessage("")` is a safe no-op.
2. **`handleEditSave` in `useChannelPaneHandlers.ts`** — when an edit is
submitted with empty text and no media tags, it exits edit mode and
opens the **same "Delete message?" confirmation** the Delete menu action
shows, rather than publishing an empty edit.
3. **`DeleteMessageConfirmDialog.tsx`** — the confirmation dialog,
extracted into **one shared component**. `MessageActionBar` renders it
for the Delete menu action (previously inline), and `ChannelScreen`
renders it for the empty-edit path. No duplicated dialog UI. **Delete**
runs the existing `deleteMutate`; **Cancel** leaves the message
untouched.

Because both the main timeline and the thread panel already route
edit-save through `handleEditSave`, this covers both surfaces with a
single dialog at the `ChannelScreen` level — no per-composer plumbing.

- Image-only edits (empty text but attachments present) still publish
normally — only a *fully* empty edit prompts to delete.
- An empty edit can never publish an empty body: `handleEditSave`
returns before the edit mutation.

## Review history

This PR was reworked three times in response to review — each pass made
it smaller:

1. First cut wrapped this in a new "Delete message?" `AlertDialog`
rendered from a composer hook — a verbatim duplicate of the confirmation
already in `MessageActionBar.tsx`. Removed.
2. Second cut threaded a dedicated `onDeleteEditTarget` callback down
`ChannelScreen → ChannelPane → MessageComposer / MessageThreadPanel`.
Also redundant — the delete decision moved entirely into
`handleEditSave`, which every edit-save already flows through.
3. Third cut added a special-case empty branch to the composer, which
pushed `MessageComposer.tsx` over the file-size ratchet and led to an
unrelated emoji-helper extraction to make room. Both gone: deleting the
pre-existing guard (rather than adding a branch) is net-negative, so
there's no ratchet pressure and **nothing emoji-related in this PR**.
`MessageComposer.types.ts` is back to baseline too.
4. Fourth pass (this one): an unconfirmed, no-undo delete was too sharp.
The empty-edit path now routes through the same **"Delete message?"
confirmation** as the menu action — shared as one
`DeleteMessageConfirmDialog` component (so it's reuse, not the duplicate
dialog from cut #1).

## Testing

- **E2E:** `desktop/tests/e2e/empty-edit-delete.spec.ts` (Playwright,
smoke project), three tests, all passing locally:
- *clearing an edit to empty prompts to delete, then deletes on confirm*
— edits the mock identity's own `#general` message, clears it, Enter →
the **"Delete message?"** dialog appears; Delete → the row disappears
and edit mode exits.
- *cancelling the empty-edit delete keeps the message* — same up to the
dialog, then Cancel → the message survives.
- *a non-empty edit still edits and never deletes* — guards the other
direction (no dialog).
- `pnpm typecheck`, biome, file-size + px-text guards all clean; full
desktop unit suite (3847 tests) passing locally.

> Heads-up for the reviewer: pushed with `--no-verify` because the
pre-push hook runs the Rust **integration** suite, which needs Docker
(Postgres/Redis) that isn't available in this environment — it doesn't
apply to this desktop-only change. CI runs the real gates.

---

🐝 Built by Bumble in Buzz, from a conversation in #test-swesterman.

---------

Signed-off-by: Sam Westerman <swesterman@squareup.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.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