Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Lead the user to the AI settings when no provider is set up #18121

Merged
merged 128 commits into from
Oct 29, 2024
Merged
Show file tree
Hide file tree
Changes from 126 commits
Commits
Show all changes
128 commits
Select commit Hold shift + click to select a range
b44216b
got an idl
PankajBhojwani Jun 6, 2024
e78e4d0
works
PankajBhojwani Jun 7, 2024
ac83d76
allow
PankajBhojwani Jun 7, 2024
4b944e9
conflict
PankajBhojwani Jun 7, 2024
ef406ee
use id here too
PankajBhojwani Jun 7, 2024
4fb4ca4
have terminal page initialize the llmprovider
PankajBhojwani Jun 7, 2024
e5afbae
format
PankajBhojwani Jun 7, 2024
32b3d68
consts
PankajBhojwani Jun 8, 2024
1700a92
works on palette side
PankajBhojwani Jun 11, 2024
08dd951
open ai in settings, llmprovider enum
PankajBhojwani Jun 13, 2024
1934b30
aiconfig struct
PankajBhojwani Jun 20, 2024
96a489a
move more things to ai info
PankajBhojwani Jun 21, 2024
6052a8d
works on palette side
PankajBhojwani Jun 11, 2024
4add2c9
open ai in settings, llmprovider enum
PankajBhojwani Jun 13, 2024
c3885ff
aiconfig struct
PankajBhojwani Jun 20, 2024
646c28b
move more things to ai info
PankajBhojwani Jun 21, 2024
fb7ff3c
github copilot impl works
PankajBhojwani Jun 28, 2024
8bf23bc
handle uri action
PankajBhojwani Jul 2, 2024
65c2587
rough edges, but roundtrip works
PankajBhojwani Jul 4, 2024
73eb2af
mark a couple todos
PankajBhojwani Jul 8, 2024
8e560e2
active provider buttons
PankajBhojwani Jul 9, 2024
f9e9326
rename to lmprovider
PankajBhojwani Jul 9, 2024
4133239
spelling conflict
PankajBhojwani Jul 9, 2024
e545ca2
conflicts
PankajBhojwani Jul 9, 2024
dfad8d9
spell
PankajBhojwani Jul 9, 2024
5139b88
array of accepted models
PankajBhojwani Jul 9, 2024
dfbdc75
cleanup this comment
PankajBhojwani Jul 9, 2024
2819606
placeholder, remove device flow code
PankajBhojwani Jul 11, 2024
19e73db
refresh tokens works
PankajBhojwani Jul 11, 2024
82125f9
error dialog for failed auth
PankajBhojwani Jul 11, 2024
405276e
mark todos
PankajBhojwani Jul 12, 2024
1f305ab
first round of comments
PankajBhojwani Jul 15, 2024
242b964
combine setter/getter
PankajBhojwani Jul 15, 2024
0094db0
Merge branch 'dev/pabhoj/llm_provider_interface' of https://github.co…
PankajBhojwani Jul 15, 2024
3560339
conflicts
PankajBhojwani Jul 15, 2024
86f4966
active button and bool
PankajBhojwani Jul 15, 2024
6479c47
auth related functions
PankajBhojwani Jul 16, 2024
2cfe23d
github auth function implementation, static event on settings side
PankajBhojwani Jul 16, 2024
eb1c805
nope just wrong thread
PankajBhojwani Jul 16, 2024
d392aab
dispatcher
PankajBhojwani Jul 17, 2024
8faf8b4
domain check
PankajBhojwani Jul 17, 2024
dd6b46d
hot reload works now
PankajBhojwani Jul 18, 2024
4f81775
conflict and updates to openAI provider
PankajBhojwani Jul 18, 2024
46ab508
password box
PankajBhojwani Jul 18, 2024
ac1b4a3
logic for updating providers based on settings changes
PankajBhojwani Jul 18, 2024
90642d0
conflict, updates with new interface
PankajBhojwani Jul 19, 2024
fc8e36d
use static strings for strings used more than once
PankajBhojwani Jul 19, 2024
e8fc46d
conflict, updates with new interface
PankajBhojwani Jul 19, 2024
6ef93f4
Merge branch 'dev/pabhoj/featurellm_capi' of https://microsoft.visual…
PankajBhojwani Jul 19, 2024
cddbd75
random state string, manifest for canary
PankajBhojwani Jul 19, 2024
fdee6c2
Merge branch 'feature/llm' of https://github.com/microsoft/terminal i…
PankajBhojwani Jul 19, 2024
fff97a4
merge
PankajBhojwani Jul 20, 2024
4cd6e82
merge
PankajBhojwani Jul 20, 2024
c86dfdd
auth values
PankajBhojwani Jul 22, 2024
45ce94d
don't use &
PankajBhojwani Jul 22, 2024
c89a306
update with base changes
PankajBhojwani Jul 22, 2024
63d6c63
update
PankajBhojwani Jul 22, 2024
de88842
conflict
PankajBhojwani Sep 9, 2024
edf08a9
missed this
PankajBhojwani Sep 9, 2024
830e655
newline...
PankajBhojwani Sep 9, 2024
ef9fb02
conflict
PankajBhojwani Sep 9, 2024
2adbe0e
update settings ui
PankajBhojwani Sep 9, 2024
c094900
use correct links
PankajBhojwani Sep 9, 2024
15f9d8e
checkbox
PankajBhojwani Sep 10, 2024
234ebd0
allow LMProviders to modify parts of the UI, github copilot provider …
PankajBhojwani Sep 11, 2024
1cd7f33
username metadata
PankajBhojwani Sep 11, 2024
ec294e5
GitHub
PankajBhojwani Sep 11, 2024
c1e74c9
sequencing
PankajBhojwani Sep 13, 2024
14949c1
branding data struct
PankajBhojwani Oct 8, 2024
32caeba
github telemetry
PankajBhojwani Oct 8, 2024
c504a08
why was this here
PankajBhojwani Oct 8, 2024
a70339c
launch setting issue
PankajBhojwani Oct 8, 2024
bfb4295
H in github
PankajBhojwani Oct 10, 2024
6fa4cc7
feature flag for capi
PankajBhojwani Oct 11, 2024
93f065f
add feature id
PankajBhojwani Oct 11, 2024
5665097
display error message on failed auth
PankajBhojwani Oct 15, 2024
ad5dba5
comments
PankajBhojwani Oct 15, 2024
5931ecd
better refresh
PankajBhojwani Oct 15, 2024
b376da4
api spell
PankajBhojwani Oct 15, 2024
ba81e16
sku isolation
PankajBhojwani Oct 16, 2024
d0a9e05
deduplicate a bunch
PankajBhojwani Oct 16, 2024
5ea6f62
move secret to its own file
PankajBhojwani Oct 17, 2024
16d3035
conflict
PankajBhojwani Oct 17, 2024
8dc2dfb
conflict
PankajBhojwani Oct 17, 2024
e973ced
open ai desc fixes
PankajBhojwani Oct 17, 2024
a12e720
registry check works and settings UI follows
PankajBhojwani Oct 22, 2024
5dd2d3c
don't show these in cmdpal if disabled
PankajBhojwani Oct 22, 2024
3c0bd7d
only allow set active provider if it is allowed
PankajBhojwani Oct 22, 2024
ea79fb9
caching logic and other comments
PankajBhojwani Oct 22, 2024
9031427
std move
PankajBhojwani Oct 22, 2024
b41ff7a
disable instead of hide
PankajBhojwani Oct 22, 2024
5e12119
slight wording change
PankajBhojwani Oct 22, 2024
3ee948d
comment
PankajBhojwani Oct 22, 2024
b2e38af
nits
PankajBhojwani Oct 23, 2024
ce4a1de
zwstring_view
PankajBhojwani Oct 23, 2024
95e721c
conflict
PankajBhojwani Oct 23, 2024
890e5fe
conflict and text change
PankajBhojwani Oct 23, 2024
0a4ae90
lock icon, grey out
PankajBhojwani Oct 23, 2024
ed5725a
hide from dropdown
PankajBhojwani Oct 23, 2024
596d17e
store the last response to bubble in case of errors
PankajBhojwani Oct 23, 2024
2fc21ef
rename to attribution, getters only
PankajBhojwani Oct 24, 2024
bcfc1d4
branding too
PankajBhojwani Oct 24, 2024
2bb6d7f
some fixes
PankajBhojwani Oct 24, 2024
6a694ae
auth values as string
PankajBhojwani Oct 24, 2024
3ffaafc
use winrt::hstring
PankajBhojwani Oct 24, 2024
d0847a1
wait these didn't save
PankajBhojwani Oct 24, 2024
7234b9d
strong
PankajBhojwani Oct 24, 2024
b969baf
safer coroutines
PankajBhojwani Oct 24, 2024
b1db894
conflict
PankajBhojwani Oct 24, 2024
e0d7172
turn on feature for new build
PankajBhojwani Oct 25, 2024
bd34e90
iasyncaction instead
PankajBhojwani Oct 25, 2024
df9a233
use a grid because stackpanel is the worst
PankajBhojwani Oct 25, 2024
f9fa609
more efficient check
PankajBhojwani Oct 28, 2024
a6deddf
Merge branch 'feature/llm' of https://github.com/microsoft/terminal i…
PankajBhojwani Oct 28, 2024
0564bc5
conflict
PankajBhojwani Oct 28, 2024
9a30666
unpackaged check
PankajBhojwani Oct 28, 2024
4407c30
Merge remote-tracking branch 'origin/feature/llm' into HEAD
DHowett Oct 28, 2024
3866092
Merge commit '4407c30f4' into dev/pabhoj/featurellm_registry_enable
DHowett Oct 28, 2024
1b7dc46
managed->disabled
DHowett Oct 28, 2024
56c29d1
deeplink to settings when no provider is set up
PankajBhojwani Oct 28, 2024
f843a3f
format
PankajBhojwani Oct 28, 2024
08e102b
comments
PankajBhojwani Oct 29, 2024
97aeed9
conflict
PankajBhojwani Oct 29, 2024
fcc3d8b
extraneous
PankajBhojwani Oct 29, 2024
e22c582
format
PankajBhojwani Oct 29, 2024
7b7800a
actually use the variable
PankajBhojwani Oct 29, 2024
134e655
Merge remote-tracking branch 'origin/feature/llm' into dev/pabhoj/fea…
DHowett Oct 29, 2024
6fe805b
Merge commit '134e65527' into dev/pabhoj/featurellm_deeplink_settings
DHowett Oct 29, 2024
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
8 changes: 8 additions & 0 deletions policies/WindowsTerminal.admx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
<supportedOn>
<definitions>
<definition name="SUPPORTED_WindowsTerminal_1_21" displayName="$(string.SUPPORTED_WindowsTerminal_1_21)" />
<definition name="SUPPORTED_WindowsTerminalCanary_1_23" displayName="$(string.SUPPORTED_WindowsTerminalCanary_1_23)" />
</definitions>
</supportedOn>
<categories>
Expand All @@ -24,5 +25,12 @@
<multiText id="DisabledProfileSources" valueName="DisabledProfileSources" required="true" />
</elements>
</policy>
<policy name="EnabledLMProviders" class="Both" displayName="$(string.EnabledLMProviders)" explainText="$(string.EnabledLMProvidersText)" presentation="$(presentation.EnabledLMProviders)" key="Software\Policies\Microsoft\Windows Terminal">
<parentCategory ref="WindowsTerminal" />
<supportedOn ref="SUPPORTED_WindowsTerminalCanary_1_23" />
<elements>
<multiText id="EnabledLMProviders" valueName="EnabledLMProviders" required="false" />
</elements>
</policy>
</policies>
</policyDefinitions>
15 changes: 15 additions & 0 deletions policies/en-US/WindowsTerminal.adml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
<stringTable>
<string id="WindowsTerminal">Windows Terminal</string>
<string id="SUPPORTED_WindowsTerminal_1_21">At least Windows Terminal 1.21</string>
<string id="SUPPORTED_WindowsTerminalCanary_1_23">At least Windows Terminal Canary 1.23</string>
<string id="DisabledProfileSources">Disabled Profile Sources</string>
<string id="DisabledProfileSourcesText">Profiles will not be generated from any sources listed here. Source names can be arbitrary strings. Potential candidates can be found as the "source" property on profile definitions in Windows Terminal's settings.json file.

