@google/gemini-cli 0.12.0-nightly.20251027.cb0947c5 → 0.12.0-preview.11

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.
Files changed (179) hide show
  1. package/README.md +7 -5
  2. package/dist/package.json +2 -2
  3. package/dist/src/commands/extensions/disable.d.ts +1 -1
  4. package/dist/src/commands/extensions/disable.js +5 -4
  5. package/dist/src/commands/extensions/disable.js.map +1 -1
  6. package/dist/src/commands/extensions/enable.d.ts +1 -1
  7. package/dist/src/commands/extensions/enable.js +3 -2
  8. package/dist/src/commands/extensions/enable.js.map +1 -1
  9. package/dist/src/commands/extensions/install.js +2 -1
  10. package/dist/src/commands/extensions/install.js.map +1 -1
  11. package/dist/src/commands/extensions/install.test.js +1 -0
  12. package/dist/src/commands/extensions/install.test.js.map +1 -1
  13. package/dist/src/commands/extensions/link.js +2 -1
  14. package/dist/src/commands/extensions/link.js.map +1 -1
  15. package/dist/src/commands/extensions/list.js +2 -2
  16. package/dist/src/commands/extensions/list.js.map +1 -1
  17. package/dist/src/commands/extensions/uninstall.js +2 -1
  18. package/dist/src/commands/extensions/uninstall.js.map +1 -1
  19. package/dist/src/commands/extensions/update.js +2 -2
  20. package/dist/src/commands/extensions/update.js.map +1 -1
  21. package/dist/src/commands/mcp/list.js +2 -2
  22. package/dist/src/commands/mcp/list.js.map +1 -1
  23. package/dist/src/config/config.d.ts +5 -3
  24. package/dist/src/config/config.js +43 -10
  25. package/dist/src/config/config.js.map +1 -1
  26. package/dist/src/config/config.test.js +192 -171
  27. package/dist/src/config/config.test.js.map +1 -1
  28. package/dist/src/config/extension-manager.d.ts +23 -10
  29. package/dist/src/config/extension-manager.js +89 -62
  30. package/dist/src/config/extension-manager.js.map +1 -1
  31. package/dist/src/config/extension.test.js +158 -74
  32. package/dist/src/config/extension.test.js.map +1 -1
  33. package/dist/src/config/extensions/extensionSettings.d.ts +3 -3
  34. package/dist/src/config/extensions/extensionSettings.js +74 -24
  35. package/dist/src/config/extensions/extensionSettings.js.map +1 -1
  36. package/dist/src/config/extensions/extensionSettings.test.js +145 -24
  37. package/dist/src/config/extensions/extensionSettings.test.js.map +1 -1
  38. package/dist/src/config/extensions/github.js +3 -3
  39. package/dist/src/config/extensions/github.js.map +1 -1
  40. package/dist/src/config/extensions/github.test.js +1 -1
  41. package/dist/src/config/extensions/github.test.js.map +1 -1
  42. package/dist/src/config/extensions/update.js +7 -6
  43. package/dist/src/config/extensions/update.js.map +1 -1
  44. package/dist/src/config/extensions/update.test.js +54 -31
  45. package/dist/src/config/extensions/update.test.js.map +1 -1
  46. package/dist/src/config/keyBindings.js +1 -1
  47. package/dist/src/config/keyBindings.js.map +1 -1
  48. package/dist/src/config/policies/read-only.toml +56 -0
  49. package/dist/src/config/policies/write.toml +63 -0
  50. package/dist/src/config/policies/yolo.toml +31 -0
  51. package/dist/src/config/policy-engine.integration.test.js +41 -38
  52. package/dist/src/config/policy-engine.integration.test.js.map +1 -1
  53. package/dist/src/config/policy-toml-loader.d.ts +46 -0
  54. package/dist/src/config/policy-toml-loader.js +314 -0
  55. package/dist/src/config/policy-toml-loader.js.map +1 -0
  56. package/dist/src/config/policy-toml-loader.test.d.ts +6 -0
  57. package/dist/src/config/policy-toml-loader.test.js +626 -0
  58. package/dist/src/config/policy-toml-loader.test.js.map +1 -0
  59. package/dist/src/config/policy.d.ts +9 -2
  60. package/dist/src/config/policy.js +139 -110
  61. package/dist/src/config/policy.js.map +1 -1
  62. package/dist/src/config/policy.test.js +780 -82
  63. package/dist/src/config/policy.test.js.map +1 -1
  64. package/dist/src/config/settings.js +1 -1
  65. package/dist/src/config/settings.js.map +1 -1
  66. package/dist/src/config/settings.test.js +17 -57
  67. package/dist/src/config/settings.test.js.map +1 -1
  68. package/dist/src/config/settingsSchema.d.ts +18 -9
  69. package/dist/src/config/settingsSchema.js +17 -8
  70. package/dist/src/config/settingsSchema.js.map +1 -1
  71. package/dist/src/config/settingsSchema.test.js +2 -0
  72. package/dist/src/config/settingsSchema.test.js.map +1 -1
  73. package/dist/src/gemini.js +6 -17
  74. package/dist/src/gemini.js.map +1 -1
  75. package/dist/src/gemini.test.js +1 -0
  76. package/dist/src/gemini.test.js.map +1 -1
  77. package/dist/src/generated/git-commit.d.ts +2 -2
  78. package/dist/src/generated/git-commit.js +2 -2
  79. package/dist/src/generated/git-commit.js.map +1 -1
  80. package/dist/src/test-utils/render.d.ts +12 -0
  81. package/dist/src/test-utils/render.js +28 -1
  82. package/dist/src/test-utils/render.js.map +1 -1
  83. package/dist/src/test-utils/render.test.d.ts +6 -0
  84. package/dist/src/test-utils/render.test.js +54 -0
  85. package/dist/src/test-utils/render.test.js.map +1 -0
  86. package/dist/src/ui/AppContainer.js +33 -22
  87. package/dist/src/ui/AppContainer.js.map +1 -1
  88. package/dist/src/ui/AppContainer.test.js +30 -1
  89. package/dist/src/ui/AppContainer.test.js.map +1 -1
  90. package/dist/src/ui/commands/directoryCommand.js +1 -1
  91. package/dist/src/ui/commands/directoryCommand.js.map +1 -1
  92. package/dist/src/ui/commands/extensionsCommand.js +45 -1
  93. package/dist/src/ui/commands/extensionsCommand.js.map +1 -1
  94. package/dist/src/ui/commands/extensionsCommand.test.js +64 -1
  95. package/dist/src/ui/commands/extensionsCommand.test.js.map +1 -1
  96. package/dist/src/ui/commands/memoryCommand.js +1 -1
  97. package/dist/src/ui/commands/memoryCommand.js.map +1 -1
  98. package/dist/src/ui/commands/memoryCommand.test.js +3 -1
  99. package/dist/src/ui/commands/memoryCommand.test.js.map +1 -1
  100. package/dist/src/ui/components/ConsoleSummaryDisplay.js +1 -1
  101. package/dist/src/ui/components/ConsoleSummaryDisplay.js.map +1 -1
  102. package/dist/src/ui/components/DetailedMessagesDisplay.js +1 -1
  103. package/dist/src/ui/components/DetailedMessagesDisplay.js.map +1 -1
  104. package/dist/src/ui/components/FolderTrustDialog.test.js +4 -5
  105. package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
  106. package/dist/src/ui/components/Footer.js +4 -3
  107. package/dist/src/ui/components/Footer.js.map +1 -1
  108. package/dist/src/ui/components/Footer.test.js +83 -0
  109. package/dist/src/ui/components/Footer.test.js.map +1 -1
  110. package/dist/src/ui/components/Help.test.js +0 -1
  111. package/dist/src/ui/components/Help.test.js.map +1 -1
  112. package/dist/src/ui/components/ModelDialog.test.js +5 -6
  113. package/dist/src/ui/components/ModelDialog.test.js.map +1 -1
  114. package/dist/src/ui/components/Notifications.js +38 -5
  115. package/dist/src/ui/components/Notifications.js.map +1 -1
  116. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js +11 -13
  117. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js.map +1 -1
  118. package/dist/src/ui/components/SettingsDialog.test.js +12 -14
  119. package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
  120. package/dist/src/ui/components/shared/BaseSelectionList.test.js +11 -13
  121. package/dist/src/ui/components/shared/BaseSelectionList.test.js.map +1 -1
  122. package/dist/src/ui/components/shared/text-buffer.test.js +2 -2
  123. package/dist/src/ui/components/shared/text-buffer.test.js.map +1 -1
  124. package/dist/src/ui/contexts/KeypressContext.js +8 -29
  125. package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
  126. package/dist/src/ui/contexts/KeypressContext.test.js +90 -73
  127. package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
  128. package/dist/src/ui/contexts/SessionContext.test.js +27 -14
  129. package/dist/src/ui/contexts/SessionContext.test.js.map +1 -1
  130. package/dist/src/ui/hooks/atCommandProcessor.js +2 -2
  131. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
  132. package/dist/src/ui/hooks/useAtCompletion.test.js +32 -23
  133. package/dist/src/ui/hooks/useAtCompletion.test.js.map +1 -1
  134. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js +2 -2
  135. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js.map +1 -1
  136. package/dist/src/ui/hooks/useExtensionUpdates.d.ts +1 -2
  137. package/dist/src/ui/hooks/useExtensionUpdates.js +2 -1
  138. package/dist/src/ui/hooks/useExtensionUpdates.js.map +1 -1
  139. package/dist/src/ui/hooks/useExtensionUpdates.test.js +14 -20
  140. package/dist/src/ui/hooks/useExtensionUpdates.test.js.map +1 -1
  141. package/dist/src/ui/hooks/useFlickerDetector.test.js +9 -6
  142. package/dist/src/ui/hooks/useFlickerDetector.test.js.map +1 -1
  143. package/dist/src/ui/hooks/useFolderTrust.test.js +45 -23
  144. package/dist/src/ui/hooks/useFolderTrust.test.js.map +1 -1
  145. package/dist/src/ui/hooks/useGeminiStream.js +7 -5
  146. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  147. package/dist/src/ui/hooks/useGeminiStream.test.js +42 -41
  148. package/dist/src/ui/hooks/useGeminiStream.test.js.map +1 -1
  149. package/dist/src/ui/hooks/useHistoryManager.test.js +2 -2
  150. package/dist/src/ui/hooks/useHistoryManager.test.js.map +1 -1
  151. package/dist/src/ui/hooks/useInputHistory.test.js +2 -2
  152. package/dist/src/ui/hooks/useInputHistory.test.js.map +1 -1
  153. package/dist/src/ui/hooks/useInputHistoryStore.test.js +2 -2
  154. package/dist/src/ui/hooks/useInputHistoryStore.test.js.map +1 -1
  155. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js +2 -3
  156. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js.map +1 -1
  157. package/dist/src/ui/hooks/usePhraseCycler.js +1 -1
  158. package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -1
  159. package/dist/src/ui/hooks/usePhraseCycler.test.js +83 -111
  160. package/dist/src/ui/hooks/usePhraseCycler.test.js.map +1 -1
  161. package/dist/src/ui/hooks/useQuotaAndFallback.test.js +2 -2
  162. package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +1 -1
  163. package/dist/src/ui/hooks/useReactToolScheduler.test.js +1 -2
  164. package/dist/src/ui/hooks/useReactToolScheduler.test.js.map +1 -1
  165. package/dist/src/ui/hooks/useReverseSearchCompletion.test.js +2 -2
  166. package/dist/src/ui/hooks/useReverseSearchCompletion.test.js.map +1 -1
  167. package/dist/src/ui/hooks/useShellHistory.test.js +40 -17
  168. package/dist/src/ui/hooks/useShellHistory.test.js.map +1 -1
  169. package/dist/src/ui/hooks/useSlashCompletion.test.js +54 -49
  170. package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -1
  171. package/dist/src/ui/hooks/useToolScheduler.test.js +48 -42
  172. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
  173. package/dist/src/ui/keyMatchers.test.js +3 -3
  174. package/dist/src/ui/keyMatchers.test.js.map +1 -1
  175. package/dist/src/zed-integration/zedIntegration.d.ts +2 -2
  176. package/dist/src/zed-integration/zedIntegration.js +4 -6
  177. package/dist/src/zed-integration/zedIntegration.js.map +1 -1
  178. package/dist/tsconfig.tsbuildinfo +1 -1
  179. package/package.json +3 -3
