@google/gemini-cli 0.31.0-preview.1 → 0.31.0-preview.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/google-gemini-cli-0.31.0-preview.2.tgz +0 -0
- package/dist/package.json +2 -2
- package/dist/src/config/policy.d.ts +20 -0
- package/dist/src/config/policy.js +35 -7
- package/dist/src/config/policy.js.map +1 -1
- package/dist/src/config/policy.test.js +71 -24
- package/dist/src/config/policy.test.js.map +1 -1
- package/dist/src/config/workspace-policy-cli.test.js +48 -19
- package/dist/src/config/workspace-policy-cli.test.js.map +1 -1
- package/dist/src/core/auth.d.ts +7 -2
- package/dist/src/core/auth.js +20 -6
- package/dist/src/core/auth.js.map +1 -1
- package/dist/src/core/auth.test.js +40 -5
- package/dist/src/core/auth.test.js.map +1 -1
- package/dist/src/core/initializer.d.ts +2 -0
- package/dist/src/core/initializer.js +2 -1
- package/dist/src/core/initializer.js.map +1 -1
- package/dist/src/core/initializer.test.js +10 -2
- package/dist/src/core/initializer.test.js.map +1 -1
- package/dist/src/gemini.test.js +1 -0
- package/dist/src/gemini.test.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/test-utils/AppRig.js +3 -0
- package/dist/src/test-utils/AppRig.js.map +1 -1
- package/dist/src/test-utils/render.js +2 -0
- package/dist/src/test-utils/render.js.map +1 -1
- package/dist/src/ui/AppContainer.js +10 -1
- package/dist/src/ui/AppContainer.js.map +1 -1
- package/dist/src/ui/auth/BannedAccountDialog.d.ts +14 -0
- package/dist/src/ui/auth/BannedAccountDialog.js +66 -0
- package/dist/src/ui/auth/BannedAccountDialog.js.map +1 -0
- package/dist/src/ui/auth/BannedAccountDialog.test.d.ts +6 -0
- package/dist/src/ui/auth/BannedAccountDialog.test.js +150 -0
- package/dist/src/ui/auth/BannedAccountDialog.test.js.map +1 -0
- package/dist/src/ui/auth/useAuth.d.ts +4 -1
- package/dist/src/ui/auth/useAuth.js +16 -3
- package/dist/src/ui/auth/useAuth.js.map +1 -1
- package/dist/src/ui/components/DialogManager.js +8 -0
- package/dist/src/ui/components/DialogManager.js.map +1 -1
- package/dist/src/ui/contexts/UIActionsContext.d.ts +2 -0
- package/dist/src/ui/contexts/UIActionsContext.js.map +1 -1
- package/dist/src/ui/contexts/UIStateContext.d.ts +6 -0
- package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/dist/google-gemini-cli-0.31.0-preview.0.tgz +0 -0
|
Binary file
|
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@google/gemini-cli",
|
|
3
|
-
"version": "0.31.0-preview.
|
|
3
|
+
"version": "0.31.0-preview.3",
|
|
4
4
|
"description": "Gemini CLI",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"dist"
|
|
27
27
|
],
|
|
28
28
|
"config": {
|
|
29
|
-
"sandboxImageUri": "us-docker.pkg.dev/gemini-code-dev/gemini-cli/sandbox:0.31.0-preview.
|
|
29
|
+
"sandboxImageUri": "us-docker.pkg.dev/gemini-code-dev/gemini-cli/sandbox:0.31.0-preview.3"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"@agentclientprotocol/sdk": "^0.12.0",
|
|
@@ -5,6 +5,26 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { type PolicyEngineConfig, type ApprovalMode, type PolicyEngine, type MessageBus, Storage, type PolicyUpdateConfirmationRequest } from '@google/gemini-cli-core';
|
|
7
7
|
import { type Settings } from './settings.js';
|
|
8
|
+
/**
|
|
9
|
+
* Temporary flag to automatically accept workspace policies to reduce friction.
|
|
10
|
+
* Exported as 'let' to allow monkey patching in tests via the setter.
|
|
11
|
+
*/
|
|
12
|
+
export declare let autoAcceptWorkspacePolicies: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Sets the autoAcceptWorkspacePolicies flag.
|
|
15
|
+
* Used primarily for testing purposes.
|
|
16
|
+
*/
|
|
17
|
+
export declare function setAutoAcceptWorkspacePolicies(value: boolean): void;
|
|
18
|
+
/**
|
|
19
|
+
* Temporary flag to disable workspace level policies altogether.
|
|
20
|
+
* Exported as 'let' to allow monkey patching in tests via the setter.
|
|
21
|
+
*/
|
|
22
|
+
export declare let disableWorkspacePolicies: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Sets the disableWorkspacePolicies flag.
|
|
25
|
+
* Used primarily for testing purposes.
|
|
26
|
+
*/
|
|
27
|
+
export declare function setDisableWorkspacePolicies(value: boolean): void;
|
|
8
28
|
export declare function createPolicyEngineConfig(settings: Settings, approvalMode: ApprovalMode, workspacePoliciesDir?: string): Promise<PolicyEngineConfig>;
|
|
9
29
|
export declare function createPolicyUpdater(policyEngine: PolicyEngine, messageBus: MessageBus, storage: Storage): void;
|
|
10
30
|
export interface WorkspacePolicyState {
|
|
@@ -3,8 +3,32 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { createPolicyEngineConfig as createCorePolicyEngineConfig, createPolicyUpdater as createCorePolicyUpdater, PolicyIntegrityManager, IntegrityStatus, Storage, writeToStderr, } from '@google/gemini-cli-core';
|
|
6
|
+
import { createPolicyEngineConfig as createCorePolicyEngineConfig, createPolicyUpdater as createCorePolicyUpdater, PolicyIntegrityManager, IntegrityStatus, Storage, writeToStderr, debugLogger, } from '@google/gemini-cli-core';
|
|
7
7
|
import {} from './settings.js';
|
|
8
|
+
/**
|
|
9
|
+
* Temporary flag to automatically accept workspace policies to reduce friction.
|
|
10
|
+
* Exported as 'let' to allow monkey patching in tests via the setter.
|
|
11
|
+
*/
|
|
12
|
+
export let autoAcceptWorkspacePolicies = true;
|
|
13
|
+
/**
|
|
14
|
+
* Sets the autoAcceptWorkspacePolicies flag.
|
|
15
|
+
* Used primarily for testing purposes.
|
|
16
|
+
*/
|
|
17
|
+
export function setAutoAcceptWorkspacePolicies(value) {
|
|
18
|
+
autoAcceptWorkspacePolicies = value;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Temporary flag to disable workspace level policies altogether.
|
|
22
|
+
* Exported as 'let' to allow monkey patching in tests via the setter.
|
|
23
|
+
*/
|
|
24
|
+
export let disableWorkspacePolicies = true;
|
|
25
|
+
/**
|
|
26
|
+
* Sets the disableWorkspacePolicies flag.
|
|
27
|
+
* Used primarily for testing purposes.
|
|
28
|
+
*/
|
|
29
|
+
export function setDisableWorkspacePolicies(value) {
|
|
30
|
+
disableWorkspacePolicies = value;
|
|
31
|
+
}
|
|
8
32
|
export async function createPolicyEngineConfig(settings, approvalMode, workspacePoliciesDir) {
|
|
9
33
|
// Explicitly construct PolicySettings from Settings to ensure type safety
|
|
10
34
|
// and avoid accidental leakage of other settings properties.
|
|
@@ -27,7 +51,7 @@ export async function resolveWorkspacePolicyState(options) {
|
|
|
27
51
|
const { cwd, trustedFolder, interactive } = options;
|
|
28
52
|
let workspacePoliciesDir;
|
|
29
53
|
let policyUpdateConfirmationRequest;
|
|
30
|
-
if (trustedFolder) {
|
|
54
|
+
if (trustedFolder && !disableWorkspacePolicies) {
|
|
31
55
|
const storage = new Storage(cwd);
|
|
32
56
|
// If we are in the home directory (or rather, our target Gemini dir is the global one),
|
|
33
57
|
// don't treat it as a workspace to avoid loading global policies twice.
|
|
@@ -45,8 +69,8 @@ export async function resolveWorkspacePolicyState(options) {
|
|
|
45
69
|
// No workspace policies found
|
|
46
70
|
workspacePoliciesDir = undefined;
|
|
47
71
|
}
|
|
48
|
-
else if (interactive) {
|
|
49
|
-
// Policies changed or are new, and we are in interactive mode
|
|
72
|
+
else if (interactive && !autoAcceptWorkspacePolicies) {
|
|
73
|
+
// Policies changed or are new, and we are in interactive mode and auto-accept is disabled
|
|
50
74
|
policyUpdateConfirmationRequest = {
|
|
51
75
|
scope: 'workspace',
|
|
52
76
|
identifier: cwd,
|
|
@@ -55,11 +79,15 @@ export async function resolveWorkspacePolicyState(options) {
|
|
|
55
79
|
};
|
|
56
80
|
}
|
|
57
81
|
else {
|
|
58
|
-
// Non-interactive mode
|
|
82
|
+
// Non-interactive mode or auto-accept is enabled: automatically accept/load
|
|
59
83
|
await integrityManager.acceptIntegrity('workspace', cwd, integrityResult.hash);
|
|
60
84
|
workspacePoliciesDir = potentialWorkspacePoliciesDir;
|
|
61
|
-
|
|
62
|
-
|
|
85
|
+
if (!interactive) {
|
|
86
|
+
writeToStderr('WARNING: Workspace policies changed or are new. Automatically accepting and loading them.\n');
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
debugLogger.warn('Workspace policies changed or are new. Automatically accepting and loading them.');
|
|
90
|
+
}
|
|
63
91
|
}
|
|
64
92
|
}
|
|
65
93
|
return { workspacePoliciesDir, policyUpdateConfirmationRequest };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/config/policy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAML,wBAAwB,IAAI,4BAA4B,EACxD,mBAAmB,IAAI,uBAAuB,EAC9C,sBAAsB,EACtB,eAAe,EACf,OAAO,EAEP,aAAa,
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/config/policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
|
7
7
|
import * as fs from 'node:fs';
|
|
8
8
|
import * as path from 'node:path';
|
|
9
9
|
import * as os from 'node:os';
|
|
10
|
-
import { resolveWorkspacePolicyState } from './policy.js';
|
|
10
|
+
import { resolveWorkspacePolicyState, autoAcceptWorkspacePolicies, setAutoAcceptWorkspacePolicies, disableWorkspacePolicies, setDisableWorkspacePolicies, } from './policy.js';
|
|
11
11
|
import { writeToStderr } from '@google/gemini-cli-core';
|
|
12
12
|
// Mock debugLogger to avoid noise in test output
|
|
13
13
|
vi.mock('@google/gemini-cli-core', async (importOriginal) => {
|
|
@@ -34,6 +34,8 @@ describe('resolveWorkspacePolicyState', () => {
|
|
|
34
34
|
workspaceDir = path.join(tempDir, 'workspace');
|
|
35
35
|
fs.mkdirSync(workspaceDir);
|
|
36
36
|
policiesDir = path.join(workspaceDir, '.gemini', 'policies');
|
|
37
|
+
// Enable policies for these tests to verify loading logic
|
|
38
|
+
setDisableWorkspacePolicies(false);
|
|
37
39
|
vi.clearAllMocks();
|
|
38
40
|
});
|
|
39
41
|
afterEach(() => {
|
|
@@ -52,21 +54,25 @@ describe('resolveWorkspacePolicyState', () => {
|
|
|
52
54
|
policyUpdateConfirmationRequest: undefined,
|
|
53
55
|
});
|
|
54
56
|
});
|
|
57
|
+
it('should have disableWorkspacePolicies set to true by default', () => {
|
|
58
|
+
// We explicitly set it to false in beforeEach for other tests,
|
|
59
|
+
// so here we test that setting it to true works.
|
|
60
|
+
setDisableWorkspacePolicies(true);
|
|
61
|
+
expect(disableWorkspacePolicies).toBe(true);
|
|
62
|
+
});
|
|
55
63
|
it('should return policy directory if integrity matches', async () => {
|
|
56
64
|
// Set up policies directory with a file
|
|
57
65
|
fs.mkdirSync(policiesDir, { recursive: true });
|
|
58
66
|
fs.writeFileSync(path.join(policiesDir, 'policy.toml'), 'rules = []');
|
|
59
|
-
// First call to establish integrity (interactive accept)
|
|
67
|
+
// First call to establish integrity (interactive auto-accept)
|
|
60
68
|
const firstResult = await resolveWorkspacePolicyState({
|
|
61
69
|
cwd: workspaceDir,
|
|
62
70
|
trustedFolder: true,
|
|
63
71
|
interactive: true,
|
|
64
72
|
});
|
|
65
|
-
expect(firstResult.
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
const integrityManager = new PolicyIntegrityManager();
|
|
69
|
-
await integrityManager.acceptIntegrity('workspace', workspaceDir, firstResult.policyUpdateConfirmationRequest.newHash);
|
|
73
|
+
expect(firstResult.workspacePoliciesDir).toBe(policiesDir);
|
|
74
|
+
expect(firstResult.policyUpdateConfirmationRequest).toBeUndefined();
|
|
75
|
+
expect(writeToStderr).not.toHaveBeenCalled();
|
|
70
76
|
// Second call should match
|
|
71
77
|
const result = await resolveWorkspacePolicyState({
|
|
72
78
|
cwd: workspaceDir,
|
|
@@ -85,23 +91,30 @@ describe('resolveWorkspacePolicyState', () => {
|
|
|
85
91
|
expect(result.workspacePoliciesDir).toBeUndefined();
|
|
86
92
|
expect(result.policyUpdateConfirmationRequest).toBeUndefined();
|
|
87
93
|
});
|
|
88
|
-
it('should return confirmation request if changed in interactive mode', async () => {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
94
|
+
it('should return confirmation request if changed in interactive mode when AUTO_ACCEPT is false', async () => {
|
|
95
|
+
const originalValue = autoAcceptWorkspacePolicies;
|
|
96
|
+
setAutoAcceptWorkspacePolicies(false);
|
|
97
|
+
try {
|
|
98
|
+
fs.mkdirSync(policiesDir, { recursive: true });
|
|
99
|
+
fs.writeFileSync(path.join(policiesDir, 'policy.toml'), 'rules = []');
|
|
100
|
+
const result = await resolveWorkspacePolicyState({
|
|
101
|
+
cwd: workspaceDir,
|
|
102
|
+
trustedFolder: true,
|
|
103
|
+
interactive: true,
|
|
104
|
+
});
|
|
105
|
+
expect(result.workspacePoliciesDir).toBeUndefined();
|
|
106
|
+
expect(result.policyUpdateConfirmationRequest).toEqual({
|
|
107
|
+
scope: 'workspace',
|
|
108
|
+
identifier: workspaceDir,
|
|
109
|
+
policyDir: policiesDir,
|
|
110
|
+
newHash: expect.any(String),
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
setAutoAcceptWorkspacePolicies(originalValue);
|
|
115
|
+
}
|
|
103
116
|
});
|
|
104
|
-
it('should warn and auto-accept if changed in non-interactive mode', async () => {
|
|
117
|
+
it('should warn and auto-accept if changed in non-interactive mode when AUTO_ACCEPT is true', async () => {
|
|
105
118
|
fs.mkdirSync(policiesDir, { recursive: true });
|
|
106
119
|
fs.writeFileSync(path.join(policiesDir, 'policy.toml'), 'rules = []');
|
|
107
120
|
const result = await resolveWorkspacePolicyState({
|
|
@@ -113,6 +126,25 @@ describe('resolveWorkspacePolicyState', () => {
|
|
|
113
126
|
expect(result.policyUpdateConfirmationRequest).toBeUndefined();
|
|
114
127
|
expect(writeToStderr).toHaveBeenCalledWith(expect.stringContaining('Automatically accepting and loading'));
|
|
115
128
|
});
|
|
129
|
+
it('should warn and auto-accept if changed in non-interactive mode when AUTO_ACCEPT is false', async () => {
|
|
130
|
+
const originalValue = autoAcceptWorkspacePolicies;
|
|
131
|
+
setAutoAcceptWorkspacePolicies(false);
|
|
132
|
+
try {
|
|
133
|
+
fs.mkdirSync(policiesDir, { recursive: true });
|
|
134
|
+
fs.writeFileSync(path.join(policiesDir, 'policy.toml'), 'rules = []');
|
|
135
|
+
const result = await resolveWorkspacePolicyState({
|
|
136
|
+
cwd: workspaceDir,
|
|
137
|
+
trustedFolder: true,
|
|
138
|
+
interactive: false,
|
|
139
|
+
});
|
|
140
|
+
expect(result.workspacePoliciesDir).toBe(policiesDir);
|
|
141
|
+
expect(result.policyUpdateConfirmationRequest).toBeUndefined();
|
|
142
|
+
expect(writeToStderr).toHaveBeenCalledWith(expect.stringContaining('Automatically accepting and loading'));
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
setAutoAcceptWorkspacePolicies(originalValue);
|
|
146
|
+
}
|
|
147
|
+
});
|
|
116
148
|
it('should not return workspace policies if cwd is the home directory', async () => {
|
|
117
149
|
const policiesDir = path.join(tempDir, '.gemini', 'policies');
|
|
118
150
|
fs.mkdirSync(policiesDir, { recursive: true });
|
|
@@ -126,7 +158,22 @@ describe('resolveWorkspacePolicyState', () => {
|
|
|
126
158
|
expect(result.workspacePoliciesDir).toBeUndefined();
|
|
127
159
|
expect(result.policyUpdateConfirmationRequest).toBeUndefined();
|
|
128
160
|
});
|
|
129
|
-
it('should
|
|
161
|
+
it('should return empty state if disableWorkspacePolicies is true even if folder is trusted', async () => {
|
|
162
|
+
setDisableWorkspacePolicies(true);
|
|
163
|
+
// Set up policies directory with a file
|
|
164
|
+
fs.mkdirSync(policiesDir, { recursive: true });
|
|
165
|
+
fs.writeFileSync(path.join(policiesDir, 'policy.toml'), 'rules = []');
|
|
166
|
+
const result = await resolveWorkspacePolicyState({
|
|
167
|
+
cwd: workspaceDir,
|
|
168
|
+
trustedFolder: true,
|
|
169
|
+
interactive: true,
|
|
170
|
+
});
|
|
171
|
+
expect(result).toEqual({
|
|
172
|
+
workspacePoliciesDir: undefined,
|
|
173
|
+
policyUpdateConfirmationRequest: undefined,
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
it('should return empty state if cwd is a symlink to the home directory', async () => {
|
|
130
177
|
const policiesDir = path.join(tempDir, '.gemini', 'policies');
|
|
131
178
|
fs.mkdirSync(policiesDir, { recursive: true });
|
|
132
179
|
fs.writeFileSync(path.join(policiesDir, 'policy.toml'), 'rules = []');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.test.js","sourceRoot":"","sources":["../../../src/config/policy.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,
|
|
1
|
+
{"version":3,"file":"policy.test.js","sourceRoot":"","sources":["../../../src/config/policy.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ import { loadCliConfig } from './config.js';
|
|
|
9
9
|
import { createTestMergedSettings } from './settings.js';
|
|
10
10
|
import * as ServerConfig from '@google/gemini-cli-core';
|
|
11
11
|
import { isWorkspaceTrusted } from './trustedFolders.js';
|
|
12
|
+
import * as Policy from './policy.js';
|
|
12
13
|
// Mock dependencies
|
|
13
14
|
vi.mock('./trustedFolders.js', () => ({
|
|
14
15
|
isWorkspaceTrusted: vi.fn(),
|
|
@@ -45,6 +46,7 @@ describe('Workspace-Level Policy CLI Integration', () => {
|
|
|
45
46
|
const MOCK_CWD = process.cwd();
|
|
46
47
|
beforeEach(() => {
|
|
47
48
|
vi.clearAllMocks();
|
|
49
|
+
Policy.setDisableWorkspacePolicies(false);
|
|
48
50
|
// Default to MATCH for existing tests
|
|
49
51
|
mockCheckIntegrity.mockResolvedValue({
|
|
50
52
|
status: 'match',
|
|
@@ -118,7 +120,7 @@ describe('Workspace-Level Policy CLI Integration', () => {
|
|
|
118
120
|
workspacePoliciesDir: expect.stringContaining(path.join('.gemini', 'policies')),
|
|
119
121
|
}), expect.anything());
|
|
120
122
|
});
|
|
121
|
-
it('should
|
|
123
|
+
it('should automatically accept and load workspacePoliciesDir if integrity MISMATCH in interactive mode when AUTO_ACCEPT is true', async () => {
|
|
122
124
|
vi.mocked(isWorkspaceTrusted).mockReturnValue({
|
|
123
125
|
isTrusted: true,
|
|
124
126
|
source: 'file',
|
|
@@ -137,20 +139,13 @@ describe('Workspace-Level Policy CLI Integration', () => {
|
|
|
137
139
|
const config = await loadCliConfig(settings, 'test-session', argv, {
|
|
138
140
|
cwd: MOCK_CWD,
|
|
139
141
|
});
|
|
140
|
-
expect(config.getPolicyUpdateConfirmationRequest()).
|
|
141
|
-
|
|
142
|
-
identifier: MOCK_CWD,
|
|
143
|
-
policyDir: expect.stringContaining(path.join('.gemini', 'policies')),
|
|
144
|
-
newHash: 'new-hash',
|
|
145
|
-
});
|
|
146
|
-
// In interactive mode without accept flag, it waits for user confirmation (handled by UI),
|
|
147
|
-
// so it currently DOES NOT pass the directory to createPolicyEngineConfig yet.
|
|
148
|
-
// The UI will handle the confirmation and reload/update.
|
|
142
|
+
expect(config.getPolicyUpdateConfirmationRequest()).toBeUndefined();
|
|
143
|
+
expect(mockAcceptIntegrity).toHaveBeenCalledWith('workspace', MOCK_CWD, 'new-hash');
|
|
149
144
|
expect(ServerConfig.createPolicyEngineConfig).toHaveBeenCalledWith(expect.objectContaining({
|
|
150
|
-
workspacePoliciesDir:
|
|
145
|
+
workspacePoliciesDir: expect.stringContaining(path.join('.gemini', 'policies')),
|
|
151
146
|
}), expect.anything());
|
|
152
147
|
});
|
|
153
|
-
it('should
|
|
148
|
+
it('should automatically accept and load workspacePoliciesDir if integrity is NEW in interactive mode when AUTO_ACCEPT is true', async () => {
|
|
154
149
|
vi.mocked(isWorkspaceTrusted).mockReturnValue({
|
|
155
150
|
isTrusted: true,
|
|
156
151
|
source: 'file',
|
|
@@ -166,15 +161,49 @@ describe('Workspace-Level Policy CLI Integration', () => {
|
|
|
166
161
|
const config = await loadCliConfig(settings, 'test-session', argv, {
|
|
167
162
|
cwd: MOCK_CWD,
|
|
168
163
|
});
|
|
169
|
-
expect(config.getPolicyUpdateConfirmationRequest()).
|
|
170
|
-
|
|
171
|
-
identifier: MOCK_CWD,
|
|
172
|
-
policyDir: expect.stringContaining(path.join('.gemini', 'policies')),
|
|
173
|
-
newHash: 'new-hash',
|
|
174
|
-
});
|
|
164
|
+
expect(config.getPolicyUpdateConfirmationRequest()).toBeUndefined();
|
|
165
|
+
expect(mockAcceptIntegrity).toHaveBeenCalledWith('workspace', MOCK_CWD, 'new-hash');
|
|
175
166
|
expect(ServerConfig.createPolicyEngineConfig).toHaveBeenCalledWith(expect.objectContaining({
|
|
176
|
-
workspacePoliciesDir:
|
|
167
|
+
workspacePoliciesDir: expect.stringContaining(path.join('.gemini', 'policies')),
|
|
177
168
|
}), expect.anything());
|
|
178
169
|
});
|
|
170
|
+
it('should set policyUpdateConfirmationRequest if integrity MISMATCH in interactive mode when AUTO_ACCEPT is false', async () => {
|
|
171
|
+
// Monkey patch autoAcceptWorkspacePolicies using setter
|
|
172
|
+
const originalValue = Policy.autoAcceptWorkspacePolicies;
|
|
173
|
+
Policy.setAutoAcceptWorkspacePolicies(false);
|
|
174
|
+
try {
|
|
175
|
+
vi.mocked(isWorkspaceTrusted).mockReturnValue({
|
|
176
|
+
isTrusted: true,
|
|
177
|
+
source: 'file',
|
|
178
|
+
});
|
|
179
|
+
mockCheckIntegrity.mockResolvedValue({
|
|
180
|
+
status: 'mismatch',
|
|
181
|
+
hash: 'new-hash',
|
|
182
|
+
fileCount: 1,
|
|
183
|
+
});
|
|
184
|
+
vi.mocked(ServerConfig.isHeadlessMode).mockReturnValue(false); // Interactive
|
|
185
|
+
const settings = createTestMergedSettings();
|
|
186
|
+
const argv = {
|
|
187
|
+
query: 'test',
|
|
188
|
+
promptInteractive: 'test',
|
|
189
|
+
};
|
|
190
|
+
const config = await loadCliConfig(settings, 'test-session', argv, {
|
|
191
|
+
cwd: MOCK_CWD,
|
|
192
|
+
});
|
|
193
|
+
expect(config.getPolicyUpdateConfirmationRequest()).toEqual({
|
|
194
|
+
scope: 'workspace',
|
|
195
|
+
identifier: MOCK_CWD,
|
|
196
|
+
policyDir: expect.stringContaining(path.join('.gemini', 'policies')),
|
|
197
|
+
newHash: 'new-hash',
|
|
198
|
+
});
|
|
199
|
+
expect(ServerConfig.createPolicyEngineConfig).toHaveBeenCalledWith(expect.objectContaining({
|
|
200
|
+
workspacePoliciesDir: undefined,
|
|
201
|
+
}), expect.anything());
|
|
202
|
+
}
|
|
203
|
+
finally {
|
|
204
|
+
// Restore for other tests
|
|
205
|
+
Policy.setAutoAcceptWorkspacePolicies(originalValue);
|
|
206
|
+
}
|
|
207
|
+
});
|
|
179
208
|
});
|
|
180
209
|
//# sourceMappingURL=workspace-policy-cli.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-policy-cli.test.js","sourceRoot":"","sources":["../../../src/config/workspace-policy-cli.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAgB,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,KAAK,YAAY,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"workspace-policy-cli.test.js","sourceRoot":"","sources":["../../../src/config/workspace-policy-cli.test.ts"],"names":[],"mappings":"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"}
|
package/dist/src/core/auth.d.ts
CHANGED
|
@@ -4,10 +4,15 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { type AuthType, type Config } from '@google/gemini-cli-core';
|
|
7
|
+
import type { AccountSuspensionInfo } from '../ui/contexts/UIStateContext.js';
|
|
8
|
+
export interface InitialAuthResult {
|
|
9
|
+
authError: string | null;
|
|
10
|
+
accountSuspensionInfo: AccountSuspensionInfo | null;
|
|
11
|
+
}
|
|
7
12
|
/**
|
|
8
13
|
* Handles the initial authentication flow.
|
|
9
14
|
* @param config The application config.
|
|
10
15
|
* @param authType The selected auth type.
|
|
11
|
-
* @returns
|
|
16
|
+
* @returns The auth result with error message and account suspension status.
|
|
12
17
|
*/
|
|
13
|
-
export declare function performInitialAuth(config: Config, authType: AuthType | undefined): Promise<
|
|
18
|
+
export declare function performInitialAuth(config: Config, authType: AuthType | undefined): Promise<InitialAuthResult>;
|
package/dist/src/core/auth.js
CHANGED
|
@@ -3,16 +3,16 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { getErrorMessage, ValidationRequiredError, } from '@google/gemini-cli-core';
|
|
6
|
+
import { getErrorMessage, ValidationRequiredError, isAccountSuspendedError, } from '@google/gemini-cli-core';
|
|
7
7
|
/**
|
|
8
8
|
* Handles the initial authentication flow.
|
|
9
9
|
* @param config The application config.
|
|
10
10
|
* @param authType The selected auth type.
|
|
11
|
-
* @returns
|
|
11
|
+
* @returns The auth result with error message and account suspension status.
|
|
12
12
|
*/
|
|
13
13
|
export async function performInitialAuth(config, authType) {
|
|
14
14
|
if (!authType) {
|
|
15
|
-
return null;
|
|
15
|
+
return { authError: null, accountSuspensionInfo: null };
|
|
16
16
|
}
|
|
17
17
|
try {
|
|
18
18
|
await config.refreshAuth(authType);
|
|
@@ -23,10 +23,24 @@ export async function performInitialAuth(config, authType) {
|
|
|
23
23
|
if (e instanceof ValidationRequiredError) {
|
|
24
24
|
// Don't treat validation required as a fatal auth error during startup.
|
|
25
25
|
// This allows the React UI to load and show the ValidationDialog.
|
|
26
|
-
return null;
|
|
26
|
+
return { authError: null, accountSuspensionInfo: null };
|
|
27
27
|
}
|
|
28
|
-
|
|
28
|
+
const suspendedError = isAccountSuspendedError(e);
|
|
29
|
+
if (suspendedError) {
|
|
30
|
+
return {
|
|
31
|
+
authError: null,
|
|
32
|
+
accountSuspensionInfo: {
|
|
33
|
+
message: suspendedError.message,
|
|
34
|
+
appealUrl: suspendedError.appealUrl,
|
|
35
|
+
appealLinkText: suspendedError.appealLinkText,
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
authError: `Failed to login. Message: ${getErrorMessage(e)}`,
|
|
41
|
+
accountSuspensionInfo: null,
|
|
42
|
+
};
|
|
29
43
|
}
|
|
30
|
-
return null;
|
|
44
|
+
return { authError: null, accountSuspensionInfo: null };
|
|
31
45
|
}
|
|
32
46
|
//# sourceMappingURL=auth.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/core/auth.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAGL,eAAe,EACf,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/core/auth.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAGL,eAAe,EACf,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AASjC;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAc,EACd,QAA8B;IAE9B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC;IAC1D,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACnC,kDAAkD;QAClD,0DAA0D;IAC5D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,uBAAuB,EAAE,CAAC;YACzC,wEAAwE;YACxE,kEAAkE;YAClE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC;QAC1D,CAAC;QACD,MAAM,cAAc,GAAG,uBAAuB,CAAC,CAAC,CAAC,CAAC;QAClD,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO;gBACL,SAAS,EAAE,IAAI;gBACf,qBAAqB,EAAE;oBACrB,OAAO,EAAE,cAAc,CAAC,OAAO;oBAC/B,SAAS,EAAE,cAAc,CAAC,SAAS;oBACnC,cAAc,EAAE,cAAc,CAAC,cAAc;iBAC9C;aACF,CAAC;QACJ,CAAC;QACD,OAAO;YACL,SAAS,EAAE,6BAA6B,eAAe,CAAC,CAAC,CAAC,EAAE;YAC5D,qBAAqB,EAAE,IAAI;SAC5B,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC;AAC1D,CAAC"}
|
|
@@ -10,7 +10,6 @@ vi.mock('@google/gemini-cli-core', async (importOriginal) => {
|
|
|
10
10
|
const actual = await importOriginal();
|
|
11
11
|
return {
|
|
12
12
|
...actual,
|
|
13
|
-
getErrorMessage: (e) => e.message,
|
|
14
13
|
};
|
|
15
14
|
});
|
|
16
15
|
describe('auth', () => {
|
|
@@ -22,25 +21,61 @@ describe('auth', () => {
|
|
|
22
21
|
});
|
|
23
22
|
it('should return null if authType is undefined', async () => {
|
|
24
23
|
const result = await performInitialAuth(mockConfig, undefined);
|
|
25
|
-
expect(result).
|
|
24
|
+
expect(result).toEqual({ authError: null, accountSuspensionInfo: null });
|
|
26
25
|
expect(mockConfig.refreshAuth).not.toHaveBeenCalled();
|
|
27
26
|
});
|
|
28
27
|
it('should return null on successful auth', async () => {
|
|
29
28
|
const result = await performInitialAuth(mockConfig, AuthType.LOGIN_WITH_GOOGLE);
|
|
30
|
-
expect(result).
|
|
29
|
+
expect(result).toEqual({ authError: null, accountSuspensionInfo: null });
|
|
31
30
|
expect(mockConfig.refreshAuth).toHaveBeenCalledWith(AuthType.LOGIN_WITH_GOOGLE);
|
|
32
31
|
});
|
|
33
32
|
it('should return error message on failed auth', async () => {
|
|
34
33
|
const error = new Error('Auth failed');
|
|
35
34
|
vi.mocked(mockConfig.refreshAuth).mockRejectedValue(error);
|
|
36
35
|
const result = await performInitialAuth(mockConfig, AuthType.LOGIN_WITH_GOOGLE);
|
|
37
|
-
expect(result).
|
|
36
|
+
expect(result).toEqual({
|
|
37
|
+
authError: 'Failed to login. Message: Auth failed',
|
|
38
|
+
accountSuspensionInfo: null,
|
|
39
|
+
});
|
|
38
40
|
expect(mockConfig.refreshAuth).toHaveBeenCalledWith(AuthType.LOGIN_WITH_GOOGLE);
|
|
39
41
|
});
|
|
40
42
|
it('should return null if refreshAuth throws ValidationRequiredError', async () => {
|
|
41
43
|
vi.mocked(mockConfig.refreshAuth).mockRejectedValue(new ValidationRequiredError('Validation required'));
|
|
42
44
|
const result = await performInitialAuth(mockConfig, AuthType.LOGIN_WITH_GOOGLE);
|
|
43
|
-
expect(result).
|
|
45
|
+
expect(result).toEqual({ authError: null, accountSuspensionInfo: null });
|
|
46
|
+
expect(mockConfig.refreshAuth).toHaveBeenCalledWith(AuthType.LOGIN_WITH_GOOGLE);
|
|
47
|
+
});
|
|
48
|
+
it('should return accountSuspensionInfo for 403 TOS_VIOLATION error', async () => {
|
|
49
|
+
vi.mocked(mockConfig.refreshAuth).mockRejectedValue({
|
|
50
|
+
response: {
|
|
51
|
+
data: {
|
|
52
|
+
error: {
|
|
53
|
+
code: 403,
|
|
54
|
+
message: 'This service has been disabled for violation of Terms of Service.',
|
|
55
|
+
details: [
|
|
56
|
+
{
|
|
57
|
+
'@type': 'type.googleapis.com/google.rpc.ErrorInfo',
|
|
58
|
+
reason: 'TOS_VIOLATION',
|
|
59
|
+
domain: 'example.googleapis.com',
|
|
60
|
+
metadata: {
|
|
61
|
+
appeal_url: 'https://example.com/appeal',
|
|
62
|
+
appeal_url_link_text: 'Appeal Here',
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
const result = await performInitialAuth(mockConfig, AuthType.LOGIN_WITH_GOOGLE);
|
|
71
|
+
expect(result).toEqual({
|
|
72
|
+
authError: null,
|
|
73
|
+
accountSuspensionInfo: {
|
|
74
|
+
message: 'This service has been disabled for violation of Terms of Service.',
|
|
75
|
+
appealUrl: 'https://example.com/appeal',
|
|
76
|
+
appealLinkText: 'Appeal Here',
|
|
77
|
+
},
|
|
78
|
+
});
|
|
44
79
|
expect(mockConfig.refreshAuth).toHaveBeenCalledWith(AuthType.LOGIN_WITH_GOOGLE);
|
|
45
80
|
});
|
|
46
81
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.test.js","sourceRoot":"","sources":["../../../src/core/auth.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAEL,uBAAuB,EACvB,QAAQ,GACT,MAAM,yBAAyB,CAAC;AAEjC,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;IAC1D,MAAM,MAAM,GACV,MAAM,cAAc,EAA4C,CAAC;IACnE,OAAO;QACL,GAAG,MAAM;
|
|
1
|
+
{"version":3,"file":"auth.test.js","sourceRoot":"","sources":["../../../src/core/auth.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAEL,uBAAuB,EACvB,QAAQ,GACT,MAAM,yBAAyB,CAAC;AAEjC,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;IAC1D,MAAM,MAAM,GACV,MAAM,cAAc,EAA4C,CAAC;IACnE,OAAO;QACL,GAAG,MAAM;KACV,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;IACpB,IAAI,UAAkB,CAAC;IAEvB,UAAU,CAAC,GAAG,EAAE;QACd,UAAU,GAAG;YACX,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE;SACA,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC,CAAC;QACzE,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CACrC,UAAU,EACV,QAAQ,CAAC,iBAAiB,CAC3B,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC,CAAC;QACzE,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,oBAAoB,CACjD,QAAQ,CAAC,iBAAiB,CAC3B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;QACvC,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,MAAM,kBAAkB,CACrC,UAAU,EACV,QAAQ,CAAC,iBAAiB,CAC3B,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,SAAS,EAAE,uCAAuC;YAClD,qBAAqB,EAAE,IAAI;SAC5B,CAAC,CAAC;QACH,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,oBAAoB,CACjD,QAAQ,CAAC,iBAAiB,CAC3B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,iBAAiB,CACjD,IAAI,uBAAuB,CAAC,qBAAqB,CAAC,CACnD,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,kBAAkB,CACrC,UAAU,EACV,QAAQ,CAAC,iBAAiB,CAC3B,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC,CAAC;QACzE,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,oBAAoB,CACjD,QAAQ,CAAC,iBAAiB,CAC3B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,iBAAiB,CAAC;YAClD,QAAQ,EAAE;gBACR,IAAI,EAAE;oBACJ,KAAK,EAAE;wBACL,IAAI,EAAE,GAAG;wBACT,OAAO,EACL,mEAAmE;wBACrE,OAAO,EAAE;4BACP;gCACE,OAAO,EAAE,0CAA0C;gCACnD,MAAM,EAAE,eAAe;gCACvB,MAAM,EAAE,wBAAwB;gCAChC,QAAQ,EAAE;oCACR,UAAU,EAAE,4BAA4B;oCACxC,oBAAoB,EAAE,aAAa;iCACpC;6BACF;yBACF;qBACF;iBACF;aACF;SACF,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,kBAAkB,CACrC,UAAU,EACV,QAAQ,CAAC,iBAAiB,CAC3B,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,SAAS,EAAE,IAAI;YACf,qBAAqB,EAAE;gBACrB,OAAO,EACL,mEAAmE;gBACrE,SAAS,EAAE,4BAA4B;gBACvC,cAAc,EAAE,aAAa;aAC9B;SACF,CAAC,CAAC;QACH,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,oBAAoB,CACjD,QAAQ,CAAC,iBAAiB,CAC3B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -5,8 +5,10 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { type Config } from '@google/gemini-cli-core';
|
|
7
7
|
import { type LoadedSettings } from '../config/settings.js';
|
|
8
|
+
import type { AccountSuspensionInfo } from '../ui/contexts/UIStateContext.js';
|
|
8
9
|
export interface InitializationResult {
|
|
9
10
|
authError: string | null;
|
|
11
|
+
accountSuspensionInfo: AccountSuspensionInfo | null;
|
|
10
12
|
themeError: string | null;
|
|
11
13
|
shouldOpenAuthDialog: boolean;
|
|
12
14
|
geminiMdFileCount: number;
|