Skip to content

feat(messaging): several apps per platform, Bind app shows every app's owner (#1110) - #1121

Merged
DoodleBears merged 4 commits into
mainfrom
claude/1110-several-apps
Oct 7, 2026
Merged

DoodleBears merged 4 commits into
mainfrom
claude/1110-several-apps

Conversation

@DoodleBears

@DoodleBears DoodleBears commented Oct 7, 2026 •

Copy link
Copy Markdown
Contributor

Requested by Vain · project thread

Closes #1110 · part of #1107 · ADR-0142 · stacked on #1120 (base switches to main once #1120 merges)

Before: a Bot could bind only one app per platform. Bind app greyed out a second Lark app, and nothing showed which Bot used which app.

After: one Bot can bind several apps of the same platform. Each app's DMs and @mentions reach the same Inbox, and replies go out through the app that received them. Bind app lists every connected app: apps a Bot already uses are greyed out and name that Bot (or say they are bound to this Bot), and disconnected apps say so. Manage app credentials in the dialog opens IM bots settings. External identities lists the Bot's apps sorted by platform.

How

  • Schema (gen 63). Drops messaging_binding_bot_platform. messaging_binding_account and messaging_binding_principal stay, so one app still belongs to one Bot.
  • Host.
    • The identity bind and the legacy authorize no longer check bot_slug = ? AND platform = ?.
    • The other per-platform lookups were reviewed: defaults, pairing receivers, approvals and group policy already work per binding or across all bindings of a platform.
    • The apps() projection lists each Provider account with boundBotSlug and bindingId; the snapshot's accounts reuse it.
    • Shared-source replies already pick the responder's entry for that conversation. Two apps in the group now refuse with reply-target-ambiguous, and a test locks this.
  • Client.
    • Bind app shows every account, disabled when bound or disconnected, with the owner Bot's display name in the hint. Free apps sort first.
    • The identity rows are sorted by platform.
    • Per review, the overview lives in Bind app rather than in Bot settings, so there is no separate IM apps settings item or bridge method.
  • Docs. External identities (zh/en) and CHANGELOG zh/en.

Screenshots

From a real Host with a simulated Lark provider exposing four apps. All variants: https://github.com/BotHarness/BotHarness/tree/claude/1110-several-apps/docs/assets/pr/1110-several-apps

zh light en dark
Two Lark apps on Ada
Bind app (opened from Bob) lists every app with its owner

Tests

  • messaging-several-apps.test.ts:
    • One Bot with two Lark apps: each DM gets its own entry on its own binding, and replies go out through the receiving app.
    • An app bound to Ada is refused to Bea with binding-conflict. apps() and Bea's snapshot show the owner, and the owner changes after unbind and rebind.
    • A shared reply works with one app and refuses with reply-target-ambiguous once the responder has two apps in the group.
  • messaging-several-apps-migration.test.ts: before gen 63 a second same-platform app is refused; after it, the app is accepted, while a second Bot still cannot take the same app.
  • Client test: Bind app lists the free app first, then this Bot's app and another Bot's app disabled with their labels.
  • Full suite: 374 files / 3088 tests pass. tsc, lint, oxfmt and pnpm changelog:check are clean.

Real Host (DSH 0.2.0-rc.1, OpenCode Go model):

  • Ada bound a second Lark app. Binding Bob's app to Ada was refused with binding-conflict.
  • A DM to Ada's second app got a real reply through that app in 4 s.
  • Bob's Bind app showed the free app first, Ada's two apps as "used by Ada" and Bob's own as "already bound to this Bot".

Merge risk

Human verification

  1. Connect two Lark apps under Settings → IM bots and bind both to one Bot. DM each app; both reach the Inbox, and each reply comes from the app you wrote to.
  2. Open another Bot's Bind app. Both apps are listed, greyed out, and say which Bot uses them.

🤖 Generated with Claude Code

https://claude.ai/code/session_01WXjBatxGTRyRSxZYeJpqgH


Generated by Claude Code

Summary by CodeRabbit

  • New Features
    • A Bot can now bind multiple apps from the same platform. Their direct messages and mentions appear in the shared inbox, and replies are sent through the app that received the message.
    • The app-binding list shows which Bot uses each app and whether it is connected. Apps already bound or disconnected can’t be selected.
  • Bug Fixes
    • Replies in shared channels are declined when a Bot has multiple apps in that channel, avoiding ambiguity about which app should reply.

