Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
297 changes: 297 additions & 0 deletions apps/sim/lib/api/server/routes/copilot-refused-routes.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,297 @@
[
{
"method": "POST",
"path": "/api/v2/chat",
"operation": "chat.send"
},
{
"method": "GET",
"path": "/api/v2/credentials/[credentialId]/members",
"operation": "credentials.members.list"
},
{
"method": "POST",
"path": "/api/v2/credentials/[credentialId]/members",
"operation": "credentials.members.upsert"
},
{
"method": "DELETE",
"path": "/api/v2/credentials/[credentialId]/members/[userId]",
"operation": "credentials.members.remove"
},
{
"method": "GET",
"path": "/api/v2/files/[fileId]/versions",
"operation": "files.versions.list"
},
{
"method": "GET",
"path": "/api/v2/files/[fileId]/versions/[version]",
"operation": "files.versions.read"
},
{
"method": "DELETE",
"path": "/api/v2/files/[fileId]/versions/[version]",
"operation": "files.versions.delete"
},
{
"method": "GET",
"path": "/api/v2/files/[fileId]/versions/[version]/content",
"operation": "files.versions.download"
},
{
"method": "POST",
"path": "/api/v2/files/[fileId]/versions/[version]/revert",
"operation": "files.versions.revert"
},
{
"method": "GET",
"path": "/api/v2/files/[fileId]/versions/[version]/text",
"operation": "files.versions.read_content"
},
{
"method": "GET",
"path": "/api/v2/meta",
"operation": "meta.capabilities.read"
},
{
"method": "GET",
"path": "/api/v2/organizations",
"operation": "organizations.list"
},
{
"method": "GET",
"path": "/api/v2/organizations/[organizationId]",
"operation": "organizations.read"
},
{
"method": "POST",
"path": "/api/v2/organizations/[organizationId]/access-requests",
"operation": "access_requests.create"
},
{
"method": "GET",
"path": "/api/v2/organizations/[organizationId]/access-requests",
"operation": "access_requests.list_organization"
},
{
"method": "POST",
"path": "/api/v2/organizations/[organizationId]/access-requests/[requestId]/cancel",
"operation": "access_requests.cancel"
},
{
"method": "GET",
"path": "/api/v2/organizations/[organizationId]/access-requests/[requestId]/preview",
"operation": "access_requests.preview"
},
{
"method": "POST",
"path": "/api/v2/organizations/[organizationId]/access-requests/[requestId]/resolve",
"operation": "access_requests.resolve"
},
{
"method": "GET",
"path": "/api/v2/organizations/[organizationId]/access-requests/discovery",
"operation": "access_requests.discover"
},
{
"method": "GET",
"path": "/api/v2/organizations/[organizationId]/access-requests/mine",
"operation": "access_requests.list_mine"
},
{
"method": "GET",
"path": "/api/v2/organizations/[organizationId]/access-requests/settings",
"operation": "access_requests.get_settings"
},
{
"method": "PATCH",
"path": "/api/v2/organizations/[organizationId]/access-requests/settings",
"operation": "access_requests.update_settings"
},
{
"method": "GET",
"path": "/api/v2/organizations/[organizationId]/invitations",
"operation": "organizations.invitations.list"
},
{
"method": "POST",
"path": "/api/v2/organizations/[organizationId]/invitations",
"operation": "organizations.invitations.create"
},
{
"method": "GET",
"path": "/api/v2/organizations/[organizationId]/invitations/[invitationId]",
"operation": "organizations.invitations.read"
},
{
"method": "DELETE",
"path": "/api/v2/organizations/[organizationId]/invitations/[invitationId]",
"operation": "invitations.revoke"
},
{
"method": "POST",
"path": "/api/v2/organizations/[organizationId]/invitations/[invitationId]/resend",
"operation": "invitations.resend"
},
{
"method": "GET",
"path": "/api/v2/organizations/[organizationId]/invitations/[invitationId]/workspaces",
"operation": "organizations.invitations.workspaces.list"
},
{
"method": "GET",
"path": "/api/v2/organizations/[organizationId]/members",
"operation": "organizations.members.list"
},
{
"method": "PATCH",
"path": "/api/v2/organizations/[organizationId]/members/[userId]",
"operation": "organizations.members.update"
},
{
"method": "DELETE",
"path": "/api/v2/organizations/[organizationId]/members/[userId]",
"operation": "organizations.members.remove"
},
{
"method": "GET",
"path": "/api/v2/organizations/[organizationId]/members/[userId]/usage-limit",
"operation": "organization_member_usage_limits.read"
},
{
"method": "PATCH",
"path": "/api/v2/organizations/[organizationId]/members/[userId]/usage-limit",
"operation": "organization_member_usage_limits.update"
},
{
"method": "GET",
"path": "/api/v2/organizations/[organizationId]/permission-groups",
"operation": "permission_groups.list"
},
{
"method": "POST",
"path": "/api/v2/organizations/[organizationId]/permission-groups",
"operation": "permission_groups.create"
},
{
"method": "GET",
"path": "/api/v2/organizations/[organizationId]/permission-groups/[groupId]",
"operation": "permission_groups.read"
},
{
"method": "PATCH",
"path": "/api/v2/organizations/[organizationId]/permission-groups/[groupId]",
"operation": "permission_groups.update"
},
{
"method": "DELETE",
"path": "/api/v2/organizations/[organizationId]/permission-groups/[groupId]",
"operation": "permission_groups.delete"
},
{
"method": "GET",
"path": "/api/v2/organizations/[organizationId]/permission-groups/[groupId]/members",
"operation": "permission_groups.members.list"
},
{
"method": "POST",
"path": "/api/v2/organizations/[organizationId]/permission-groups/[groupId]/members",
"operation": "permission_groups.members.add"
},
{
"method": "DELETE",
"path": "/api/v2/organizations/[organizationId]/permission-groups/[groupId]/members/[userId]",
"operation": "permission_groups.members.remove"
},
{
"method": "POST",
"path": "/api/v2/organizations/[organizationId]/permission-groups/[groupId]/members/bulk",
"operation": "permission_groups.members.bulk_add"
},
{
"method": "GET",
"path": "/api/v2/organizations/[organizationId]/sso/policy",
"operation": "organization.sso.read_requirement"
},
{
"method": "PATCH",
"path": "/api/v2/organizations/[organizationId]/sso/policy",
"operation": "organization.sso.set_requirement"
},
{
"method": "GET",
"path": "/api/v2/organizations/[organizationId]/sso/providers",
"operation": "organization.sso.providers.list"
},
{
"method": "POST",
"path": "/api/v2/organizations/[organizationId]/sso/providers",
"operation": "organization.sso.providers.save"
},
{
"method": "GET",
"path": "/api/v2/organizations/[organizationId]/sso/providers/[providerId]",
"operation": "organization.sso.providers.list"
},
{
"method": "DELETE",
"path": "/api/v2/organizations/[organizationId]/sso/providers/[providerId]",
"operation": "organization.sso.providers.delete"
},
{
"method": "POST",
"path": "/api/v2/organizations/[organizationId]/sso/providers/[providerId]/primary",
"operation": "organization.sso.set_primary_provider"
},
{
"method": "GET",
"path": "/api/v2/organizations/[organizationId]/usage/breakdown",
"operation": "organization_usage.breakdown.read"
},
{
"method": "GET",
"path": "/api/v2/organizations/[organizationId]/usage/events",
"operation": "organization_usage.events.list"
},
{
"method": "GET",
"path": "/api/v2/organizations/[organizationId]/usage/summary",
"operation": "organization_usage.summary.read"
},
{
"method": "GET",
"path": "/api/v2/organizations/[organizationId]/workspaces",
"operation": "organizations.workspaces.list"
},
{
"method": "GET",
"path": "/api/v2/workspaces",
"operation": "workspaces.list_public"
},
{
"method": "GET",
"path": "/api/v2/workspaces/[workspaceId]/access-requests",
"operation": "access_requests.list_mine"
},
{
"method": "POST",
"path": "/api/v2/workspaces/[workspaceId]/access-requests",
"operation": "access_requests.create"
},
{
"method": "POST",
"path": "/api/v2/workspaces/[workspaceId]/access-requests/[requestId]/cancel",
"operation": "access_requests.cancel"
},
{
"method": "GET",
"path": "/api/v2/workspaces/[workspaceId]/access-requests/discovery",
"operation": "access_requests.discover"
},
{
"method": "GET",
"path": "/api/v2/workspaces/[workspaceId]/permission-config",
"operation": "permission_groups.read_user_config"
}
]
28 changes: 21 additions & 7 deletions apps/sim/lib/api/server/routes/copilot-request.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,33 @@ export function isCopilotRequest(request: Request): boolean {
return INVOCATIONS.has(request)
}

