mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-07-09 01:27:41 -07:00
feat: add channels support
This commit is contained in:
@@ -30,6 +30,7 @@ import { getMCPServerStatus } from '@google/gemini-cli-core';
|
||||
import { ToolsList } from './views/ToolsList.js';
|
||||
import { SkillsList } from './views/SkillsList.js';
|
||||
import { AgentsStatus } from './views/AgentsStatus.js';
|
||||
import { ChannelsList } from './views/ChannelsList.js';
|
||||
import { McpStatus } from './views/McpStatus.js';
|
||||
import { ChatList } from './views/ChatList.js';
|
||||
import { ModelMessage } from './messages/ModelMessage.js';
|
||||
@@ -227,6 +228,9 @@ export const HistoryItemDisplay: React.FC<HistoryItemDisplayProps> = ({
|
||||
terminalWidth={terminalWidth}
|
||||
/>
|
||||
)}
|
||||
{itemForDisplay.type === 'channels_list' && (
|
||||
<ChannelsList channels={itemForDisplay.channels} />
|
||||
)}
|
||||
{itemForDisplay.type === 'mcp_status' && (
|
||||
<McpStatus {...itemForDisplay} serverStatus={getMCPServerStatus} />
|
||||
)}
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
/**
|
||||
* @license
|
||||
* Copyright 2026 Google LLC
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
import { describe, it, expect } from 'vitest';
|
||||
import { ChannelsList } from './ChannelsList.js';
|
||||
import { type ChannelInfo } from '../../types.js';
|
||||
import { renderWithProviders } from '../../../test-utils/render.js';
|
||||
|
||||
const mockChannels: ChannelInfo[] = [
|
||||
{
|
||||
name: 'telegram',
|
||||
displayName: 'Telegram',
|
||||
supportsReply: true,
|
||||
},
|
||||
{
|
||||
name: 'minimal-channel',
|
||||
supportsReply: false,
|
||||
},
|
||||
];
|
||||
|
||||
describe('<ChannelsList />', () => {
|
||||
it('renders correctly with active channels', async () => {
|
||||
const { lastFrame, waitUntilReady } = await renderWithProviders(
|
||||
<ChannelsList channels={mockChannels} />,
|
||||
);
|
||||
await waitUntilReady();
|
||||
expect(lastFrame()).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it('renders correctly with no active channels', async () => {
|
||||
const { lastFrame, waitUntilReady } = await renderWithProviders(
|
||||
<ChannelsList channels={[]} />,
|
||||
);
|
||||
await waitUntilReady();
|
||||
expect(lastFrame()).toMatchSnapshot();
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,56 @@
|
||||
/**
|
||||
* @license
|
||||
* Copyright 2026 Google LLC
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
import type React from 'react';
|
||||
import { Box, Text } from 'ink';
|
||||
import { theme } from '../../semantic-colors.js';
|
||||
import type { ChannelInfo } from '../../types.js';
|
||||
|
||||
interface ChannelsListProps {
|
||||
channels: readonly ChannelInfo[];
|
||||
}
|
||||
|
||||
export const ChannelsList: React.FC<ChannelsListProps> = ({ channels }) => {
|
||||
if (channels.length === 0) {
|
||||
return (
|
||||
<Box flexDirection="column" marginBottom={1}>
|
||||
<Text color={theme.text.primary}>No active channels.</Text>
|
||||
<Text color="gray">
|
||||
{
|
||||
"MCP servers must declare `experimental['gemini/channel']` in their capabilities to act as channels."
|
||||
}
|
||||
</Text>
|
||||
</Box>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<Box flexDirection="column" marginBottom={1}>
|
||||
<Text bold color={theme.text.primary}>
|
||||
Active channels:
|
||||
</Text>
|
||||
<Box height={1} />
|
||||
<Box flexDirection="column">
|
||||
{channels.map((channel) => (
|
||||
<Box key={channel.name} flexDirection="row">
|
||||
<Text color={theme.text.primary}>{' '}- </Text>
|
||||
<Box flexDirection="column">
|
||||
<Text bold color={theme.text.accent}>
|
||||
{channel.displayName || channel.name} ({channel.name})
|
||||
</Text>
|
||||
<Text color="gray">
|
||||
Direction:{' '}
|
||||
<Text color={channel.supportsReply ? 'green' : 'gray'}>
|
||||
{channel.supportsReply ? 'two-way' : 'one-way'}
|
||||
</Text>
|
||||
</Text>
|
||||
</Box>
|
||||
</Box>
|
||||
))}
|
||||
</Box>
|
||||
</Box>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,17 @@
|
||||
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
||||
|
||||
exports[`<ChannelsList /> > renders correctly with active channels 1`] = `
|
||||
"Active channels:
|
||||
|
||||
- Telegram (telegram)
|
||||
Direction: two-way
|
||||
- minimal-channel (minimal-channel)
|
||||
Direction: one-way
|
||||
"
|
||||
`;
|
||||
|
||||
exports[`<ChannelsList /> > renders correctly with no active channels 1`] = `
|
||||
"No active channels.
|
||||
MCP servers must declare \`experimental['gemini/channel']\` in their capabilities to act as channels.
|
||||
"
|
||||
`;
|
||||
Reference in New Issue
Block a user