@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,312 +0,0 @@
1
- import crypto from 'node:crypto';
2
- import os from 'node:os';
3
- import path from 'node:path';
4
- import { readFile } from 'node:fs/promises';
5
- import { projectsDb, sessionsDb } from '../../../../modules/database/index.js';
6
- import { findFilesRecursivelyCreatedAfter, normalizeProjectPath, normalizeSessionName, readFileTimestamps, } from '../../../../shared/utils.js';
7
- /**
8
- * Session indexer for Gemini transcript artifacts.
9
- */
10
- export class GeminiSessionSynchronizer {
11
- provider = 'gemini';
12
- geminiHome = path.join(os.homedir(), '.gemini');
13
- /**
14
- * Scans Gemini legacy JSON and new JSONL artifacts and upserts sessions into DB.
15
- */
16
- async synchronize(since) {
17
- const projectHashLookup = this.buildProjectHashLookup();
18
- // const legacySessionFiles = await findFilesRecursivelyCreatedAfter(
19
- // path.join(this.geminiHome, 'sessions'),
20
- // '.json',
21
- // since ?? null
22
- // );
23
- // Gemini creates overlapping artifacts across `sessions/` and `tmp/`.
24
- // We currently index only `tmp/*/chats/*.jsonl` because those files are the
25
- // live transcript source and avoid duplicate session rows from mirrored files.
26
- // const legacyTempFiles = await findFilesRecursivelyCreatedAfter(
27
- // path.join(this.geminiHome, 'tmp'),
28
- // '.json',
29
- // since ?? null
30
- // );
31
- // const jsonlSessionFiles = await findFilesRecursivelyCreatedAfter(
32
- // path.join(this.geminiHome, 'sessions'),
33
- // '.jsonl',
34
- // since ?? null
35
- // );
36
- const jsonlTempFiles = await findFilesRecursivelyCreatedAfter(path.join(this.geminiHome, 'tmp'), '.jsonl', since ?? null);
37
- // Current strategy: index only temp chat JSONL artifacts.
38
- const files = [
39
- // ...legacySessionFiles,
40
- // Intentionally disabled to avoid duplicate indexing from mirrored
41
- // `sessions/*.json` and `sessions/*.jsonl` artifacts.
42
- // ...legacyTempFiles,
43
- // ...jsonlSessionFiles,
44
- ...jsonlTempFiles,
45
- ];
46
- let processed = 0;
47
- for (const filePath of files) {
48
- if (this.shouldSkipTempArtifact(filePath)) {
49
- continue;
50
- }
51
- const parsed = filePath.endsWith('.jsonl')
52
- ? await this.processJsonlSessionFile(filePath, projectHashLookup)
53
- : await this.processLegacySessionFile(filePath);
54
- if (!parsed) {
55
- continue;
56
- }
57
- const timestamps = await readFileTimestamps(filePath);
58
- sessionsDb.createSession(parsed.sessionId, this.provider, parsed.projectPath, parsed.sessionName, timestamps.createdAt, timestamps.updatedAt, filePath);
59
- processed += 1;
60
- }
61
- return processed;
62
- }
63
- /**
64
- * Parses and upserts one Gemini legacy JSON or JSONL artifact.
65
- */
66
- async synchronizeFile(filePath) {
67
- if (!filePath.endsWith('.json') && !filePath.endsWith('.jsonl')) {
68
- return null;
69
- }
70
- if (this.shouldSkipTempArtifact(filePath)) {
71
- return null;
72
- }
73
- const parsed = filePath.endsWith('.jsonl')
74
- ? await this.processJsonlSessionFile(filePath, this.buildProjectHashLookup())
75
- : await this.processLegacySessionFile(filePath);
76
- if (!parsed) {
77
- return null;
78
- }
79
- const timestamps = await readFileTimestamps(filePath);
80
- return sessionsDb.createSession(parsed.sessionId, this.provider, parsed.projectPath, parsed.sessionName, timestamps.createdAt, timestamps.updatedAt, filePath);
81
- }
82
- /**
83
- * Extracts session metadata from one Gemini legacy JSON artifact.
84
- */
85
- async processLegacySessionFile(filePath) {
86
- try {
87
- const content = await readFile(filePath, 'utf8');
88
- const data = JSON.parse(content);
89
- const sessionId = typeof data.sessionId === 'string'
90
- ? data.sessionId
91
- : typeof data.id === 'string'
92
- ? data.id
93
- : undefined;
94
- if (!sessionId) {
95
- return null;
96
- }
97
- const workspaceProjectPath = await this.resolveProjectPathFromChatWorkspace(filePath);
98
- const projectPath = typeof data.projectPath === 'string' && data.projectPath.trim().length > 0
99
- ? data.projectPath
100
- : workspaceProjectPath;
101
- if (!projectPath) {
102
- return null;
103
- }
104
- const messages = Array.isArray(data.messages) ? data.messages : [];
105
- const firstMessage = messages[0];
106
- let rawName;
107
- if (Array.isArray(firstMessage?.content) && typeof firstMessage.content[0]?.text === 'string') {
108
- rawName = firstMessage.content[0].text;
109
- }
110
- else if (typeof firstMessage?.content === 'string') {
111
- rawName = firstMessage.content;
112
- }
113
- return {
114
- sessionId,
115
- projectPath,
116
- sessionName: normalizeSessionName(rawName, 'New Gemini Chat'),
117
- };
118
- }
119
- catch {
120
- return null;
121
- }
122
- }
123
- /**
124
- * Extracts session metadata from one Gemini JSONL artifact.
125
- */
126
- async processJsonlSessionFile(filePath, projectHashLookup) {
127
- const metadata = await this.extractJsonlMetadata(filePath);
128
- if (!metadata) {
129
- return null;
130
- }
131
- let projectPath = typeof metadata.projectPath === 'string' ? metadata.projectPath.trim() : '';
132
- if (!projectPath) {
133
- const workspaceProjectPath = await this.resolveProjectPathFromChatWorkspace(filePath);
134
- if (workspaceProjectPath) {
135
- projectPath = workspaceProjectPath;
136
- }
137
- }
138
- if (!projectPath && typeof metadata.projectHash === 'string') {
139
- projectPath = projectHashLookup.get(metadata.projectHash.trim().toLowerCase()) ?? '';
140
- }
141
- if (!projectPath) {
142
- return null;
143
- }
144
- // Once we resolve a project hash/path pair, keep it in-memory for this sync run.
145
- if (typeof metadata.projectHash === 'string' && metadata.projectHash.trim()) {
146
- projectHashLookup.set(metadata.projectHash.trim().toLowerCase(), projectPath);
147
- }
148
- return {
149
- sessionId: metadata.sessionId,
150
- projectPath,
151
- sessionName: normalizeSessionName(metadata.firstUserMessage, 'New Gemini Chat'),
152
- };
153
- }
154
- /**
155
- * Reads first useful metadata from Gemini JSONL files.
156
- */
157
- async extractJsonlMetadata(filePath) {
158
- try {
159
- const content = await readFile(filePath, 'utf8');
160
- const lines = content.split('\n');
161
- let sessionId;
162
- let projectPath;
163
- let projectHash;
164
- let firstUserMessage;
165
- for (const line of lines) {
166
- const trimmed = line.trim();
167
- if (!trimmed) {
168
- continue;
169
- }
170
- let parsed;
171
- try {
172
- parsed = JSON.parse(trimmed);
173
- }
174
- catch {
175
- continue;
176
- }
177
- if (!sessionId && typeof parsed.sessionId === 'string') {
178
- sessionId = parsed.sessionId;
179
- }
180
- if (!projectPath && typeof parsed.projectPath === 'string') {
181
- projectPath = parsed.projectPath;
182
- }
183
- if (!projectHash && typeof parsed.projectHash === 'string') {
184
- projectHash = parsed.projectHash;
185
- }
186
- if (!firstUserMessage && parsed.type === 'user') {
187
- firstUserMessage = this.extractGeminiTextContent(parsed.content);
188
- }
189
- if (sessionId && (projectPath || projectHash) && firstUserMessage) {
190
- break;
191
- }
192
- }
193
- if (!sessionId) {
194
- return null;
195
- }
196
- return {
197
- sessionId,
198
- projectPath,
199
- projectHash,
200
- firstUserMessage,
201
- };
202
- }
203
- catch {
204
- return null;
205
- }
206
- }
207
- /**
208
- * Tries to resolve project root from Gemini tmp chat workspaces.
209
- */
210
- async resolveProjectPathFromChatWorkspace(filePath) {
211
- if (!filePath.includes(`${path.sep}chats${path.sep}`)) {
212
- return '';
213
- }
214
- const chatsDir = path.dirname(filePath);
215
- const workspaceDir = path.dirname(chatsDir);
216
- const projectRootPath = path.join(workspaceDir, '.project_root');
217
- try {
218
- const rootContent = await readFile(projectRootPath, 'utf8');
219
- return rootContent.trim();
220
- }
221
- catch {
222
- return '';
223
- }
224
- }
225
- /**
226
- * Builds a hash->path lookup for Gemini JSONL metadata that stores projectHash.
227
- */
228
- buildProjectHashLookup() {
229
- const lookup = new Map();
230
- const knownPaths = new Set();
231
- for (const project of projectsDb.getProjectPaths()) {
232
- if (typeof project.project_path === 'string' && project.project_path.trim()) {
233
- knownPaths.add(project.project_path.trim());
234
- }
235
- }
236
- for (const session of sessionsDb.getAllSessions()) {
237
- if (session.provider === this.provider && typeof session.project_path === 'string' && session.project_path.trim()) {
238
- knownPaths.add(session.project_path.trim());
239
- }
240
- }
241
- for (const knownPath of knownPaths) {
242
- this.addProjectHashCandidates(lookup, knownPath);
243
- }
244
- return lookup;
245
- }
246
- /**
247
- * Adds likely Gemini hash variants for one project path.
248
- */
249
- addProjectHashCandidates(lookup, projectPath) {
250
- const trimmed = projectPath.trim();
251
- if (!trimmed) {
252
- return;
253
- }
254
- const normalized = normalizeProjectPath(trimmed);
255
- const resolved = path.resolve(trimmed);
256
- const resolvedNormalized = normalizeProjectPath(resolved);
257
- const candidates = new Set([
258
- trimmed,
259
- normalized,
260
- resolved,
261
- resolvedNormalized,
262
- ]);
263
- if (process.platform === 'win32') {
264
- for (const candidate of [...candidates]) {
265
- candidates.add(candidate.toLowerCase());
266
- }
267
- }
268
- for (const candidate of candidates) {
269
- if (!candidate) {
270
- continue;
271
- }
272
- const hash = this.sha256(candidate);
273
- if (!lookup.has(hash)) {
274
- lookup.set(hash, trimmed);
275
- }
276
- }
277
- }
278
- /**
279
- * Returns first user text from Gemini content payload shapes.
280
- */
281
- extractGeminiTextContent(content) {
282
- if (typeof content === 'string' && content.trim().length > 0) {
283
- return content;
284
- }
285
- if (!Array.isArray(content)) {
286
- return undefined;
287
- }
288
- for (const part of content) {
289
- if (typeof part === 'string' && part.trim().length > 0) {
290
- return part;
291
- }
292
- if (part && typeof part === 'object' && typeof part.text === 'string') {
293
- const text = part.text;
294
- if (text.trim().length > 0) {
295
- return text;
296
- }
297
- }
298
- }
299
- return undefined;
300
- }
301
- /**
302
- * Keeps tmp scanning scoped to chat artifacts only.
303
- */
304
- shouldSkipTempArtifact(filePath) {
305
- return (filePath.startsWith(path.join(this.geminiHome, 'tmp'))
306
- && !filePath.includes(`${path.sep}chats${path.sep}`));
307
- }
308
- sha256(value) {
309
- return crypto.createHash('sha256').update(value).digest('hex');
310
- }
311
- }
312
- //# sourceMappingURL=gemini-session-synchronizer.provider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gemini-session-synchronizer.provider.js","sourceRoot":"","sources":["../../../../../../server/modules/providers/list/gemini/gemini-session-synchronizer.provider.ts"],"names":[],"mappings":"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"}