Repository navigation
Commit 4773ef6
An app's account can belong to the team (#757)
* Pin shared brokered accounts with failing tests before building them
Tests for the account holder, the audience check, the account-mode switch,
the shared-use inbox and the app screens. They fail until the code lands.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Document Shared apps, who may use them, and what changes on upgrade
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Format the shared-account tests
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Record brokered accounts with an explicit holder, and give each app a Personal or Shared mode
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Decide whose account a brokered call reaches in one place
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Let a handoff carry where its run started, and accept every root in handed-over work
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Audit a Shared app's calls as reached by the deployment
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Read shared accounts, approvals and requests in the app, and let an account row carry its own heading
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Migrate Composio connections into brokered_connections and give every account-holding app a mode
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Write down who may steer a run that uses a shared account
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Carry where a run started through every handoff, and read it strictly from a signed run
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Tell the broker whose account it acts for, and let it name the account it holds
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Declare the audit events for shared accounts and mode switches
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Resolve the account a brokered call acts for from the row, never the request
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Add the app pieces for approving, requesting and switching shared accounts
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Ask Composio about an account by its holder's vendor id, and read only its published display name
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Check a brokered connection by holder and call the vendor under the account's stored id
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Store shared-account approvals and requests, and gate each shared call on them
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Let an administrator share an app's account and approve who may use it through each Bot
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Show people when a Bot acts as the team account in Settings
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Tell owners when widening a Bot needs an administrator, and show administrators the requests
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Call the broker by account holder throughout the adapter tests
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Read and write one brokered account's row by its holder
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Give administrators one place to answer requests to use a shared account
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Approve a wider Bot inline for administrators, and say what is missing for owners
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Add the Personal or Shared control to an app's admin page
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Check against the live API that a deployment identity is accepted
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Confirm, connect with a key and re-check an account by its holder, naming who acted
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Say what publishing, assigning, a trigger or making a Bot public means for its shared apps
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Show each Bot's shared-account approval on the app's admin page
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Count the account-mode calls in the mutation refresh roster
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Record the administrator who most recently connected a shared account
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* End one brokered account by its holder, and name whose it was in the audit
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Offboard a person from their own brokered accounts only, never the deployment's
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Let only an administrator confirm, re-check or end a Shared app's account
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Start a newly enabled brokered app as Personal, and never reset a Shared one on re-add
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Connect a Shared app's team account only as an administrator, and return them to the admin page
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Revoke every account on a removed brokered app, the deployment's included
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Expose each Shared app's team account, its name and who connected it, to readers
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Move the remaining fake brokers to ConnectedAppBroker
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Refuse a shared call from a run its approval does not cover, and fail closed without a gate
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* List Shared apps as the deployment's in GET /connections
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Let a memory source read a Shared app through the deployment's account
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* List and end every account on an app, and write its account mode
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Build the shared-use store and audience gate at boot
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Move the connection, scheme and route tests to brokered_connections and account holders
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Pin that granting a Shared app's action records who may use it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Decide whose account and whether to gate from the app's answering row, never a duplicate
A second mcp_servers row at the same composio:// address could mark a Shared
app Personal and let calls through it skip the audience gate, or let a
non-admin connect a personal account to it. Every account decision, the
gate, the audit's reachedAs and the mode write now resolve the app's
answering row, and the gate refuses if the mode changes before the call goes
out.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Key shared-account approvals and requests by the app's answering row
A Bot granted through a duplicate or non-canonical row of an app now gets the
approval the audience gate actually reads, appears once in what it holds, and
is found when the app's mode changes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Carry the app's account mode on a server's address, read from its answering row
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Switch an app between Personal and Shared only once every old account is ended
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Ask the approval gate under the app's id for a write granted through a duplicate row
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Move the plugin store tests to brokered_connections and a Personal default
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Pin that a call whose app turned Personal mid-flight never reaches the vendor
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Decide which Connected accounts sections draw in one place, keeping Shared beside the empty state
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Switch an app's account mode, record a Shared grant's approval, and forget its rule on removal
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Wire the mode switch, the shared-use inbox and exposure re-checks into the running app
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Hand the shared wiring to createApp in the coworker options, not as a 37th positional argument
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* Fail loudly when a decided request cannot be read back, and settle the lint and format run
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* Make the switch to Shared safe to retry, and refuse a shared call that does not say what started it
switchMode set the mode, then each Bot's approval, then the ask-before-write
rule, with no transaction, and a retry on an app already in that mode returned
changed without doing anything. A failure after the mode left a Shared app
writing through the team account without asking, permanently. The approvals
and the rule are now made before the mode says shared, only where missing, and
the already-in-that-mode path makes them exist again (or, for Personal, removes
what a half-finished switch back left). The rule is never duplicated and an
approval an administrator changed is not written over.
A run that carried no initiator was read as a person, so a background path
added later that forgot to pass one would get past the outside-input check on a
shared account. The shared gate now refuses it, without filing a request no
approval could answer, and records it as shared_steering. The direct tool-call
route says it is a person.
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: David McKay <david@copilotkit.ai>1 parent 99a329d commit 4773ef6
87 files changed
Lines changed: 19565 additions & 1021 deletions
File tree
- app
- src
- components
- approvals
- bot-profile
- plugins
- lib
- plugins
- routes/_authed
- _app
- admin/plugins
- settings/connected-accounts
- tests
- docs
- plugins
- scripts
- server
- drizzle
- meta
- src
- agents
- channels
- db/schema
- memory
- plugins
- responsibilities
- team-bots
- tests
- helpers
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
11 | 27 | | |
12 | 28 | | |
13 | 29 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
| 3 | + | |
3 | 4 | | |
4 | 5 | | |
5 | 6 | | |
| |||
331 | 332 | | |
332 | 333 | | |
333 | 334 | | |
| 335 | + | |
334 | 336 | | |
335 | 337 | | |
336 | 338 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
| 13 | + | |
13 | 14 | | |
14 | 15 | | |
15 | 16 | | |
| |||
290 | 291 | | |
291 | 292 | | |
292 | 293 | | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
293 | 297 | | |
294 | 298 | | |
295 | 299 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
816 | 816 | | |
817 | 817 | | |
818 | 818 | | |
| 819 | + | |
| 820 | + | |
819 | 821 | | |
820 | 822 | | |
821 | 823 | | |
| |||
832 | 834 | | |
833 | 835 | | |
834 | 836 | | |
| 837 | + | |
| 838 | + | |
| 839 | + | |
| 840 | + | |
| 841 | + | |
| 842 | + | |
| 843 | + | |
| 844 | + | |
| 845 | + | |
| 846 | + | |
| 847 | + | |
| 848 | + | |
| 849 | + | |
| 850 | + | |
| 851 | + | |
835 | 852 | | |
836 | 853 | | |
837 | 854 | | |
| |||
868 | 885 | | |
869 | 886 | | |
870 | 887 | | |
871 | | - | |
| 888 | + | |
872 | 889 | | |
873 | 890 | | |
874 | 891 | | |
| |||
882 | 899 | | |
883 | 900 | | |
884 | 901 | | |
| 902 | + | |
| 903 | + | |
| 904 | + | |
| 905 | + | |
| 906 | + | |
| 907 | + | |
| 908 | + | |
885 | 909 | | |
886 | 910 | | |
887 | 911 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
0 commit comments