@cloudcli-ai/cloudcli 1.36.0 → 1.36.1

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 (217) hide show
  1. package/README.de.md +17 -18
  2. package/README.ja.md +16 -17
  3. package/README.ko.md +17 -18
  4. package/README.md +19 -20
  5. package/README.ru.md +17 -18
  6. package/README.tr.md +17 -18
  7. package/README.zh-CN.md +17 -18
  8. package/README.zh-TW.md +17 -18
  9. package/dist/api-docs.html +2 -3
  10. package/dist/assets/{index-S6cIy7hj.js → index-Bz9vXV2m.js} +264 -259
  11. package/dist/assets/index-DLmhQ15L.css +32 -0
  12. package/dist/assets/{vendor-xterm-CJZjLICi.js → vendor-xterm-CS4rQ5Mr.js} +12 -12
  13. package/dist/index.html +3 -3
  14. package/dist-server/server/claude-sdk.js +37 -90
  15. package/dist-server/server/claude-sdk.js.map +1 -1
  16. package/dist-server/server/cli.js +1 -4
  17. package/dist-server/server/cli.js.map +1 -1
  18. package/dist-server/server/cursor-cli.js +12 -11
  19. package/dist-server/server/cursor-cli.js.map +1 -1
  20. package/dist-server/server/index.js +10 -141
  21. package/dist-server/server/index.js.map +1 -1
  22. package/dist-server/server/modules/assets/assets.routes.js +89 -0
  23. package/dist-server/server/modules/assets/assets.routes.js.map +1 -0
  24. package/dist-server/server/modules/assets/index.js +4 -0
  25. package/dist-server/server/modules/assets/index.js.map +1 -0
  26. package/dist-server/server/modules/assets/services/image-assets.service.js +57 -0
  27. package/dist-server/server/modules/assets/services/image-assets.service.js.map +1 -0
  28. package/dist-server/server/modules/assets/tests/image-assets.service.test.js +36 -0
  29. package/dist-server/server/modules/assets/tests/image-assets.service.test.js.map +1 -0
  30. package/dist-server/server/modules/browser-use/browser-use.service.js +6 -3
  31. package/dist-server/server/modules/browser-use/browser-use.service.js.map +1 -1
  32. package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js +2 -2
  33. package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js.map +1 -1
  34. package/dist-server/server/modules/notifications/services/notification-orchestrator.service.js +0 -1
  35. package/dist-server/server/modules/notifications/services/notification-orchestrator.service.js.map +1 -1
  36. package/dist-server/server/modules/projects/services/project-clone.service.js +2 -1
  37. package/dist-server/server/modules/projects/services/project-clone.service.js.map +1 -1
  38. package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js +28 -0
  39. package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js.map +1 -1
  40. package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js +54 -1
  41. package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js.map +1 -1
  42. package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js +36 -1
  43. package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js.map +1 -1
  44. package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js +3 -17
  45. package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js.map +1 -1
  46. package/dist-server/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.js +7 -1
  47. package/dist-server/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.js.map +1 -1
  48. package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js +49 -13
  49. package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js.map +1 -1
  50. package/dist-server/server/modules/providers/list/opencode/opencode-auth.provider.js +0 -1
  51. package/dist-server/server/modules/providers/list/opencode/opencode-auth.provider.js.map +1 -1
  52. package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js +8 -14
  53. package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js.map +1 -1
  54. package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js +24 -5
  55. package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js.map +1 -1
  56. package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js +10 -21
  57. package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js.map +1 -1
  58. package/dist-server/server/modules/providers/provider.registry.js +0 -2
  59. package/dist-server/server/modules/providers/provider.registry.js.map +1 -1
  60. package/dist-server/server/modules/providers/provider.routes.js +0 -1
  61. package/dist-server/server/modules/providers/provider.routes.js.map +1 -1
  62. package/dist-server/server/modules/providers/services/provider-capabilities.service.js +7 -14
  63. package/dist-server/server/modules/providers/services/provider-capabilities.service.js.map +1 -1
  64. package/dist-server/server/modules/providers/services/provider-models.service.js +1 -1
  65. package/dist-server/server/modules/providers/services/provider-models.service.js.map +1 -1
  66. package/dist-server/server/modules/providers/services/session-conversations-search.service.js +3 -77
  67. package/dist-server/server/modules/providers/services/session-conversations-search.service.js.map +1 -1
  68. package/dist-server/server/modules/providers/services/session-synchronizer.service.js +0 -1
  69. package/dist-server/server/modules/providers/services/session-synchronizer.service.js.map +1 -1
  70. package/dist-server/server/modules/providers/services/sessions-watcher.service.js +0 -13
  71. package/dist-server/server/modules/providers/services/sessions-watcher.service.js.map +1 -1
  72. package/dist-server/server/modules/providers/tests/codex-sessions.test.js +96 -0
  73. package/dist-server/server/modules/providers/tests/codex-sessions.test.js.map +1 -0
  74. package/dist-server/server/modules/providers/tests/mcp.test.js +3 -29
  75. package/dist-server/server/modules/providers/tests/mcp.test.js.map +1 -1
  76. package/dist-server/server/modules/providers/tests/opencode-models.test.js +7 -0
  77. package/dist-server/server/modules/providers/tests/opencode-models.test.js.map +1 -1
  78. package/dist-server/server/modules/providers/tests/opencode-sessions.test.js +117 -0
  79. package/dist-server/server/modules/providers/tests/opencode-sessions.test.js.map +1 -1
  80. package/dist-server/server/modules/providers/tests/provider-image-history.test.js +147 -0
  81. package/dist-server/server/modules/providers/tests/provider-image-history.test.js.map +1 -0
  82. package/dist-server/server/modules/providers/tests/provider-models.service.test.js +8 -8
  83. package/dist-server/server/modules/providers/tests/skills.test.js +3 -26
  84. package/dist-server/server/modules/providers/tests/skills.test.js.map +1 -1
  85. package/dist-server/server/modules/websocket/services/chat-run-registry.service.js +14 -0
  86. package/dist-server/server/modules/websocket/services/chat-run-registry.service.js.map +1 -1
  87. package/dist-server/server/modules/websocket/services/chat-websocket.service.js +36 -2
  88. package/dist-server/server/modules/websocket/services/chat-websocket.service.js.map +1 -1
  89. package/dist-server/server/modules/websocket/services/shell-websocket.service.js +3 -12
  90. package/dist-server/server/modules/websocket/services/shell-websocket.service.js.map +1 -1
  91. package/dist-server/server/modules/websocket/tests/chat-image-filter.test.js +33 -0
  92. package/dist-server/server/modules/websocket/tests/chat-image-filter.test.js.map +1 -0
  93. package/dist-server/server/modules/websocket/tests/chat-run-registry.test.js +37 -4
  94. package/dist-server/server/modules/websocket/tests/chat-run-registry.test.js.map +1 -1
  95. package/dist-server/server/openai-codex.js +8 -2
  96. package/dist-server/server/openai-codex.js.map +1 -1
  97. package/dist-server/server/opencode-cli.js +43 -6
  98. package/dist-server/server/opencode-cli.js.map +1 -1
  99. package/dist-server/server/opencode-cli.test.js +103 -3
  100. package/dist-server/server/opencode-cli.test.js.map +1 -1
  101. package/dist-server/server/routes/agent.js +9 -19
  102. package/dist-server/server/routes/agent.js.map +1 -1
  103. package/dist-server/server/routes/commands.js +1 -2
  104. package/dist-server/server/routes/commands.js.map +1 -1
  105. package/dist-server/server/routes/git.js +179 -53
  106. package/dist-server/server/routes/git.js.map +1 -1
  107. package/dist-server/server/routes/git.test.js +80 -0
  108. package/dist-server/server/routes/git.test.js.map +1 -0
  109. package/dist-server/server/routes/taskmaster.js +3 -1
  110. package/dist-server/server/routes/taskmaster.js.map +1 -1
  111. package/dist-server/server/routes/user.js +2 -1
  112. package/dist-server/server/routes/user.js.map +1 -1
  113. package/dist-server/server/shared/image-attachments.js +270 -0
  114. package/dist-server/server/shared/image-attachments.js.map +1 -0
  115. package/dist-server/server/shared/tests/image-attachments.test.js +220 -0
  116. package/dist-server/server/shared/tests/image-attachments.test.js.map +1 -0
  117. package/dist-server/server/shared/utils.js +43 -0
  118. package/dist-server/server/shared/utils.js.map +1 -1
  119. package/dist-server/server/utils/gitConfig.js +2 -1
  120. package/dist-server/server/utils/gitConfig.js.map +1 -1
  121. package/dist-server/server/utils/plugin-process-manager.js +2 -1
  122. package/dist-server/server/utils/plugin-process-manager.js.map +1 -1
  123. package/electron/launcher/launcher.js +1 -1
  124. package/package.json +3 -3
  125. package/public/api-docs.html +2 -3
  126. package/server/claude-sdk.js +37 -105
  127. package/server/cli.js +1 -4
  128. package/server/cursor-cli.js +13 -12
  129. package/server/index.js +11 -159
  130. package/server/modules/assets/assets.routes.ts +103 -0
  131. package/server/modules/assets/index.ts +3 -0
  132. package/server/modules/assets/services/image-assets.service.ts +82 -0
  133. package/server/modules/assets/tests/image-assets.service.test.ts +46 -0
  134. package/server/modules/browser-use/browser-use.service.ts +7 -3
  135. package/server/modules/database/tests/sessions-provider-mapping.test.ts +2 -2
  136. package/server/modules/notifications/services/notification-orchestrator.service.js +0 -1
  137. package/server/modules/projects/services/project-clone.service.ts +3 -1
  138. package/server/modules/providers/README.md +1 -7
  139. package/server/modules/providers/list/claude/claude-sessions.provider.ts +30 -0
  140. package/server/modules/providers/list/codex/codex-session-synchronizer.provider.ts +60 -1
  141. package/server/modules/providers/list/codex/codex-sessions.provider.ts +41 -1
  142. package/server/modules/providers/list/cursor/cursor-models.provider.ts +3 -17
  143. package/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.ts +7 -1
  144. package/server/modules/providers/list/cursor/cursor-sessions.provider.ts +56 -15
  145. package/server/modules/providers/list/opencode/opencode-auth.provider.ts +0 -1
  146. package/server/modules/providers/list/opencode/opencode-models.provider.ts +15 -19
  147. package/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.ts +25 -4
  148. package/server/modules/providers/list/opencode/opencode-sessions.provider.ts +10 -21
  149. package/server/modules/providers/provider.registry.ts +0 -2
  150. package/server/modules/providers/provider.routes.ts +0 -1
  151. package/server/modules/providers/services/provider-capabilities.service.ts +7 -14
  152. package/server/modules/providers/services/provider-models.service.ts +1 -1
  153. package/server/modules/providers/services/session-conversations-search.service.ts +3 -93
  154. package/server/modules/providers/services/session-synchronizer.service.ts +0 -1
  155. package/server/modules/providers/services/sessions-watcher.service.ts +0 -14
  156. package/server/modules/providers/tests/codex-sessions.test.ts +111 -0
  157. package/server/modules/providers/tests/mcp.test.ts +3 -34
  158. package/server/modules/providers/tests/opencode-models.test.ts +7 -0
  159. package/server/modules/providers/tests/opencode-sessions.test.ts +139 -0
  160. package/server/modules/providers/tests/provider-image-history.test.ts +180 -0
  161. package/server/modules/providers/tests/provider-models.service.test.ts +8 -8
  162. package/server/modules/providers/tests/skills.test.ts +3 -42
  163. package/server/modules/websocket/services/chat-run-registry.service.ts +16 -0
  164. package/server/modules/websocket/services/chat-websocket.service.ts +41 -2
  165. package/server/modules/websocket/services/shell-websocket.service.ts +1 -11
  166. package/server/modules/websocket/tests/chat-image-filter.test.ts +44 -0
  167. package/server/modules/websocket/tests/chat-run-registry.test.ts +42 -4
  168. package/server/openai-codex.js +9 -1
  169. package/server/opencode-cli.js +44 -6
  170. package/server/opencode-cli.test.js +112 -3
  171. package/server/routes/agent.js +9 -19
  172. package/server/routes/commands.js +1 -2
  173. package/server/routes/git.js +201 -60
  174. package/server/routes/git.test.js +106 -0
  175. package/server/routes/taskmaster.js +3 -1
  176. package/server/routes/user.js +2 -1
  177. package/server/shared/image-attachments.ts +341 -0
  178. package/server/shared/tests/image-attachments.test.ts +298 -0
  179. package/server/shared/types.ts +1 -1
  180. package/server/shared/utils.ts +45 -0
  181. package/server/utils/gitConfig.js +2 -1
  182. package/server/utils/plugin-process-manager.js +3 -1
  183. package/dist/assets/index-uLUE6Qt1.css +0 -32
  184. package/dist/icons/gemini-ai-icon.svg +0 -1
  185. package/dist-server/server/gemini-cli.js +0 -551
  186. package/dist-server/server/gemini-cli.js.map +0 -1
  187. package/dist-server/server/gemini-response-handler.js +0 -106
  188. package/dist-server/server/gemini-response-handler.js.map +0 -1
  189. package/dist-server/server/modules/providers/list/gemini/gemini-auth.provider.js +0 -254
  190. package/dist-server/server/modules/providers/list/gemini/gemini-auth.provider.js.map +0 -1
  191. package/dist-server/server/modules/providers/list/gemini/gemini-mcp.provider.js +0 -82
  192. package/dist-server/server/modules/providers/list/gemini/gemini-mcp.provider.js.map +0 -1
  193. package/dist-server/server/modules/providers/list/gemini/gemini-models.provider.js +0 -24
  194. package/dist-server/server/modules/providers/list/gemini/gemini-models.provider.js.map +0 -1
  195. package/dist-server/server/modules/providers/list/gemini/gemini-session-synchronizer.provider.js +0 -312
  196. package/dist-server/server/modules/providers/list/gemini/gemini-session-synchronizer.provider.js.map +0 -1
  197. package/dist-server/server/modules/providers/list/gemini/gemini-sessions.provider.js +0 -474
  198. package/dist-server/server/modules/providers/list/gemini/gemini-sessions.provider.js.map +0 -1
  199. package/dist-server/server/modules/providers/list/gemini/gemini-skills.provider.js +0 -40
  200. package/dist-server/server/modules/providers/list/gemini/gemini-skills.provider.js.map +0 -1
  201. package/dist-server/server/modules/providers/list/gemini/gemini.provider.js +0 -19
  202. package/dist-server/server/modules/providers/list/gemini/gemini.provider.js.map +0 -1
  203. package/dist-server/server/routes/gemini.js +0 -21
  204. package/dist-server/server/routes/gemini.js.map +0 -1
  205. package/dist-server/server/sessionManager.js +0 -194
  206. package/dist-server/server/sessionManager.js.map +0 -1
  207. package/server/gemini-cli.js +0 -638
  208. package/server/gemini-response-handler.js +0 -117
  209. package/server/modules/providers/list/gemini/gemini-auth.provider.ts +0 -307
  210. package/server/modules/providers/list/gemini/gemini-mcp.provider.ts +0 -110
  211. package/server/modules/providers/list/gemini/gemini-models.provider.ts +0 -39
  212. package/server/modules/providers/list/gemini/gemini-session-synchronizer.provider.ts +0 -405
  213. package/server/modules/providers/list/gemini/gemini-sessions.provider.ts +0 -540
  214. package/server/modules/providers/list/gemini/gemini-skills.provider.ts +0 -44
  215. package/server/modules/providers/list/gemini/gemini.provider.ts +0 -27
  216. package/server/routes/gemini.js +0 -25
  217. package/server/sessionManager.js +0 -226