Expand All @@ -18,11 +19,25 @@ Common sources are:
For instance, setting this policy to Windows.Terminal.Wsl will disable the builtin WSL integration of Windows Terminal.

Note: Existing profiles will disappear from Windows Terminal after adding their source to this policy.</string>
<string id="EnabledLMProviders">Enabled Language Model/AI Providers</string>
<string id="EnabledLMProvidersText">The listed Language Models/AI Providers will be available for use in Terminal Chat.

Enabling the policy but leaving the list empty disallows all providers and therefore disables the Terminal Chat feature completely.

Common providers are:
- AzureOpenAI
- OpenAI
- GitHubCopilot

For instance, setting this policy to GitHubCopilot will allow the use of GitHubCopilot in Terminal Chat.</string>
</stringTable>
<presentationTable>
<presentation id="DisabledProfileSources">
<multiTextBox refId="DisabledProfileSources">List of disabled sources (one per line)</multiTextBox>
</presentation>
<presentation id="EnabledLMProviders">
<multiTextBox refId="EnabledLMProviders">List of enabled Language Model/AI Providers (one per line)</multiTextBox>
</presentation>
</presentationTable>
</resources>
</policyDefinitionResources>
33 changes: 24 additions & 9 deletions src/cascadia/QueryExtension/ExtensionPalette.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -99,17 +99,23 @@ namespace winrt::Microsoft::Terminal::Query::Extension::implementation
_lmProvider = lmProvider;
_clearAndInitializeMessages(nullptr, nullptr);

