Synced from monorepo

Changes:
- grok-shell: request workspaces:read/write OAuth2 scopes
- security: fix SSRF bypass via HTTP redirect in hook runner
- fix(grok-build): enterprise STT WSS URL + API-key voice bearer
- Harden identity-change purge and sync-marker invariants
- sandbox + workspace-server: delete the legacy ready-file arm
- Show billing URL when browser cannot open
- fix(pager): show folder-trust UI in minimal mode
- fix(pager): drain task_backgrounded before no-wait headless exit
- grok-agent-sdk: stop SDK-spawned agents from staging self-updates they can never adopt
- Split settings_modal into directory module
- Delegate VS Code SSH file links
- grok-shell: release the workspace session binding when a session is removed
- keep skills reachable when their name collides with a client builtin
- Preserve semantic link targets
This commit is contained in:
grokkybara[bot] 2026-07-16 20:27:30 +01:00
commit 8adf9013a0
117 changed files with 16998 additions and 14540 deletions

View file

@ -370,7 +370,7 @@ impl AgentView {
&& let Some(link) = self.visible_link_map.link_at(mouse.column, mouse.row)
{
self.pending_link_click = app_should_open_link_on_click(link)
.then(|| (mouse.column, mouse.row, link.url.to_string()));
.then(|| (mouse.column, mouse.row, link.target.clone()));
self.pending_scrollback_click = None;
return InputOutcome::Changed;
}
@ -425,11 +425,9 @@ impl AgentView {
}
if let Some(id) = self.queue.send_now_click(mouse.column, mouse.row)
&& self.session.state.is_turn_running()
&& let InputOutcome::Action(action) = self.force_interject_queue_row(id)
{
if let InputOutcome::Action(action) = self.force_interject_queue_row(id)
{
return InputOutcome::Action(action);
}
return InputOutcome::Action(action);
}
self.set_active_pane(AgentPane::Queue, false);
self.queue.handle_mouse(
@ -618,7 +616,7 @@ impl AgentView {
self.visible_link_map.link_at(mouse.column, mouse.row)
{
self.pending_link_click = app_should_open_link_on_click(link)
.then(|| (mouse.column, mouse.row, link.url.to_string()));
.then(|| (mouse.column, mouse.row, link.target.clone()));
self.pending_scrollback_click = None;
return InputOutcome::Changed;
}
@ -697,11 +695,11 @@ impl AgentView {
}
let had_pending_text_drag = self.pending_text_drag.take().is_some();
let _had_pending_block_drag = self.pending_block_drag.take().is_some();
if let Some((lc, lr, url)) = self.pending_link_click.take()
if let Some((lc, lr, target)) = self.pending_link_click.take()
&& mouse.column == lc
&& mouse.row == lr
{
return InputOutcome::Action(Action::OpenUrl(url));
return InputOutcome::Action(Action::OpenLink(target));
}
if self.active_pane == AgentPane::Scrollback {
if let Some((click_col, click_row)) = self.pending_scrollback_click.take() {
@ -793,10 +791,7 @@ impl AgentView {
surface: xai_grok_telemetry::events::CreditLimitUpsellSurface::InlineCard,
choice,
});
crate::app::link_opener::open_url_if_safe(
&url,
crate::terminal::hyperlinks::SchemeFilter::Standard,
);
self.open_url_or_show(&url);
self.last_click = None;
return InputOutcome::Changed;
}