@@ -1,551 +0,0 @@
1
- import { spawn } from 'child_process';
2
- import { promises as fs } from 'fs';
3
- import os from 'os';
4
- import path from 'path';
5
- import crossSpawn from 'cross-spawn';
6
- import sessionManager from './sessionManager.js';
7
- import GeminiResponseHandler from './gemini-response-handler.js';
8
- import { notifyRunFailed, notifyRunStopped } from './services/notification-orchestrator.js';
9
- import { providerAuthService } from './modules/providers/services/provider-auth.service.js';
10
- import { providerModelsService } from './modules/providers/services/provider-models.service.js';
11
- import { createCompleteMessage, createNormalizedMessage } from './shared/utils.js';
12
- // Use cross-spawn on Windows for correct .cmd resolution (same pattern as cursor-cli.js)
13
- const spawnFunction = process.platform === 'win32' ? crossSpawn : spawn;
14
- let activeGeminiProcesses = new Map(); // Track active processes by session ID
15
- function mapGeminiExitCodeToMessage(exitCode) {
16
- switch (exitCode) {
17
- case 42:
18
- return 'Gemini rejected the request input (exit code 42).';
19
- case 44:
20
- return 'Gemini sandbox error (exit code 44). Check local sandbox/container settings.';
21
- case 52:
22
- return 'Gemini configuration error (exit code 52). Check your Gemini settings files for invalid JSON/config.';
23
- case 53:
24
- return 'Gemini conversation turn limit reached (exit code 53). Start a new Gemini session.';
25
- default:
26
- return null;
27
- }
28
- }
29
- const GEMINI_AUTH_ENV_KEYS = [
30
- 'GEMINI_API_KEY',
31
- 'GOOGLE_API_KEY',
32
- 'GOOGLE_CLOUD_PROJECT',
33
- 'GOOGLE_CLOUD_PROJECT_ID',
34
- 'GOOGLE_CLOUD_LOCATION',
35
- 'GOOGLE_APPLICATION_CREDENTIALS'
36
- ];
37
- function parseEnvFileContent(content) {
38
- const parsed = {};
39
- for (const rawLine of content.split(/\r?\n/)) {
40
- const line = rawLine.trim();
41
- if (!line || line.startsWith('#')) {
42
- continue;
43
- }
44
- const exportPrefix = 'export ';
45
- const normalizedLine = line.startsWith(exportPrefix) ? line.slice(exportPrefix.length).trim() : line;
46
- const separatorIndex = normalizedLine.indexOf('=');
47
- if (separatorIndex <= 0) {
48
- continue;
49
- }
50
- const key = normalizedLine.slice(0, separatorIndex).trim();
51
- if (!key) {
52
- continue;
53
- }
54
- let value = normalizedLine.slice(separatorIndex + 1).trim();
55
- const hasDoubleQuotes = value.startsWith('"') && value.endsWith('"');
56
- const hasSingleQuotes = value.startsWith('\'') && value.endsWith('\'');
57
- if (hasDoubleQuotes || hasSingleQuotes) {
58
- value = value.slice(1, -1);
59
- }
60
- else {
61
- // Support inline comments in unquoted values: KEY=value # comment
62
- value = value.replace(/\s+#.*$/, '').trim();
63
- }
64
- parsed[key] = value;
65
- }
66
- return parsed;
67
- }
68
- async function loadGeminiUserLevelEnv() {
69
- const geminiCliHome = (process.env.GEMINI_CLI_HOME || '').trim() || os.homedir();
70
- const envCandidates = [
71
- path.join(geminiCliHome, '.gemini', '.env'),
72
- path.join(geminiCliHome, '.env')
73
- ];
74
- for (const envPath of envCandidates) {
75
- try {
76
- await fs.access(envPath);
77
- const content = await fs.readFile(envPath, 'utf8');
78
- return parseEnvFileContent(content);
79
- }
80
- catch {
81
- // Keep scanning for the next candidate.
82
- }
83
- }
84
- return {};
85
- }
86
- async function buildGeminiProcessEnv() {
87
- const processEnv = { ...process.env };
88
- if (processEnv.GEMINI_API_KEY || processEnv.GOOGLE_API_KEY || processEnv.GOOGLE_APPLICATION_CREDENTIALS) {
89
- return processEnv;
90
- }
91
- // Gemini CLI docs recommend ~/.gemini/.env for persistent headless auth settings.
92
- // When the server process was launched without shell profile variables, we still
93
- // want the spawned CLI process to inherit those user-level credentials.
94
- const userEnv = await loadGeminiUserLevelEnv();
95
- for (const key of GEMINI_AUTH_ENV_KEYS) {
96
- if (!processEnv[key] && userEnv[key]) {
97
- processEnv[key] = userEnv[key];
98
- }
99
- }
100
- return processEnv;
101
- }
102
- async function spawnGemini(command, options = {}, ws) {
103
- const { sessionId, projectPath, cwd, toolsSettings, permissionMode, images, sessionSummary } = options;
104
- const resolvedModel = await providerModelsService.resolveResumeModel('gemini', sessionId, options.model);
105
- let capturedSessionId = sessionId; // Track session ID throughout the process
106
- let sessionCreatedSent = false; // Track if we've already sent session-created event
107
- let assistantBlocks = []; // Accumulate the full response blocks including tools
108
- // Unified lifecycle contract: exactly one terminal `complete` per run
109
- // (close and error handlers can both fire for spawn failures).
110
- let completeSent = false;
111
- // Use tools settings passed from frontend, or defaults
112
- const settings = toolsSettings || {
113
- allowedTools: [],
114
- disallowedTools: [],
115
- skipPermissions: false
116
- };
117
- // Build Gemini CLI command - start with print/resume flags first
118
- const args = [];
119
- // Add prompt flag with command if we have a command
120
- if (command && command.trim()) {
121
- args.push('--prompt', command);
122
- }
123
- // If we have a sessionId, we want to resume
124
- if (sessionId) {
125
- const session = sessionManager.getSession(sessionId);
126
- if (session && session.cliSessionId) {
127
- args.push('--resume', session.cliSessionId);
128
- }
129
- }
130
- // Use cwd (actual project directory) instead of projectPath (Gemini's metadata directory)
131
- // Clean the path by removing any non-printable characters
132
- const cleanPath = (cwd || projectPath || process.cwd()).replace(/[^\x20-\x7E]/g, '').trim();
133
- const workingDir = cleanPath;
134
- // Handle images by saving them to temporary files and passing paths to Gemini
135
- const tempImagePaths = [];
136
- let tempDir = null;
137
- if (images && images.length > 0) {
138
- try {
139
- // Create temp directory in the project directory so Gemini can access it
140
- tempDir = path.join(workingDir, '.tmp', 'images', Date.now().toString());
141
- await fs.mkdir(tempDir, { recursive: true });
142
- // Save each image to a temp file
143
- for (const [index, image] of images.entries()) {
144
- // Extract base64 data and mime type
145
- const matches = image.data.match(/^data:([^;]+);base64,(.+)$/);
146
- if (!matches) {
147
- continue;
148
- }
149
- const [, mimeType, base64Data] = matches;
150
- const extension = mimeType.split('/')[1] || 'png';
151
- const filename = `image_${index}.${extension}`;
152
- const filepath = path.join(tempDir, filename);
153
- // Write base64 data to file
154
- await fs.writeFile(filepath, Buffer.from(base64Data, 'base64'));
155
- tempImagePaths.push(filepath);
156
- }
157
- // Include the full image paths in the prompt for Gemini to reference
158
- // Gemini CLI can read images from file paths in the prompt
159
- if (tempImagePaths.length > 0 && command && command.trim()) {
160
- const imageNote = `\n\n[Images given: ${tempImagePaths.length} images are located at the following paths:]\n${tempImagePaths.map((p, i) => `${i + 1}. ${p}`).join('\n')}`;
161
- const modifiedCommand = command + imageNote;
162
- // Update the command in args
163
- const promptIndex = args.indexOf('--prompt');
164
- if (promptIndex !== -1 && args[promptIndex + 1] === command) {
165
- args[promptIndex + 1] = modifiedCommand;
166
- }
167
- else if (promptIndex !== -1) {
168
- // If we're using context, update the full prompt
169
- args[promptIndex + 1] = args[promptIndex + 1] + imageNote;
170
- }
171
- }
172
- }
173
- catch (error) {
174
- console.error('Error processing images for Gemini:', error);
175
- }
176
- }
177
- // Add basic flags for Gemini
178
- if (options.debug) {
179
- args.push('--debug');
180
- }
181
- // This integration runs Gemini in headless mode and cannot answer trust prompts.
182
- // Skip folder-trust interactivity so authenticated runs don't fail with
183
- // FatalUntrustedWorkspaceError in previously unseen directories.
184
- args.push('--skip-trust');
185
- // Add MCP config flag only if MCP servers are configured
186
- try {
187
- const geminiConfigPath = path.join(os.homedir(), '.gemini.json');
188
- let hasMcpServers = false;
189
- try {
190
- await fs.access(geminiConfigPath);
191
- const geminiConfigRaw = await fs.readFile(geminiConfigPath, 'utf8');
192
- const geminiConfig = JSON.parse(geminiConfigRaw);
193
- // Check global MCP servers
194
- if (geminiConfig.mcpServers && Object.keys(geminiConfig.mcpServers).length > 0) {
195
- hasMcpServers = true;
196
- }
197
- // Check project-specific MCP servers
198
- if (!hasMcpServers && geminiConfig.geminiProjects) {
199
- const currentProjectPath = process.cwd();
200
- const projectConfig = geminiConfig.geminiProjects[currentProjectPath];
201
- if (projectConfig && projectConfig.mcpServers && Object.keys(projectConfig.mcpServers).length > 0) {
202
- hasMcpServers = true;
203
- }
204
- }
205
- }
206
- catch (e) {
207
- // Ignore if file doesn't exist or isn't parsable
208
- }
209
- if (hasMcpServers) {
210
- args.push('--mcp-config', geminiConfigPath);
211
- }
212
- }
213
- catch (error) {
214
- // Ignore outer errors
215
- }
216
- // Add model for all sessions (both new and resumed)
217
- let modelToUse = resolvedModel || 'gemini-2.5-flash';
218
- args.push('--model', modelToUse);
219
- args.push('--output-format', 'stream-json');
220
- // Handle approval modes and allowed tools
221
- if (settings.skipPermissions || options.skipPermissions || permissionMode === 'yolo') {
222
- args.push('--yolo');
223
- }
224
- else if (permissionMode === 'auto_edit') {
225
- args.push('--approval-mode', 'auto_edit');
226
- }
227
- else if (permissionMode === 'plan') {
228
- args.push('--approval-mode', 'plan');
229
- }
230
- if (settings.allowedTools && settings.allowedTools.length > 0) {
231
- args.push('--allowed-tools', settings.allowedTools.join(','));
232
- }
233
- // Try to find gemini in PATH first, then fall back to environment variable
234
- const geminiPath = process.env.GEMINI_PATH || 'gemini';
235
- let spawnCmd = geminiPath;
236
- let spawnArgs = args;
237
- // On non-Windows platforms, wrap the execution in a shell to avoid ENOEXEC
238
- // which happens when the target is a script lacking a shebang.
239
- if (os.platform() !== 'win32') {
240
- spawnCmd = 'sh';
241
- // Use exec to replace the shell process, ensuring signals hit gemini directly
242
- spawnArgs = ['-c', 'exec "$0" "$@"', geminiPath, ...args];
243
- }
244
- const spawnEnv = await buildGeminiProcessEnv();
245
- return new Promise((resolve, reject) => {
246
- const geminiProcess = spawnFunction(spawnCmd, spawnArgs, {
247
- cwd: workingDir,
248
- stdio: ['pipe', 'pipe', 'pipe'],
249
- env: spawnEnv
250
- });
251
- let terminalNotificationSent = false;
252
- let terminalFailureReason = null;
253
- const notifyTerminalState = ({ code = null, error = null } = {}) => {
254
- if (terminalNotificationSent) {
255
- return;
256
- }
257
- terminalNotificationSent = true;
258
- const finalSessionId = capturedSessionId || sessionId || processKey;
259
- if (code === 0 && !error) {
260
- notifyRunStopped({
261
- userId: ws?.userId || null,
262
- provider: 'gemini',
263
- sessionId: finalSessionId,
264
- sessionName: sessionSummary,
265
- stopReason: 'completed'
266
- });
267
- return;
268
- }
269
- notifyRunFailed({
270
- userId: ws?.userId || null,
271
- provider: 'gemini',
272
- sessionId: finalSessionId,
273
- sessionName: sessionSummary,
274
- error: error || terminalFailureReason || `Gemini CLI exited with code ${code}`
275
- });
276
- };
277
- // Attach temp file info to process for cleanup later
278
- geminiProcess.tempImagePaths = tempImagePaths;
279
- geminiProcess.tempDir = tempDir;
280
- // Store process reference for potential abort
281
- const processKey = capturedSessionId || sessionId || Date.now().toString();
282
- activeGeminiProcesses.set(processKey, geminiProcess);
283
- // Store sessionId on the process object for debugging
284
- geminiProcess.sessionId = processKey;
285
- // Close stdin to signal we're done sending input
286
- geminiProcess.stdin.end();
287
- // Add timeout handler
288
- const timeoutMs = 120000; // 120 seconds for slower models
289
- let timeout;
290
- const startTimeout = () => {
291
- if (timeout)
292
- clearTimeout(timeout);
293
- timeout = setTimeout(() => {
294
- const socketSessionId = typeof ws.getSessionId === 'function' ? ws.getSessionId() : (capturedSessionId || sessionId || processKey);
295
- terminalFailureReason = `Gemini CLI timeout - no response received for ${timeoutMs / 1000} seconds`;
296
- ws.send(createNormalizedMessage({ kind: 'error', content: terminalFailureReason, sessionId: socketSessionId, provider: 'gemini' }));
297
- try {
298
- geminiProcess.kill('SIGTERM');
299
- }
300
- catch (e) { }
301
- }, timeoutMs);
302
- };
303
- startTimeout();
304
- // Save user message to session when starting
305
- if (command && capturedSessionId) {
306
- sessionManager.addMessage(capturedSessionId, 'user', command);
307
- }
308
- // Create response handler for NDJSON buffering
309
- let responseHandler;
310
- if (ws) {
311
- responseHandler = new GeminiResponseHandler(ws, {
312
- onContentFragment: (content) => {
313
- if (assistantBlocks.length > 0 && assistantBlocks[assistantBlocks.length - 1].type === 'text') {
314
- assistantBlocks[assistantBlocks.length - 1].text += content;
315
- }
316
- else {
317
- assistantBlocks.push({ type: 'text', text: content });
318
- }
319
- },
320
- onToolUse: (event) => {
321
- assistantBlocks.push({
322
- type: 'tool_use',
323
- id: event.tool_id,
324
- name: event.tool_name,
325
- input: event.parameters
326
- });
327
- },
328
- onToolResult: (event) => {
329
- if (capturedSessionId) {
330
- if (assistantBlocks.length > 0) {
331
- sessionManager.addMessage(capturedSessionId, 'assistant', [...assistantBlocks]);
332
- assistantBlocks = [];
333
- }
334
- sessionManager.addMessage(capturedSessionId, 'user', [{
335
- type: 'tool_result',
336
- tool_use_id: event.tool_id,
337
- content: event.output === undefined ? null : event.output,
338
- is_error: event.status === 'error'
339
- }]);
340
- }
341
- },
342
- onInit: (event) => {
343
- const discoveredSessionId = event?.session_id;
344
- if (!discoveredSessionId) {
345
- return;
346
- }
347
- // New Gemini sessions announce their canonical ID asynchronously via the
348
- // initial `init` stream event. Avoid synthetic IDs and only register
349
- // the session once that real ID is known (same model used by Claude/Codex).
350
- if (!capturedSessionId) {
351
- capturedSessionId = discoveredSessionId;
352
- sessionManager.createSession(capturedSessionId, cwd || process.cwd());
353
- if (command) {
354
- sessionManager.addMessage(capturedSessionId, 'user', command);
355
- }
356
- if (processKey !== capturedSessionId) {
357
- activeGeminiProcesses.delete(processKey);
358
- activeGeminiProcesses.set(capturedSessionId, geminiProcess);
359
- }
360
- geminiProcess.sessionId = capturedSessionId;
361
- if (ws.setSessionId && typeof ws.setSessionId === 'function') {
362
- ws.setSessionId(capturedSessionId);
363
- }
364
- if (!sessionId && !sessionCreatedSent) {
365
- sessionCreatedSent = true;
366
- ws.send(createNormalizedMessage({ kind: 'session_created', newSessionId: capturedSessionId, sessionId: capturedSessionId, provider: 'gemini' }));
367
- }
368
- }
369
- const sess = sessionManager.getSession(capturedSessionId);
370
- if (sess && !sess.cliSessionId) {
371
- sess.cliSessionId = discoveredSessionId;
372
- sessionManager.saveSession(capturedSessionId);
373
- }
374
- }
375
- });
376
- }
377
- // Handle stdout
378
- geminiProcess.stdout.on('data', (data) => {
379
- const rawOutput = data.toString();
380
- startTimeout(); // Re-arm the timeout
381
- if (responseHandler) {
382
- responseHandler.processData(rawOutput);
383
- }
384
- else if (rawOutput) {
385
- // Fallback to direct sending for raw CLI mode without WS
386
- if (assistantBlocks.length > 0 && assistantBlocks[assistantBlocks.length - 1].type === 'text') {
387
- assistantBlocks[assistantBlocks.length - 1].text += rawOutput;
388
- }
389
- else {
390
- assistantBlocks.push({ type: 'text', text: rawOutput });
391
- }
392
- const socketSessionId = typeof ws.getSessionId === 'function' ? ws.getSessionId() : (capturedSessionId || sessionId);
393
- ws.send(createNormalizedMessage({ kind: 'stream_delta', content: rawOutput, sessionId: socketSessionId, provider: 'gemini' }));
394
- }
395
- });
396
- // Handle stderr
397
- geminiProcess.stderr.on('data', (data) => {
398
- const errorMsg = data.toString();
399
- // Filter out deprecation warnings and "Loaded cached credentials" message
400
- if (errorMsg.includes('[DEP0040]') ||
401
- errorMsg.includes('DeprecationWarning') ||
402
- errorMsg.includes('--trace-deprecation') ||
403
- errorMsg.includes('Loaded cached credentials')) {
404
- return;
405
- }
406
- const socketSessionId = typeof ws.getSessionId === 'function' ? ws.getSessionId() : (capturedSessionId || sessionId);
407
- ws.send(createNormalizedMessage({ kind: 'error', content: errorMsg, sessionId: socketSessionId, provider: 'gemini' }));
408
- });
409
- // Handle process completion
410
- geminiProcess.on('close', async (code) => {
411
- clearTimeout(timeout);
412
- // Flush any remaining buffered content
413
- if (responseHandler) {
414
- responseHandler.forceFlush();
415
- responseHandler.destroy();
416
- }
417
- // Clean up process reference
418
- const finalSessionId = capturedSessionId || sessionId || processKey;
419
- activeGeminiProcesses.delete(finalSessionId);
420
- // Save assistant response to session if we have one
421
- if (finalSessionId && assistantBlocks.length > 0) {
422
- sessionManager.addMessage(finalSessionId, 'assistant', assistantBlocks);
423
- }
424
- // Terminal complete — skipped for aborted runs (abort-session
425
- // already sent the aborted complete on this run's behalf).
426
- if (!completeSent && !geminiProcess.aborted) {
427
- completeSent = true;
428
- ws.send(createCompleteMessage({ provider: 'gemini', sessionId: finalSessionId, exitCode: code }));
429
- }
430
- // Clean up temporary image files if any
431
- if (geminiProcess.tempImagePaths && geminiProcess.tempImagePaths.length > 0) {
432
- for (const imagePath of geminiProcess.tempImagePaths) {
433
- await fs.unlink(imagePath).catch(err => { });
434
- }
435
- if (geminiProcess.tempDir) {
436
- await fs.rm(geminiProcess.tempDir, { recursive: true, force: true }).catch(err => { });
437
- }
438
- }
439
- if (code === 0) {
440
- notifyTerminalState({ code });
441
- resolve();
442
- }
443
- else {
444
- const socketSessionId = typeof ws.getSessionId === 'function' ? ws.getSessionId() : finalSessionId;
445
- // code 127 = shell "command not found" - check installation
446
- if (code === 127) {
447
- const installed = await providerAuthService.isProviderInstalled('gemini');
448
- if (!installed) {
449
- terminalFailureReason = 'Gemini CLI is not installed. Please install it first: https://github.com/google-gemini/gemini-cli';
450
- ws.send(createNormalizedMessage({ kind: 'error', content: terminalFailureReason, sessionId: socketSessionId, provider: 'gemini' }));
451
- }
452
- }
453
- else if (code === 41) {
454
- // Gemini CLI documents exit code 41 as FatalAuthenticationError.
455
- // Surface an actionable auth error instead of a generic exit-code message.
456
- let authErrorSuffix = '';
457
- try {
458
- const authStatus = await providerAuthService.getProviderAuthStatus('gemini');
459
- if (!authStatus?.authenticated && authStatus?.error) {
460
- authErrorSuffix = ` Details: ${authStatus.error}`;
461
- }
462
- }
463
- catch {
464
- // Keep base remediation text when auth status lookup fails.
465
- }
466
- terminalFailureReason =
467
- 'Gemini authentication failed (exit code 41). '
468
- + 'Run `gemini` in a terminal to choose an auth method, or configure a valid `GEMINI_API_KEY`.'
469
- + authErrorSuffix;
470
- ws.send(createNormalizedMessage({ kind: 'error', content: terminalFailureReason, sessionId: socketSessionId, provider: 'gemini' }));
471
- }
472
- else {
473
- const mappedError = mapGeminiExitCodeToMessage(code);
474
- if (mappedError) {
475
- terminalFailureReason = mappedError;
476
- ws.send(createNormalizedMessage({ kind: 'error', content: terminalFailureReason, sessionId: socketSessionId, provider: 'gemini' }));
477
- }
478
- }
479
- notifyTerminalState({
480
- code,
481
- error: code === null ? 'Gemini CLI process was terminated or timed out' : null
482
- });
483
- reject(new Error(terminalFailureReason
484
- || (code === null
485
- ? 'Gemini CLI process was terminated or timed out'
486
- : `Gemini CLI exited with code ${code}`)));
487
- }
488
- });
489
- // Handle process errors
490
- geminiProcess.on('error', async (error) => {
491
- // Clean up process reference on error
492
- const finalSessionId = capturedSessionId || sessionId || processKey;
493
- activeGeminiProcesses.delete(finalSessionId);
494
- // Check if Gemini CLI is installed for a clearer error message
495
- const installed = await providerAuthService.isProviderInstalled('gemini');
496
- const errorContent = !installed
497
- ? 'Gemini CLI is not installed. Please install it first: https://github.com/google-gemini/gemini-cli'
498
- : error.message;
499
- const errorSessionId = typeof ws.getSessionId === 'function' ? ws.getSessionId() : finalSessionId;
500
- ws.send(createNormalizedMessage({ kind: 'error', content: errorContent, sessionId: errorSessionId, provider: 'gemini' }));
501
- if (!completeSent && !geminiProcess.aborted) {
502
- completeSent = true;
503
- ws.send(createCompleteMessage({ provider: 'gemini', sessionId: errorSessionId, exitCode: 1 }));
504
- }
505
- notifyTerminalState({ error });
506
- reject(error);
507
- });
508
- });
509
- }
510
- function abortGeminiSession(sessionId) {
511
- let geminiProc = activeGeminiProcesses.get(sessionId);
512
- let processKey = sessionId;
513
- if (!geminiProc) {
514
- for (const [key, proc] of activeGeminiProcesses.entries()) {
515
- if (proc.sessionId === sessionId) {
516
- geminiProc = proc;
517
- processKey = key;
518
- break;
519
- }
520
- }
521
- }
522
- if (geminiProc) {
523
- try {
524
- // The abort handler sends the terminal complete (aborted: true);
525
- // flag the process so its close handler does not emit a second one.
526
- geminiProc.aborted = true;
527
- geminiProc.kill('SIGTERM');
528
- setTimeout(() => {
529
- if (activeGeminiProcesses.has(processKey)) {
530
- try {
531
- geminiProc.kill('SIGKILL');
532
- }
533
- catch (e) { }
534
- }
535
- }, 2000); // Wait 2 seconds before force kill
536
- return true;
537
- }
538
- catch (error) {
539
- return false;
540
- }
541
- }
542
- return false;
543
- }
544
- function isGeminiSessionActive(sessionId) {
545
- return activeGeminiProcesses.has(sessionId);
546
- }
547
- function getActiveGeminiSessions() {
548
- return Array.from(activeGeminiProcesses.keys());
549
- }
550
- export { spawnGemini, abortGeminiSession, isGeminiSessionActive, getActiveGeminiSessions };
551
- //# sourceMappingURL=gemini-cli.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gemini-cli.js","sourceRoot":"","sources":["../../server/gemini-cli.js"],"names":[],"mappings":"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"}