const auto brandingData = _lmProvider.BrandingData();
const auto headerIconPath = brandingData.HeaderIconPath().empty() ? terminalChatLogoPath : brandingData.HeaderIconPath();
const auto brandingData = _lmProvider ? _lmProvider.BrandingData() : nullptr;
const auto headerIconPath = (!brandingData || brandingData.HeaderIconPath().empty()) ? terminalChatLogoPath : brandingData.HeaderIconPath();
Windows::Foundation::Uri headerImageSourceUri{ headerIconPath };
Media::Imaging::BitmapImage headerImageSource{ headerImageSourceUri };
HeaderIcon().Source(headerImageSource);

const auto headerText = brandingData.HeaderText().empty() ? RS_(L"IntroText/Text") : brandingData.HeaderText();
const auto headerText = (!brandingData || brandingData.HeaderText().empty()) ? RS_(L"IntroText/Text") : brandingData.HeaderText();
QueryIntro().Text(headerText);

const auto subheaderText = brandingData.SubheaderText().empty() ? RS_(L"TitleSubheader/Text") : brandingData.SubheaderText();
const auto subheaderText = (!brandingData || brandingData.SubheaderText().empty()) ? RS_(L"TitleSubheader/Text") : brandingData.SubheaderText();
TitleSubheader().Text(subheaderText);
_PropertyChangedHandlers(*this, Windows::UI::Xaml::Data::PropertyChangedEventArgs{ L"ProviderExists" });
}