claude added 2 commits October 7, 2026 15:27
…llow again (#1109)

The app's Conversations list in Edit identity sorts entries into Waiting,
Active, Muted and Blocked. Mute admits silently, Rules reuses the group
reception editor, Block revokes the entry, cancels unsent replies and
writes a durable block per Bot, app fingerprint and conversation that
survives restart and rebind; Allow again creates a fresh entry with no
backfill. New conversations can be admitted automatically or held for
the user, and new entries are bounded to 20 per hour and 500 active per
app with at most 200 held.

Issue: #1109
Agent-Task: claude-code/cloud/session_01WXjBatxGTRyRSxZYeJpqgH
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WXjBatxGTRyRSxZYeJpqgH
A Bot can now bind several apps of the same platform; one app still
belongs to one Bot. Generation 63 drops messaging_binding_bot_platform
and the bind and authorize commands no longer refuse a second app of a
platform. A new apps projection lists every Provider account with its
bound Bot; Bind app hides apps another Bot uses, External identities
groups apps by platform, and Bot settings gets an IM apps list that
refreshes on roster changes. Shared replies from a Bot with two apps in
the same group refuse with reply-target-ambiguous.

Issue: #1110
Agent-Task: claude-code/cloud/session_01WXjBatxGTRyRSxZYeJpqgH
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WXjBatxGTRyRSxZYeJpqgH
@DoodleBears DoodleBears self-assigned this Oct 7, 2026
@coderabbitai

coderabbitai Bot commented Oct 7, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Note

Currently processing new changes in this PR. This may take a few minutes, please wait...

⚙️ Run configuration
  • Configuration used: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 412171c9-a7f6-4678-98ef-1811294c23d5
📥 Commits

Reviewing files that changed from the base of the PR and between d78e769 and 7c31ed3.

📒 Files selected for processing (21)
  • CHANGELOG.md
  • CHANGELOG.zh.md
  • docs/assets/pr/1110-several-apps/README.md
  • docs/assets/pr/1110-several-apps/bind-all-en-dark.webp
  • docs/assets/pr/1110-several-apps/bind-all-en-light.webp
  • docs/assets/pr/1110-several-apps/bind-all-zh-dark.webp
  • docs/assets/pr/1110-several-apps/bind-all-zh-light.webp
  • docs/assets/pr/1110-several-apps/identities-en-dark.webp
  • docs/assets/pr/1110-several-apps/identities-en-light.webp
  • docs/assets/pr/1110-several-apps/identities-zh-dark.webp
  • docs/assets/pr/1110-several-apps/identities-zh-light.webp
  • docs/channel-sidebar/external-identities.md
  • docs/channel-sidebar/external-identities.zh.md
  • packages/client/src/client/external-entries.tsx
  • packages/client/src/client/external-identity-list.tsx
  • packages/client/src/client/locale.ts
  • packages/client/test/external-identity-list.test.ts
  • packages/core/src/database/schema-plan.ts
  • packages/core/src/messaging/outbound.ts
  • packages/core/test/messaging-several-apps-migration.test.ts
  • packages/core/test/messaging-several-apps.test.ts
 ____________________
< Expecto bugtronum! >
 --------------------
  \
   \   \
        \ /\
        ( )
      .( o ).
✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Per review, the app overview lives where apps are chosen. Bind app now
lists every connected app: apps a Bot already uses are disabled and name
that Bot (or say they are bound to this Bot), disconnected apps say so,
and Manage app credentials opens IM bots settings. The IM apps list in
Bot settings and its messagingApps bridge method are removed; the
snapshot's accounts already carry the owner.

Issue: #1110
Agent-Task: claude-code/cloud/session_01WXjBatxGTRyRSxZYeJpqgH
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WXjBatxGTRyRSxZYeJpqgH
@DoodleBears DoodleBears changed the title feat(messaging): several apps per platform and the IM apps list (#1110) feat(messaging): several apps per platform, Bind app shows every app's owner (#1110) Oct 7, 2026
# Conflicts:
#	CHANGELOG.md
#	CHANGELOG.zh.md
#	packages/client/src/client/external-entries.tsx
#	packages/client/src/client/external-identity-list.tsx
#	packages/client/src/client/locale.ts
#	packages/client/test/external-identity-list.test.ts
#	packages/core/src/database/schema-plan.ts
@DoodleBears
DoodleBears changed the base branch from claude/1109-conversation-list to main October 7, 2026 17:11
@DoodleBears
DoodleBears merged commit 3408994 into main Oct 7, 2026
1 of 2 checks passed
@DoodleBears
DoodleBears deleted the claude/1110-several-apps branch October 28, 2026 04:24
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.

Several apps per platform and the IM apps list

2 participants