diff --git a/frontend/src/app/components/overlays/DynamicIsland.tsx b/frontend/src/app/components/overlays/DynamicIsland.tsx
index bc2bdd80..4e795839 100644
--- a/frontend/src/app/components/overlays/DynamicIsland.tsx
+++ b/frontend/src/app/components/overlays/DynamicIsland.tsx
@@ -4,7 +4,6 @@ import Typography from '@mui/material/Typography';
import IconButton from '@mui/material/IconButton';
import Tooltip from '@mui/material/Tooltip';
import Collapse from '@mui/material/Collapse';
-import SearchIcon from '@mui/icons-material/Search';
import StopCircleOutlinedIcon from '@mui/icons-material/StopCircleOutlined';
import CloseIcon from '@mui/icons-material/Close';
import CheckIcon from '@mui/icons-material/Check';
@@ -239,7 +238,7 @@ const DynamicIsland: React.FC = () => {
const [userExpanded, setUserExpanded] = useState(false);
const [searchOpen, setSearchOpen] = useState(false);
- // Global Cmd/Ctrl+K opens search palette from anywhere.
+ // Global Cmd/Ctrl+K, or the sidebar search pill, opens the palette from anywhere.
useEffect(() => {
const handler = (e: KeyboardEvent) => {
if ((e.metaKey || e.ctrlKey) && !e.shiftKey && !e.altKey && e.key.toLowerCase() === 'k') {
@@ -247,8 +246,13 @@ const DynamicIsland: React.FC = () => {
setSearchOpen((prev) => !prev);
}
};
+ const openFromSidebar = (): void => setSearchOpen(true);
window.addEventListener('keydown', handler);
- return () => window.removeEventListener('keydown', handler);
+ window.addEventListener('openswarm:open-search', openFromSidebar);
+ return () => {
+ window.removeEventListener('keydown', handler);
+ window.removeEventListener('openswarm:open-search', openFromSidebar);
+ };
}, []);
// Cmd/Ctrl+L: clear the chat (focused card > activeSessionId > sole session); same as /clear.
@@ -501,6 +505,8 @@ const DynamicIsland: React.FC = () => {
return (
<>
{islandState === 'compact-actionable' && }
+ {/* Search moved to the sidebar, so the island only appears for live agent activity, not idle. */}
+ {islandState !== 'idle' && (
{
}}
>
- {islandState === 'idle' && (
- setSearchOpen(true)} />
- )}
{islandState === 'compact' && (
{
+ )}
setSearchOpen(false)} />
>
);
};
-const isMac = typeof navigator !== 'undefined' && /Mac|iPod|iPhone|iPad/.test(navigator.platform);
-const SEARCH_HOTKEY = isMac ? '⌘K' : 'Ctrl+K';
-
-const IdlePill: React.FC<{ c: ReturnType; onClick: () => void }> = ({ c, onClick }) => (
-
-
- { e.stopPropagation(); onClick(); }}
- sx={{
- display: 'flex',
- alignItems: 'center',
- gap: 1,
- px: 1.5,
- height: 30,
- userSelect: 'none',
- cursor: 'pointer',
- transition: 'background 0.15s',
- '&:hover': { bgcolor: 'rgba(255,255,255,0.04)' },
- }}
- >
-
-
- Search…
-
-
- {SEARCH_HOTKEY}
-
-
-
-
-);
-
const CompactPill: React.FC<{
c: ReturnType;
text: string;
diff --git a/frontend/src/app/pages/Tools/integrations.tsx b/frontend/src/app/pages/Tools/integrations.tsx
index f1fe529c..68958a4b 100644
--- a/frontend/src/app/pages/Tools/integrations.tsx
+++ b/frontend/src/app/pages/Tools/integrations.tsx
@@ -70,8 +70,7 @@ export const INTEGRATIONS: Integration[] = [
connectInstructions: 'Uses your own Reddit account: open reddit.com in an OpenSwarm browser card and sign in once. Nothing is stored, the integration borrows your live session per request and paces itself to stay within human limits.',
icon: (
),
},
@@ -129,7 +128,10 @@ export const INTEGRATIONS: Integration[] = [
website: 'https://www.npmjs.com/package/@softeria/ms-365-mcp-server',
icon: (
),
authType: 'device_code',