bool ExtensionPalette::ProviderExists() const noexcept
{
return _lmProvider != nullptr;
}

void ExtensionPalette::IconPath(const winrt::hstring& iconPath)
Expand Down Expand Up @@ -234,9 +240,9 @@ namespace winrt::Microsoft::Terminal::Query::Extension::implementation
}
}

const auto brandingData = _lmProvider.BrandingData();
const auto brandingData = _lmProvider ? _lmProvider.BrandingData() : nullptr;
const auto responseAttribution = response.ResponseAttribution().empty() ? _ProfileName : response.ResponseAttribution();
const auto badgeUriPath = _lmProvider ? brandingData.BadgeIconPath() : winrt::hstring{};
const auto badgeUriPath = brandingData ? brandingData.BadgeIconPath() : L"";
const auto responseGroupedMessages = winrt::make<GroupedChatMessages>(time, false, winrt::single_threaded_vector(std::move(messageParts)), responseAttribution, badgeUriPath);
_messages.Append(responseGroupedMessages);

Expand All @@ -261,10 +267,12 @@ namespace winrt::Microsoft::Terminal::Query::Extension::implementation
{
const auto context = winrt::make<TerminalContext>(_ActiveCommandline);
_lmProvider.SetContext(std::move(context));
_queryBox().Focus(FocusState::Programmatic);
}
else
{
SetUpProviderButton().Focus(FocusState::Programmatic);
}

