summaryrefslogtreecommitdiff
path: root/packages/cli/src/ui/components
diff options
context:
space:
mode:
Diffstat (limited to 'packages/cli/src/ui/components')
-rw-r--r--packages/cli/src/ui/components/Footer.test.tsx53
-rw-r--r--packages/cli/src/ui/components/Footer.tsx8
2 files changed, 59 insertions, 2 deletions
diff --git a/packages/cli/src/ui/components/Footer.test.tsx b/packages/cli/src/ui/components/Footer.test.tsx
index 5e79eea4..e3673dfe 100644
--- a/packages/cli/src/ui/components/Footer.test.tsx
+++ b/packages/cli/src/ui/components/Footer.test.tsx
@@ -103,4 +103,57 @@ describe('<Footer />', () => {
expect(lastFrame()).toContain(defaultProps.model);
expect(lastFrame()).toMatch(/\(\d+% context[\s\S]*left\)/);
});
+
+ describe('sandbox and trust info', () => {
+ it('should display untrusted when isTrustedFolder is false', () => {
+ const { lastFrame } = renderWithWidth(120, {
+ ...defaultProps,
+ isTrustedFolder: false,
+ });
+ expect(lastFrame()).toContain('untrusted');
+ });
+
+ it('should display custom sandbox info when SANDBOX env is set', () => {
+ vi.stubEnv('SANDBOX', 'gemini-cli-test-sandbox');
+ const { lastFrame } = renderWithWidth(120, {
+ ...defaultProps,
+ isTrustedFolder: undefined,
+ });
+ expect(lastFrame()).toContain('test');
+ vi.unstubAllEnvs();
+ });
+
+ it('should display macOS Seatbelt info when SANDBOX is sandbox-exec', () => {
+ vi.stubEnv('SANDBOX', 'sandbox-exec');
+ vi.stubEnv('SEATBELT_PROFILE', 'test-profile');
+ const { lastFrame } = renderWithWidth(120, {
+ ...defaultProps,
+ isTrustedFolder: true,
+ });
+ expect(lastFrame()).toMatch(/macOS Seatbelt.*\(test-profile\)/s);
+ vi.unstubAllEnvs();
+ });
+
+ it('should display "no sandbox" when SANDBOX is not set and folder is trusted', () => {
+ // Clear any SANDBOX env var that might be set.
+ vi.stubEnv('SANDBOX', '');
+ const { lastFrame } = renderWithWidth(120, {
+ ...defaultProps,
+ isTrustedFolder: true,
+ });
+ expect(lastFrame()).toContain('no sandbox');
+ vi.unstubAllEnvs();
+ });
+
+ it('should prioritize untrusted message over sandbox info', () => {
+ vi.stubEnv('SANDBOX', 'gemini-cli-test-sandbox');
+ const { lastFrame } = renderWithWidth(120, {
+ ...defaultProps,
+ isTrustedFolder: false,
+ });
+ expect(lastFrame()).toContain('untrusted');
+ expect(lastFrame()).not.toMatch(/test-sandbox/s);
+ vi.unstubAllEnvs();
+ });
+ });
});
diff --git a/packages/cli/src/ui/components/Footer.tsx b/packages/cli/src/ui/components/Footer.tsx
index aaf6c176..09b94ec1 100644
--- a/packages/cli/src/ui/components/Footer.tsx
+++ b/packages/cli/src/ui/components/Footer.tsx
@@ -32,6 +32,7 @@ interface FooterProps {
promptTokenCount: number;
nightly: boolean;
vimMode?: string;
+ isTrustedFolder?: boolean;
}
export const Footer: React.FC<FooterProps> = ({
@@ -47,6 +48,7 @@ export const Footer: React.FC<FooterProps> = ({
promptTokenCount,
nightly,
vimMode,
+ isTrustedFolder,
}) => {
const { columns: terminalWidth } = useTerminalSize();
@@ -90,7 +92,7 @@ export const Footer: React.FC<FooterProps> = ({
)}
</Box>
- {/* Middle Section: Centered Sandbox Info */}
+ {/* Middle Section: Centered Trust/Sandbox Info */}
<Box
flexGrow={isNarrow ? 0 : 1}
alignItems="center"
@@ -99,7 +101,9 @@ export const Footer: React.FC<FooterProps> = ({
paddingX={isNarrow ? 0 : 1}
paddingTop={isNarrow ? 1 : 0}
>
- {process.env.SANDBOX && process.env.SANDBOX !== 'sandbox-exec' ? (
+ {isTrustedFolder === false ? (
+ <Text color={theme.status.warning}>untrusted</Text>
+ ) : process.env.SANDBOX && process.env.SANDBOX !== 'sandbox-exec' ? (
<Text color="green">
{process.env.SANDBOX.replace(/^gemini-(?:cli-)?/, '')}
</Text>