/** The code-owned use case must explicitly admit Copilot and declare its domain audience. */
export type CopilotRouteUseCase = Pick<
OperationUseCase<ApplicationOperation, unknown, unknown>,
'operation' | 'delegationAudience'
>

/**
* The audience a route admits Copilot under, or none when Mothership is refused. The
* code-owned use case must explicitly admit Copilot and declare its domain audience. The
* route inventory evaluates this same rule to publish which CLI commands chat can run.
*/
export function copilotRouteAudience(
operation: ApplicationOperation,
useCase?: CopilotRouteUseCase
): string | undefined {
return useCase?.operation === operation ? useCase.delegationAudience || undefined : undefined
}

export function copilotRequestPrincipal(
request: Request,
operation: ApplicationOperation,
useCase?: Pick<
OperationUseCase<ApplicationOperation, unknown, unknown>,
'operation' | 'delegationAudience'
>
useCase?: CopilotRouteUseCase
): DelegatedPrincipal | undefined {
const invocation = INVOCATIONS.get(request)
if (!invocation) return undefined
if (useCase?.operation !== operation || !useCase.delegationAudience) return undefined
const principal = createCopilotChatPrincipal(invocation, useCase.delegationAudience)
const audience = copilotRouteAudience(operation, useCase)
if (!audience) return undefined
const principal = createCopilotChatPrincipal(invocation, audience)
markCopilotWorkspaceInvocation(principal)
return principal
}
Loading
Loading