@@ -3,7 +3,14 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { type PolicyEngineConfig, ApprovalMode, type PolicyEngine, type MessageBus } from '@google/gemini-cli-core';
6
+ import { type PolicyEngineConfig, type ApprovalMode, type PolicyEngine, type MessageBus } from '@google/gemini-cli-core';
7
7
  import { type Settings } from './settings.js';
8
- export declare function createPolicyEngineConfig(settings: Settings, approvalMode: ApprovalMode): PolicyEngineConfig;
8
+ export declare function createPolicyEngineConfig(settings: Settings, approvalMode: ApprovalMode): Promise<PolicyEngineConfig>;
9
9
  export declare function createPolicyUpdater(policyEngine: PolicyEngine, messageBus: MessageBus): void;
10
+ /**
11
+ * Gets and clears any policy errors that were stored during config loading.
12
+ * This should be called once the UI is ready to display errors.
13
+ *
14
+ * @returns Array of formatted error messages, or empty array if no errors
15
+ */
16
+ export declare function getPolicyErrorsForUI(): string[];
@@ -3,65 +3,135 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { PolicyDecision, ApprovalMode,
7
- // Read-only tools
8
- GREP_TOOL_NAME, LS_TOOL_NAME, READ_MANY_FILES_TOOL_NAME, READ_FILE_TOOL_NAME,
9
- // Write tools
10
- SHELL_TOOL_NAME, WRITE_FILE_TOOL_NAME, WEB_FETCH_TOOL_NAME, GLOB_TOOL_NAME, EDIT_TOOL_NAME, MEMORY_TOOL_NAME, WEB_SEARCH_TOOL_NAME, MessageBusType, } from '@google/gemini-cli-core';
11
- import {} from './settings.js';
12
- // READ_ONLY_TOOLS is a list of built-in tools that do not modify the user's
13
- // files or system state.
14
- const READ_ONLY_TOOLS = new Set([
15
- GLOB_TOOL_NAME,
16
- GREP_TOOL_NAME,
17
- LS_TOOL_NAME,
18
- READ_FILE_TOOL_NAME,
19
- READ_MANY_FILES_TOOL_NAME,
20
- WEB_SEARCH_TOOL_NAME,
21
- ]);
22
- // WRITE_TOOLS is a list of built-in tools that can modify the user's files or
23
- // system state. These tools have a shouldConfirmExecute method.
24
- // We are keeping this here for visibility and to maintain backwards compatibility
25
- // with the existing tool permissions system. Eventually we'll remove this and
26
- // any tool that isn't read only will require a confirmation unless altered by
27
- // config and policy.
28
- const WRITE_TOOLS = new Set([
29
- EDIT_TOOL_NAME,
30
- MEMORY_TOOL_NAME,
31
- SHELL_TOOL_NAME,
32
- WRITE_FILE_TOOL_NAME,
33
- WEB_FETCH_TOOL_NAME,
34
- ]);
35
- export function createPolicyEngineConfig(settings, approvalMode) {
36
- const rules = [];
6
+ import { PolicyDecision, MessageBusType, Storage, } from '@google/gemini-cli-core';
7
+ import { getSystemSettingsPath } from './settings.js';
8
+ import path from 'node:path';
9
+ import { fileURLToPath } from 'node:url';
10
+ import { loadPoliciesFromToml, } from './policy-toml-loader.js';
11
+ // Get the directory name of the current module
12
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
13
+ // Store policy loading errors to be displayed after UI is ready
14
+ let storedPolicyErrors = [];
15
+ function getPolicyDirectories() {
16
+ const DEFAULT_POLICIES_DIR = path.resolve(__dirname, 'policies');
17
+ const USER_POLICIES_DIR = Storage.getUserPoliciesDir();
18
+ const systemSettingsPath = getSystemSettingsPath();
19
+ const ADMIN_POLICIES_DIR = path.join(path.dirname(systemSettingsPath), 'policies');
20
+ return [
21
+ DEFAULT_POLICIES_DIR,
22
+ USER_POLICIES_DIR,
23
+ ADMIN_POLICIES_DIR,
24
+ ].reverse();
25
+ }
26
+ /**
27
+ * Determines the policy tier (1=default, 2=user, 3=admin) for a given directory.
28
+ * This is used by the TOML loader to assign priority bands.
29
+ */
30
+ function getPolicyTier(dir) {
31
+ const DEFAULT_POLICIES_DIR = path.resolve(__dirname, 'policies');
32
+ const USER_POLICIES_DIR = Storage.getUserPoliciesDir();
33
+ const systemSettingsPath = getSystemSettingsPath();
34
+ const ADMIN_POLICIES_DIR = path.join(path.dirname(systemSettingsPath), 'policies');
35
+ // Normalize paths for comparison
36
+ const normalizedDir = path.resolve(dir);
37
+ const normalizedDefault = path.resolve(DEFAULT_POLICIES_DIR);
38
+ const normalizedUser = path.resolve(USER_POLICIES_DIR);
39
+ const normalizedAdmin = path.resolve(ADMIN_POLICIES_DIR);
40
+ if (normalizedDir === normalizedDefault)
41
+ return 1;
42
+ if (normalizedDir === normalizedUser)
43
+ return 2;
44
+ if (normalizedDir === normalizedAdmin)
45
+ return 3;
46
+ // Default to tier 1 if unknown
47
+ return 1;
48
+ }
49
+ /**
50
+ * Formats a policy file error for console logging.
51
+ */
52
+ function formatPolicyError(error) {
53
+ const tierLabel = error.tier.toUpperCase();
54
+ let message = `[${tierLabel}] Policy file error in ${error.fileName}:\n`;
55
+ message += ` ${error.message}`;
56
+ if (error.details) {
57
+ message += `\n${error.details}`;
58
+ }
59
+ if (error.suggestion) {
60
+ message += `\n Suggestion: ${error.suggestion}`;
61
+ }
62
+ return message;
63
+ }
64
+ export async function createPolicyEngineConfig(settings, approvalMode) {
65
+ const policyDirs = getPolicyDirectories();
66
+ // Load policies from TOML files
67
+ const { rules: tomlRules, errors } = await loadPoliciesFromToml(approvalMode, policyDirs, getPolicyTier);
68
+ // Store any errors encountered during TOML loading
69
+ // These will be emitted by getPolicyErrorsForUI() after the UI is ready.
70
+ if (errors.length > 0) {
71
+ storedPolicyErrors = errors.map((error) => formatPolicyError(error));
72
+ }
73
+ const rules = [...tomlRules];
37
74
  // Priority system for policy rules:
38
75
  // - Higher priority numbers win over lower priority numbers
39
76
  // - When multiple rules match, the highest priority rule is applied
40
77
  // - Rules are evaluated in order of priority (highest first)
41
78
  //
42
- // Priority levels used in this configuration:
43
- // 0: Default allow-all (YOLO mode only)
44
- // 10: Write tools default to ASK_USER
45
- // 50: Auto-accept read-only tools
46
- // 85: MCP servers allowed list
47
- // 90: MCP servers with trust=true
48
- // 100: Explicitly allowed individual tools
49
- // 195: Explicitly excluded MCP servers
50
- // 199: Tools that the user has selected as "Always Allow" in the interactive UI.
51
- // 200: Explicitly excluded individual tools (highest priority)
52
- // MCP servers that are explicitly allowed in settings.mcp.allowed
53
- // Priority: 85 (lower than trusted servers)
54
- if (settings.mcp?.allowed) {
55
- for (const serverName of settings.mcp.allowed) {
79
+ // Priority bands (tiers):
80
+ // - Default policies (TOML): 1 + priority/1000 (e.g., priority 100 → 1.100)
81
+ // - User policies (TOML): 2 + priority/1000 (e.g., priority 100 → 2.100)
82
+ // - Admin policies (TOML): 3 + priority/1000 (e.g., priority 100 → 3.100)
83
+ //
84
+ // This ensures Admin > User > Default hierarchy is always preserved,
85
+ // while allowing user-specified priorities to work within each tier.
86
+ //
87
+ // Settings-based and dynamic rules (all in user tier 2.x):
88
+ // 2.95: Tools that the user has selected as "Always Allow" in the interactive UI
89
+ // 2.9: MCP servers excluded list (security: persistent server blocks)
90
+ // 2.4: Command line flag --exclude-tools (explicit temporary blocks)
91
+ // 2.3: Command line flag --allowed-tools (explicit temporary allows)
92
+ // 2.2: MCP servers with trust=true (persistent trusted servers)
93
+ // 2.1: MCP servers allowed list (persistent general server allows)
94
+ //
95
+ // TOML policy priorities (before transformation):
96
+ // 10: Write tools default to ASK_USER (becomes 1.010 in default tier)
97
+ // 15: Auto-edit tool override (becomes 1.015 in default tier)
98
+ // 50: Read-only tools (becomes 1.050 in default tier)
99
+ // 999: YOLO mode allow-all (becomes 1.999 in default tier)
100
+ // MCP servers that are explicitly excluded in settings.mcp.excluded
101
+ // Priority: 2.9 (highest in user tier for security - persistent server blocks)
102
+ if (settings.mcp?.excluded) {
103
+ for (const serverName of settings.mcp.excluded) {
56
104
  rules.push({
57
105
  toolName: `${serverName}__*`,
106
+ decision: PolicyDecision.DENY,
107
+ priority: 2.9,
108
+ });
109
+ }
110
+ }
111
+ // Tools that are explicitly excluded in the settings.
112
+ // Priority: 2.4 (user tier - explicit temporary blocks)
113
+ if (settings.tools?.exclude) {
114
+ for (const tool of settings.tools.exclude) {
115
+ rules.push({
116
+ toolName: tool,
117
+ decision: PolicyDecision.DENY,
118
+ priority: 2.4,
119
+ });
120
+ }
121
+ }
122
+ // Tools that are explicitly allowed in the settings.
123
+ // Priority: 2.3 (user tier - explicit temporary allows)
124
+ if (settings.tools?.allowed) {
125
+ for (const tool of settings.tools.allowed) {
126
+ rules.push({
127
+ toolName: tool,
58
128
  decision: PolicyDecision.ALLOW,
59
- priority: 85,
129
+ priority: 2.3,
60
130
  });
61
131
  }
62
132
  }
63
133
  // MCP servers that are trusted in the settings.
64
- // Priority: 90 (higher than general allowed servers but lower than explicit tool allows)
134
+ // Priority: 2.2 (user tier - persistent trusted servers)
65
135
  if (settings.mcpServers) {
66
136
  for (const [serverName, serverConfig] of Object.entries(settings.mcpServers)) {
67
137
  if (serverConfig.trust) {
@@ -70,77 +140,22 @@ export function createPolicyEngineConfig(settings, approvalMode) {
70
140
  rules.push({
71
141
  toolName: `${serverName}__*`,
72
142
  decision: PolicyDecision.ALLOW,
73
- priority: 90,
143
+ priority: 2.2,
74
144
  });
75
145
  }
76
146
  }
77
147
  }
78
- // Tools that are explicitly allowed in the settings.
79
- // Priority: 100
80
- if (settings.tools?.allowed) {
81
- for (const tool of settings.tools.allowed) {
82
- rules.push({
83
- toolName: tool,
84
- decision: PolicyDecision.ALLOW,
85
- priority: 100,
86
- });
87
- }
88
- }
89
- // Tools that are explicitly excluded in the settings.
90
- // Priority: 200
91
- if (settings.tools?.exclude) {
92
- for (const tool of settings.tools.exclude) {
93
- rules.push({
94
- toolName: tool,
95
- decision: PolicyDecision.DENY,
96
- priority: 200,
97
- });
98
- }
99
- }
100
- // MCP servers that are explicitly excluded in settings.mcp.excluded
101
- // Priority: 195 (high priority to block servers)
102
- if (settings.mcp?.excluded) {
103
- for (const serverName of settings.mcp.excluded) {
148
+ // MCP servers that are explicitly allowed in settings.mcp.allowed
149
+ // Priority: 2.1 (user tier - persistent general server allows)
150
+ if (settings.mcp?.allowed) {
151
+ for (const serverName of settings.mcp.allowed) {
104
152
  rules.push({
105
153
  toolName: `${serverName}__*`,
106
- decision: PolicyDecision.DENY,
107
- priority: 195,
108
- });
109
- }
110
- }
111
- // Allow all read-only tools.
112
- // Priority: 50
113
- for (const tool of READ_ONLY_TOOLS) {
114
- rules.push({
115
- toolName: tool,
116
- decision: PolicyDecision.ALLOW,
117
- priority: 50,
118
- });
119
- }
120
- // Only add write tool rules if not in YOLO mode
121
- // In YOLO mode, the wildcard ALLOW rule handles everything
122
- if (approvalMode !== ApprovalMode.YOLO) {
123
- for (const tool of WRITE_TOOLS) {
124
- rules.push({
125
- toolName: tool,
126
- decision: PolicyDecision.ASK_USER,
127
- priority: 10,
154
+ decision: PolicyDecision.ALLOW,
155
+ priority: 2.1,
128
156
  });
129
157
  }
130
158
  }
131
- if (approvalMode === ApprovalMode.YOLO) {
132
- rules.push({
133
- decision: PolicyDecision.ALLOW,
134
- priority: 0, // Lowest priority - catches everything not explicitly configured
135
- });
136
- }
137
- else if (approvalMode === ApprovalMode.AUTO_EDIT) {
138
- rules.push({
139
- toolName: EDIT_TOOL_NAME,
140
- decision: PolicyDecision.ALLOW,
141
- priority: 15, // Higher than write tools (10) to override ASK_USER
142
- });
143
- }
144
159
  return {
145
160
  rules,
146
161
  defaultDecision: PolicyDecision.ASK_USER,
@@ -152,8 +167,22 @@ export function createPolicyUpdater(policyEngine, messageBus) {
152
167
  policyEngine.addRule({
153
168
  toolName,
154
169
  decision: PolicyDecision.ALLOW,
155
- priority: 199, // High priority, but lower than explicit DENY (200)
170
+ // User tier (2) + high priority (950/1000) = 2.95
171
+ // This ensures user "always allow" selections are high priority
172
+ // but still lose to admin policies (3.xxx) and settings excludes (200)
173
+ priority: 2.95,
156
174
  });
157
175
  });
158
176
  }
177
+ /**
178
+ * Gets and clears any policy errors that were stored during config loading.
179
+ * This should be called once the UI is ready to display errors.
180
+ *
181
+ * @returns Array of formatted error messages, or empty array if no errors
182
+ */
183
+ export function getPolicyErrorsForUI() {
184
+ const errors = [...storedPolicyErrors];
185
+ storedPolicyErrors = []; // Clear after retrieving
186
+ return errors;
187
+ }
159
188
  //# sourceMappingURL=policy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/config/policy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/config/policy.ts"],"names":[],"mappings":"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"}