// Give the palette focus
_queryBox().Focus(FocusState::Programmatic);
}

void ExtensionPalette::_clearAndInitializeMessages(const Windows::Foundation::IInspectable& /*sender*/,
Expand Down Expand Up @@ -459,6 +467,13 @@ namespace winrt::Microsoft::Terminal::Query::Extension::implementation
}
}

void ExtensionPalette::_setUpAIProviderInSettings(const Windows::Foundation::IInspectable& /*sender*/,
const Windows::UI::Xaml::RoutedEventArgs& /*args*/)
{
_SetUpProviderInSettingsRequestedHandlers(nullptr, nullptr);
_close();
}

// Method Description:
// - Dismiss the query palette. This will:
// * clear all the current text in the input box
Expand Down
3 changes: 3 additions & 0 deletions src/cascadia/QueryExtension/ExtensionPalette.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ namespace winrt::Microsoft::Terminal::Query::Extension::implementation
{
ExtensionPalette();
void SetProvider(const Extension::ILMProvider lmProvider);
bool ProviderExists() const noexcept;

// We don't use the winrt_property macro here because we just need the setter
void IconPath(const winrt::hstring& iconPath);
Expand All @@ -29,6 +30,7 @@ namespace winrt::Microsoft::Terminal::Query::Extension::implementation
TYPED_EVENT(ActiveControlInfoRequested, winrt::Microsoft::Terminal::Query::Extension::ExtensionPalette, Windows::Foundation::IInspectable);
TYPED_EVENT(InputSuggestionRequested, winrt::Microsoft::Terminal::Query::Extension::ExtensionPalette, winrt::hstring);
TYPED_EVENT(ExportChatHistoryRequested, winrt::Microsoft::Terminal::Query::Extension::ExtensionPalette, winrt::hstring);
TYPED_EVENT(SetUpProviderInSettingsRequested, winrt::Microsoft::Terminal::Query::Extension::ExtensionPalette, Windows::Foundation::IInspectable);

private:
friend struct ExtensionPaletteT<ExtensionPalette>; // for Xaml to bind events
Expand All @@ -54,6 +56,7 @@ namespace winrt::Microsoft::Terminal::Query::Extension::implementation
void _lostFocusHandler(const Windows::Foundation::IInspectable& sender, const Windows::UI::Xaml::RoutedEventArgs& args);
void _previewKeyDownHandler(const Windows::Foundation::IInspectable& sender,
const Windows::UI::Xaml::Input::KeyRoutedEventArgs& e);
void _setUpAIProviderInSettings(const Windows::Foundation::IInspectable& sender, const Windows::UI::Xaml::RoutedEventArgs& args);

void _close();
};
Expand Down
2 changes: 2 additions & 0 deletions src/cascadia/QueryExtension/ExtensionPalette.idl
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ namespace Microsoft.Terminal.Query.Extension
{
ExtensionPalette();
void SetProvider(ILMProvider lmProvider);
Boolean ProviderExists { get; };

String ControlName { get; };
String QueryBoxPlaceholderText { get; };
Expand All @@ -40,5 +41,6 @@ namespace Microsoft.Terminal.Query.Extension
event Windows.Foundation.TypedEventHandler<ExtensionPalette, IInspectable> ActiveControlInfoRequested;
event Windows.Foundation.TypedEventHandler<ExtensionPalette, String> InputSuggestionRequested;
event Windows.Foundation.TypedEventHandler<ExtensionPalette, String> ExportChatHistoryRequested;
event Windows.Foundation.TypedEventHandler<ExtensionPalette, IInspectable> SetUpProviderInSettingsRequested;
}
}
22 changes: 21 additions & 1 deletion src/cascadia/QueryExtension/ExtensionPalette.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="using:Microsoft.Terminal.Query.Extension"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:mtu="using:Microsoft.Terminal.UI"
xmlns:mux="using:Microsoft.UI.Xaml.Controls"
VerticalAlignment="Stretch"
AllowFocusOnInteraction="True"
Expand Down Expand Up @@ -409,7 +410,26 @@
IsSpellCheckEnabled="False"
PlaceholderText="{x:Bind QueryBoxPlaceholderText}"
Text=""
TextWrapping="Wrap" />
TextWrapping="Wrap"
Visibility="{x:Bind ProviderExists, Mode=OneWay}" />
<Grid Grid.Row="1"
HorizontalAlignment="Center"
RowSpacing="8"
Visibility="{x:Bind mtu:Converters.InvertedBooleanToVisibility(ProviderExists), Mode=OneWay}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock x:Uid="SetUpProviderDisclaimer"
Grid.Row="0"
HorizontalAlignment="Center" />
<Button x:Name="SetUpProviderButton"
Grid.Row="1"
HorizontalAlignment="Center"
Click="_setUpAIProviderInSettings">
<TextBlock x:Uid="SetUpProviderButton" />
</Button>
</Grid>
<TextBlock Grid.Row="2"
Margin="20,0,0,16"
FontSize="10">
Expand Down
8 changes: 8 additions & 0 deletions src/cascadia/QueryExtension/Resources/en-US/Resources.resw
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,14 @@
<value>Assistant</value>
<comment>A string to represent the section that the chat assistant typed, presented when the user exports the chat history to a file</comment>
</data>
<data name="SetUpProviderDisclaimer.Text" xml:space="preserve">
<value>You have not set up an AI provider yet! Set one up in the settings</value>
<comment>Disclaimer shown to the user when they open up Terminal Chat without having set up a provider yet.</comment>
</data>
<data name="SetUpProviderButton.Text" xml:space="preserve">
<value>Set up AI provider</value>
<comment>Description of the button that sends the user to the settings page where they can set up a provider.</comment>
</data>
<data name="GithubCopilot_HeaderText" xml:space="preserve">
<value>GitHub Copilot</value>
<comment>The header for Terminal Chat when GitHub Copilot is the connected service provider</comment>
Expand Down
25 changes: 15 additions & 10 deletions src/cascadia/TerminalApp/AppActionHandlers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -662,18 +662,23 @@ namespace winrt::TerminalApp::implementation
void TerminalPage::_HandleToggleAIChat(const IInspectable& /*sender*/,
const ActionEventArgs& args)
{
if (ExtensionPresenter().Visibility() == Visibility::Collapsed)
{
_loadQueryExtension();
ExtensionPresenter().Visibility(Visibility::Visible);
_extensionPalette.Visibility(Visibility::Visible);
}
else
args.Handled(false);
// only handle this if the feature is allowed
if (WI_IsAnyFlagSet(AIConfig::AllowedLMProviders(), EnabledLMProviders::All))
{
_extensionPalette.Visibility(Visibility::Collapsed);
ExtensionPresenter().Visibility(Visibility::Collapsed);
if (ExtensionPresenter().Visibility() == Visibility::Collapsed)
{
_loadQueryExtension();
ExtensionPresenter().Visibility(Visibility::Visible);
_extensionPalette.Visibility(Visibility::Visible);
}
else
{
_extensionPalette.Visibility(Visibility::Collapsed);
ExtensionPresenter().Visibility(Visibility::Collapsed);
}
args.Handled(true);
}
args.Handled(true);
}

void TerminalPage::_HandleSetColorScheme(const IInspectable& /*sender*/,
Expand Down
Loading
Loading