@cloudcli-ai/cloudcli 1.29.5 → 1.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.de.md +1 -1
- package/README.ja.md +1 -1
- package/README.ko.md +1 -1
- package/README.md +1 -1
- package/README.ru.md +1 -1
- package/README.tr.md +252 -0
- package/README.zh-CN.md +1 -1
- package/dist/assets/index-DI22MZMb.css +32 -0
- package/dist/assets/index-RX-W_g_Q.js +1262 -0
- package/dist/index.html +2 -2
- package/dist-server/server/claude-sdk.js +13 -8
- package/dist-server/server/claude-sdk.js.map +1 -1
- package/dist-server/server/cursor-cli.js +7 -7
- package/dist-server/server/cursor-cli.js.map +1 -1
- package/dist-server/server/gemini-cli.js +5 -5
- package/dist-server/server/gemini-cli.js.map +1 -1
- package/dist-server/server/gemini-response-handler.js +2 -2
- package/dist-server/server/gemini-response-handler.js.map +1 -1
- package/dist-server/server/index.js +27 -25
- package/dist-server/server/index.js.map +1 -1
- package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js +103 -0
- package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/claude/claude-mcp.provider.js +103 -0
- package/dist-server/server/modules/providers/list/claude/claude-mcp.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js +266 -0
- package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/claude/claude.provider.js +13 -0
- package/dist-server/server/modules/providers/list/claude/claude.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-auth.provider.js +84 -0
- package/dist-server/server/modules/providers/list/codex/codex-auth.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-mcp.provider.js +107 -0
- package/dist-server/server/modules/providers/list/codex/codex-mcp.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js +282 -0
- package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex.provider.js +13 -0
- package/dist-server/server/modules/providers/list/codex/codex.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js +118 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-mcp.provider.js +80 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-mcp.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js +369 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/cursor/cursor.provider.js +13 -0
- package/dist-server/server/modules/providers/list/cursor/cursor.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/gemini/gemini-auth.provider.js +131 -0
- package/dist-server/server/modules/providers/list/gemini/gemini-auth.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/gemini/gemini-mcp.provider.js +82 -0
- package/dist-server/server/modules/providers/list/gemini/gemini-mcp.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/gemini/gemini-sessions.provider.js +207 -0
- package/dist-server/server/modules/providers/list/gemini/gemini-sessions.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/gemini/gemini.provider.js +13 -0
- package/dist-server/server/modules/providers/list/gemini/gemini.provider.js.map +1 -0
- package/dist-server/server/modules/providers/provider.registry.js +31 -0
- package/dist-server/server/modules/providers/provider.registry.js.map +1 -0
- package/dist-server/server/modules/providers/provider.routes.js +159 -0
- package/dist-server/server/modules/providers/provider.routes.js.map +1 -0
- package/dist-server/server/modules/providers/services/mcp.service.js +69 -0
- package/dist-server/server/modules/providers/services/mcp.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/provider-auth.service.js +25 -0
- package/dist-server/server/modules/providers/services/provider-auth.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/sessions.service.js +29 -0
- package/dist-server/server/modules/providers/services/sessions.service.js.map +1 -0
- package/dist-server/server/modules/providers/shared/base/abstract.provider.js +14 -0
- package/dist-server/server/modules/providers/shared/base/abstract.provider.js.map +1 -0
- package/dist-server/server/modules/providers/shared/mcp/mcp.provider.js +102 -0
- package/dist-server/server/modules/providers/shared/mcp/mcp.provider.js.map +1 -0
- package/dist-server/server/modules/providers/tests/mcp.test.js +250 -0
- package/dist-server/server/modules/providers/tests/mcp.test.js.map +1 -0
- package/dist-server/server/openai-codex.js +5 -5
- package/dist-server/server/openai-codex.js.map +1 -1
- package/dist-server/server/routes/codex.js +2 -278
- package/dist-server/server/routes/codex.js.map +1 -1
- package/dist-server/server/routes/commands.js +0 -44
- package/dist-server/server/routes/commands.js.map +1 -1
- package/dist-server/server/routes/cursor.js +9 -489
- package/dist-server/server/routes/cursor.js.map +1 -1
- package/dist-server/server/routes/mcp-utils.js +1 -18
- package/dist-server/server/routes/mcp-utils.js.map +1 -1
- package/dist-server/server/routes/messages.js +6 -6
- package/dist-server/server/routes/messages.js.map +1 -1
- package/dist-server/server/routes/settings.js +10 -0
- package/dist-server/server/routes/settings.js.map +1 -1
- package/dist-server/server/routes/taskmaster.js +0 -459
- package/dist-server/server/routes/taskmaster.js.map +1 -1
- package/dist-server/server/shared/interfaces.js +2 -0
- package/dist-server/server/shared/interfaces.js.map +1 -0
- package/dist-server/server/shared/types.js +3 -0
- package/dist-server/server/shared/types.js.map +1 -0
- package/dist-server/server/shared/utils.js +150 -0
- package/dist-server/server/shared/utils.js.map +1 -0
- package/dist-server/server/utils/mcp-detector.js +0 -49
- package/dist-server/server/utils/mcp-detector.js.map +1 -1
- package/dist-server/shared/modelConstants.js +1 -0
- package/dist-server/shared/modelConstants.js.map +1 -1
- package/package.json +5 -2
- package/server/claude-sdk.js +14 -8
- package/server/cursor-cli.js +7 -7
- package/server/gemini-cli.js +5 -5
- package/server/gemini-response-handler.js +2 -2
- package/server/index.js +33 -29
- package/server/modules/providers/list/claude/claude-auth.provider.ts +123 -0
- package/server/modules/providers/list/claude/claude-mcp.provider.ts +135 -0
- package/server/modules/providers/list/claude/claude-sessions.provider.ts +306 -0
- package/server/modules/providers/list/claude/claude.provider.ts +15 -0
- package/server/modules/providers/list/codex/codex-auth.provider.ts +100 -0
- package/server/modules/providers/list/codex/codex-mcp.provider.ts +135 -0
- package/server/modules/providers/list/codex/codex-sessions.provider.ts +319 -0
- package/server/modules/providers/list/codex/codex.provider.ts +15 -0
- package/server/modules/providers/list/cursor/cursor-auth.provider.ts +143 -0
- package/server/modules/providers/list/cursor/cursor-mcp.provider.ts +108 -0
- package/server/modules/providers/list/cursor/cursor-sessions.provider.ts +421 -0
- package/server/modules/providers/list/cursor/cursor.provider.ts +15 -0
- package/server/modules/providers/list/gemini/gemini-auth.provider.ts +151 -0
- package/server/modules/providers/list/gemini/gemini-mcp.provider.ts +110 -0
- package/server/modules/providers/list/gemini/gemini-sessions.provider.ts +227 -0
- package/server/modules/providers/list/gemini/gemini.provider.ts +15 -0
- package/server/modules/providers/provider.registry.ts +36 -0
- package/server/modules/providers/provider.routes.ts +217 -0
- package/server/modules/providers/services/mcp.service.ts +94 -0
- package/server/modules/providers/services/provider-auth.service.ts +26 -0
- package/server/modules/providers/services/sessions.service.ts +45 -0
- package/server/modules/providers/shared/base/abstract.provider.ts +20 -0
- package/server/modules/providers/shared/mcp/mcp.provider.ts +151 -0
- package/server/modules/providers/tests/mcp.test.ts +293 -0
- package/server/openai-codex.js +5 -5
- package/server/routes/codex.js +2 -312
- package/server/routes/commands.js +0 -49
- package/server/routes/cursor.js +15 -527
- package/server/routes/mcp-utils.js +2 -19
- package/server/routes/messages.js +6 -6
- package/server/routes/settings.js +10 -0
- package/server/routes/taskmaster.js +0 -492
- package/server/shared/interfaces.ts +54 -0
- package/server/shared/types.ts +172 -0
- package/server/shared/utils.ts +193 -0
- package/server/tsconfig.json +6 -3
- package/server/utils/mcp-detector.js +0 -51
- package/shared/modelConstants.js +1 -0
- package/dist/assets/index-BBAE1OJ_.css +0 -32
- package/dist/assets/index-Ci1GOyV7.js +0 -1262
- package/dist-server/server/providers/claude/adapter.js +0 -266
- package/dist-server/server/providers/claude/adapter.js.map +0 -1
- package/dist-server/server/providers/claude/status.js +0 -121
- package/dist-server/server/providers/claude/status.js.map +0 -1
- package/dist-server/server/providers/codex/adapter.js +0 -232
- package/dist-server/server/providers/codex/adapter.js.map +0 -1
- package/dist-server/server/providers/codex/status.js +0 -70
- package/dist-server/server/providers/codex/status.js.map +0 -1
- package/dist-server/server/providers/cursor/adapter.js +0 -342
- package/dist-server/server/providers/cursor/adapter.js.map +0 -1
- package/dist-server/server/providers/cursor/status.js +0 -118
- package/dist-server/server/providers/cursor/status.js.map +0 -1
- package/dist-server/server/providers/gemini/adapter.js +0 -174
- package/dist-server/server/providers/gemini/adapter.js.map +0 -1
- package/dist-server/server/providers/gemini/status.js +0 -104
- package/dist-server/server/providers/gemini/status.js.map +0 -1
- package/dist-server/server/providers/registry.js +0 -58
- package/dist-server/server/providers/registry.js.map +0 -1
- package/dist-server/server/providers/types.js +0 -117
- package/dist-server/server/providers/types.js.map +0 -1
- package/dist-server/server/providers/utils.js +0 -28
- package/dist-server/server/providers/utils.js.map +0 -1
- package/dist-server/server/routes/cli-auth.js +0 -25
- package/dist-server/server/routes/cli-auth.js.map +0 -1
- package/dist-server/server/routes/mcp.js +0 -480
- package/dist-server/server/routes/mcp.js.map +0 -1
- package/server/providers/claude/adapter.js +0 -278
- package/server/providers/claude/status.js +0 -136
- package/server/providers/codex/adapter.js +0 -248
- package/server/providers/codex/status.js +0 -78
- package/server/providers/cursor/adapter.js +0 -348
- package/server/providers/cursor/status.js +0 -128
- package/server/providers/gemini/adapter.js +0 -186
- package/server/providers/gemini/status.js +0 -111
- package/server/providers/registry.js +0 -67
- package/server/providers/types.js +0 -132
- package/server/providers/utils.js +0 -29
- package/server/routes/cli-auth.js +0 -27
- package/server/routes/mcp.js +0 -552
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Gemini provider adapter.
|
|
3
|
-
*
|
|
4
|
-
* Normalizes Gemini CLI session history into NormalizedMessage format.
|
|
5
|
-
* @module adapters/gemini
|
|
6
|
-
*/
|
|
7
|
-
import sessionManager from '../../sessionManager.js';
|
|
8
|
-
import { getGeminiCliSessionMessages } from '../../projects.js';
|
|
9
|
-
import { createNormalizedMessage, generateMessageId } from '../types.js';
|
|
10
|
-
const PROVIDER = 'gemini';
|
|
11
|
-
/**
|
|
12
|
-
* Normalize a realtime NDJSON event from Gemini CLI into NormalizedMessage(s).
|
|
13
|
-
* Handles: message (delta/final), tool_use, tool_result, result, error.
|
|
14
|
-
* @param {object} raw - A parsed NDJSON event
|
|
15
|
-
* @param {string} sessionId
|
|
16
|
-
* @returns {import('../types.js').NormalizedMessage[]}
|
|
17
|
-
*/
|
|
18
|
-
export function normalizeMessage(raw, sessionId) {
|
|
19
|
-
const ts = raw.timestamp || new Date().toISOString();
|
|
20
|
-
const baseId = raw.uuid || generateMessageId('gemini');
|
|
21
|
-
if (raw.type === 'message' && raw.role === 'assistant') {
|
|
22
|
-
const content = raw.content || '';
|
|
23
|
-
const msgs = [];
|
|
24
|
-
if (content) {
|
|
25
|
-
msgs.push(createNormalizedMessage({ id: baseId, sessionId, timestamp: ts, provider: PROVIDER, kind: 'stream_delta', content }));
|
|
26
|
-
}
|
|
27
|
-
// If not a delta, also send stream_end
|
|
28
|
-
if (raw.delta !== true) {
|
|
29
|
-
msgs.push(createNormalizedMessage({ sessionId, timestamp: ts, provider: PROVIDER, kind: 'stream_end' }));
|
|
30
|
-
}
|
|
31
|
-
return msgs;
|
|
32
|
-
}
|
|
33
|
-
if (raw.type === 'tool_use') {
|
|
34
|
-
return [createNormalizedMessage({
|
|
35
|
-
id: baseId, sessionId, timestamp: ts, provider: PROVIDER,
|
|
36
|
-
kind: 'tool_use', toolName: raw.tool_name, toolInput: raw.parameters || {},
|
|
37
|
-
toolId: raw.tool_id || baseId,
|
|
38
|
-
})];
|
|
39
|
-
}
|
|
40
|
-
if (raw.type === 'tool_result') {
|
|
41
|
-
return [createNormalizedMessage({
|
|
42
|
-
id: baseId, sessionId, timestamp: ts, provider: PROVIDER,
|
|
43
|
-
kind: 'tool_result', toolId: raw.tool_id || '',
|
|
44
|
-
content: raw.output === undefined ? '' : String(raw.output),
|
|
45
|
-
isError: raw.status === 'error',
|
|
46
|
-
})];
|
|
47
|
-
}
|
|
48
|
-
if (raw.type === 'result') {
|
|
49
|
-
const msgs = [createNormalizedMessage({ sessionId, timestamp: ts, provider: PROVIDER, kind: 'stream_end' })];
|
|
50
|
-
if (raw.stats?.total_tokens) {
|
|
51
|
-
msgs.push(createNormalizedMessage({
|
|
52
|
-
sessionId, timestamp: ts, provider: PROVIDER,
|
|
53
|
-
kind: 'status', text: 'Complete', tokens: raw.stats.total_tokens, canInterrupt: false,
|
|
54
|
-
}));
|
|
55
|
-
}
|
|
56
|
-
return msgs;
|
|
57
|
-
}
|
|
58
|
-
if (raw.type === 'error') {
|
|
59
|
-
return [createNormalizedMessage({
|
|
60
|
-
id: baseId, sessionId, timestamp: ts, provider: PROVIDER,
|
|
61
|
-
kind: 'error', content: raw.error || raw.message || 'Unknown Gemini streaming error',
|
|
62
|
-
})];
|
|
63
|
-
}
|
|
64
|
-
return [];
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* @type {import('../types.js').ProviderAdapter}
|
|
68
|
-
*/
|
|
69
|
-
export const geminiAdapter = {
|
|
70
|
-
normalizeMessage,
|
|
71
|
-
/**
|
|
72
|
-
* Fetch session history for Gemini.
|
|
73
|
-
* First tries in-memory session manager, then falls back to CLI sessions on disk.
|
|
74
|
-
*/
|
|
75
|
-
async fetchHistory(sessionId, opts = {}) {
|
|
76
|
-
let rawMessages;
|
|
77
|
-
try {
|
|
78
|
-
rawMessages = sessionManager.getSessionMessages(sessionId);
|
|
79
|
-
// Fallback to Gemini CLI sessions on disk
|
|
80
|
-
if (rawMessages.length === 0) {
|
|
81
|
-
rawMessages = await getGeminiCliSessionMessages(sessionId);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
catch (error) {
|
|
85
|
-
console.warn(`[GeminiAdapter] Failed to load session ${sessionId}:`, error.message);
|
|
86
|
-
return { messages: [], total: 0, hasMore: false, offset: 0, limit: null };
|
|
87
|
-
}
|
|
88
|
-
const normalized = [];
|
|
89
|
-
for (let i = 0; i < rawMessages.length; i++) {
|
|
90
|
-
const raw = rawMessages[i];
|
|
91
|
-
const ts = raw.timestamp || new Date().toISOString();
|
|
92
|
-
const baseId = raw.uuid || generateMessageId('gemini');
|
|
93
|
-
// sessionManager format: { type: 'message', message: { role, content }, timestamp }
|
|
94
|
-
// CLI format: { role: 'user'|'gemini'|'assistant', content: string|array }
|
|
95
|
-
const role = raw.message?.role || raw.role;
|
|
96
|
-
const content = raw.message?.content || raw.content;
|
|
97
|
-
if (!role || !content)
|
|
98
|
-
continue;
|
|
99
|
-
const normalizedRole = (role === 'user') ? 'user' : 'assistant';
|
|
100
|
-
if (Array.isArray(content)) {
|
|
101
|
-
for (let partIdx = 0; partIdx < content.length; partIdx++) {
|
|
102
|
-
const part = content[partIdx];
|
|
103
|
-
if (part.type === 'text' && part.text) {
|
|
104
|
-
normalized.push(createNormalizedMessage({
|
|
105
|
-
id: `${baseId}_${partIdx}`,
|
|
106
|
-
sessionId,
|
|
107
|
-
timestamp: ts,
|
|
108
|
-
provider: PROVIDER,
|
|
109
|
-
kind: 'text',
|
|
110
|
-
role: normalizedRole,
|
|
111
|
-
content: part.text,
|
|
112
|
-
}));
|
|
113
|
-
}
|
|
114
|
-
else if (part.type === 'tool_use') {
|
|
115
|
-
normalized.push(createNormalizedMessage({
|
|
116
|
-
id: `${baseId}_${partIdx}`,
|
|
117
|
-
sessionId,
|
|
118
|
-
timestamp: ts,
|
|
119
|
-
provider: PROVIDER,
|
|
120
|
-
kind: 'tool_use',
|
|
121
|
-
toolName: part.name,
|
|
122
|
-
toolInput: part.input,
|
|
123
|
-
toolId: part.id || generateMessageId('gemini_tool'),
|
|
124
|
-
}));
|
|
125
|
-
}
|
|
126
|
-
else if (part.type === 'tool_result') {
|
|
127
|
-
normalized.push(createNormalizedMessage({
|
|
128
|
-
id: `${baseId}_${partIdx}`,
|
|
129
|
-
sessionId,
|
|
130
|
-
timestamp: ts,
|
|
131
|
-
provider: PROVIDER,
|
|
132
|
-
kind: 'tool_result',
|
|
133
|
-
toolId: part.tool_use_id || '',
|
|
134
|
-
content: part.content === undefined ? '' : String(part.content),
|
|
135
|
-
isError: Boolean(part.is_error),
|
|
136
|
-
}));
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
else if (typeof content === 'string' && content.trim()) {
|
|
141
|
-
normalized.push(createNormalizedMessage({
|
|
142
|
-
id: baseId,
|
|
143
|
-
sessionId,
|
|
144
|
-
timestamp: ts,
|
|
145
|
-
provider: PROVIDER,
|
|
146
|
-
kind: 'text',
|
|
147
|
-
role: normalizedRole,
|
|
148
|
-
content,
|
|
149
|
-
}));
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
// Attach tool results to tool_use messages
|
|
153
|
-
const toolResultMap = new Map();
|
|
154
|
-
for (const msg of normalized) {
|
|
155
|
-
if (msg.kind === 'tool_result' && msg.toolId) {
|
|
156
|
-
toolResultMap.set(msg.toolId, msg);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
for (const msg of normalized) {
|
|
160
|
-
if (msg.kind === 'tool_use' && msg.toolId && toolResultMap.has(msg.toolId)) {
|
|
161
|
-
const tr = toolResultMap.get(msg.toolId);
|
|
162
|
-
msg.toolResult = { content: tr.content, isError: tr.isError };
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
return {
|
|
166
|
-
messages: normalized,
|
|
167
|
-
total: normalized.length,
|
|
168
|
-
hasMore: false,
|
|
169
|
-
offset: 0,
|
|
170
|
-
limit: null,
|
|
171
|
-
};
|
|
172
|
-
},
|
|
173
|
-
};
|
|
174
|
-
//# sourceMappingURL=adapter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../../server/providers/gemini/adapter.js"],"names":[],"mappings":"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"}
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Gemini Provider Status
|
|
3
|
-
*
|
|
4
|
-
* Checks whether Gemini CLI is installed and whether the user
|
|
5
|
-
* has valid authentication credentials.
|
|
6
|
-
*
|
|
7
|
-
* @module providers/gemini/status
|
|
8
|
-
*/
|
|
9
|
-
import { execFileSync } from 'child_process';
|
|
10
|
-
import { promises as fs } from 'fs';
|
|
11
|
-
import path from 'path';
|
|
12
|
-
import os from 'os';
|
|
13
|
-
/**
|
|
14
|
-
* Check if Gemini CLI is installed.
|
|
15
|
-
* Uses GEMINI_PATH env var if set, otherwise looks for 'gemini' in PATH.
|
|
16
|
-
* @returns {boolean}
|
|
17
|
-
*/
|
|
18
|
-
export function checkInstalled() {
|
|
19
|
-
const cliPath = process.env.GEMINI_PATH || 'gemini';
|
|
20
|
-
try {
|
|
21
|
-
execFileSync(cliPath, ['--version'], { stdio: 'ignore', timeout: 5000 });
|
|
22
|
-
return true;
|
|
23
|
-
}
|
|
24
|
-
catch {
|
|
25
|
-
return false;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Full status check: installation + authentication.
|
|
30
|
-
* @returns {Promise<import('../types.js').ProviderStatus>}
|
|
31
|
-
*/
|
|
32
|
-
export async function checkStatus() {
|
|
33
|
-
const installed = checkInstalled();
|
|
34
|
-
if (!installed) {
|
|
35
|
-
return {
|
|
36
|
-
installed,
|
|
37
|
-
authenticated: false,
|
|
38
|
-
email: null,
|
|
39
|
-
error: 'Gemini CLI is not installed'
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
const result = await checkCredentials();
|
|
43
|
-
return {
|
|
44
|
-
installed,
|
|
45
|
-
authenticated: result.authenticated,
|
|
46
|
-
email: result.email || null,
|
|
47
|
-
error: result.error || null
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
// ─── Internal helpers ───────────────────────────────────────────────────────
|
|
51
|
-
async function checkCredentials() {
|
|
52
|
-
if (process.env.GEMINI_API_KEY && process.env.GEMINI_API_KEY.trim()) {
|
|
53
|
-
return { authenticated: true, email: 'API Key Auth' };
|
|
54
|
-
}
|
|
55
|
-
try {
|
|
56
|
-
const credsPath = path.join(os.homedir(), '.gemini', 'oauth_creds.json');
|
|
57
|
-
const content = await fs.readFile(credsPath, 'utf8');
|
|
58
|
-
const creds = JSON.parse(content);
|
|
59
|
-
if (creds.access_token) {
|
|
60
|
-
let email = 'OAuth Session';
|
|
61
|
-
try {
|
|
62
|
-
const tokenRes = await fetch(`https://oauth2.googleapis.com/tokeninfo?access_token=${creds.access_token}`);
|
|
63
|
-
if (tokenRes.ok) {
|
|
64
|
-
const tokenInfo = await tokenRes.json();
|
|
65
|
-
if (tokenInfo.email) {
|
|
66
|
-
email = tokenInfo.email;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
else if (!creds.refresh_token) {
|
|
70
|
-
return {
|
|
71
|
-
authenticated: false,
|
|
72
|
-
email: null,
|
|
73
|
-
error: 'Access token invalid and no refresh token found'
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
77
|
-
// Token might be expired but we have a refresh token, so CLI will refresh it
|
|
78
|
-
email = await getActiveAccountEmail() || email;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
catch {
|
|
82
|
-
// Network error, fallback to checking local accounts file
|
|
83
|
-
email = await getActiveAccountEmail() || email;
|
|
84
|
-
}
|
|
85
|
-
return { authenticated: true, email };
|
|
86
|
-
}
|
|
87
|
-
return { authenticated: false, email: null, error: 'No valid tokens found in oauth_creds' };
|
|
88
|
-
}
|
|
89
|
-
catch {
|
|
90
|
-
return { authenticated: false, email: null, error: 'Gemini CLI not configured' };
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
async function getActiveAccountEmail() {
|
|
94
|
-
try {
|
|
95
|
-
const accPath = path.join(os.homedir(), '.gemini', 'google_accounts.json');
|
|
96
|
-
const accContent = await fs.readFile(accPath, 'utf8');
|
|
97
|
-
const accounts = JSON.parse(accContent);
|
|
98
|
-
return accounts.active || null;
|
|
99
|
-
}
|
|
100
|
-
catch {
|
|
101
|
-
return null;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
//# sourceMappingURL=status.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../server/providers/gemini/status.js"],"names":[],"mappings":"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"}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Provider Registry
|
|
3
|
-
*
|
|
4
|
-
* Centralizes provider adapter and status checker lookup. All code that needs
|
|
5
|
-
* a provider adapter or status checker should go through this registry instead
|
|
6
|
-
* of importing individual modules directly.
|
|
7
|
-
*
|
|
8
|
-
* @module providers/registry
|
|
9
|
-
*/
|
|
10
|
-
import { claudeAdapter } from './claude/adapter.js';
|
|
11
|
-
import { cursorAdapter } from './cursor/adapter.js';
|
|
12
|
-
import { codexAdapter } from './codex/adapter.js';
|
|
13
|
-
import { geminiAdapter } from './gemini/adapter.js';
|
|
14
|
-
import * as claudeStatus from './claude/status.js';
|
|
15
|
-
import * as cursorStatus from './cursor/status.js';
|
|
16
|
-
import * as codexStatus from './codex/status.js';
|
|
17
|
-
import * as geminiStatus from './gemini/status.js';
|
|
18
|
-
/**
|
|
19
|
-
* @typedef {import('./types.js').ProviderAdapter} ProviderAdapter
|
|
20
|
-
* @typedef {import('./types.js').SessionProvider} SessionProvider
|
|
21
|
-
*/
|
|
22
|
-
/** @type {Map<string, ProviderAdapter>} */
|
|
23
|
-
const providers = new Map();
|
|
24
|
-
/** @type {Map<string, { checkInstalled: () => boolean, checkStatus: () => Promise<import('./types.js').ProviderStatus> }>} */
|
|
25
|
-
const statusCheckers = new Map();
|
|
26
|
-
// Register built-in providers
|
|
27
|
-
providers.set('claude', claudeAdapter);
|
|
28
|
-
providers.set('cursor', cursorAdapter);
|
|
29
|
-
providers.set('codex', codexAdapter);
|
|
30
|
-
providers.set('gemini', geminiAdapter);
|
|
31
|
-
statusCheckers.set('claude', claudeStatus);
|
|
32
|
-
statusCheckers.set('cursor', cursorStatus);
|
|
33
|
-
statusCheckers.set('codex', codexStatus);
|
|
34
|
-
statusCheckers.set('gemini', geminiStatus);
|
|
35
|
-
/**
|
|
36
|
-
* Get a provider adapter by name.
|
|
37
|
-
* @param {string} name - Provider name (e.g., 'claude', 'cursor', 'codex', 'gemini')
|
|
38
|
-
* @returns {ProviderAdapter | undefined}
|
|
39
|
-
*/
|
|
40
|
-
export function getProvider(name) {
|
|
41
|
-
return providers.get(name);
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Get a provider status checker by name.
|
|
45
|
-
* @param {string} name - Provider name
|
|
46
|
-
* @returns {{ checkInstalled: () => boolean, checkStatus: () => Promise<import('./types.js').ProviderStatus> } | undefined}
|
|
47
|
-
*/
|
|
48
|
-
export function getStatusChecker(name) {
|
|
49
|
-
return statusCheckers.get(name);
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Get all registered provider names.
|
|
53
|
-
* @returns {string[]}
|
|
54
|
-
*/
|
|
55
|
-
export function getAllProviders() {
|
|
56
|
-
return Array.from(providers.keys());
|
|
57
|
-
}
|
|
58
|
-
//# sourceMappingURL=registry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../server/providers/registry.js"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AAEnD;;;GAGG;AAEH,2CAA2C;AAC3C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;AAE5B,8HAA8H;AAC9H,MAAM,cAAc,GAAG,IAAI,GAAG,EAAE,CAAC;AAEjC,8BAA8B;AAC9B,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AACvC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AACvC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AACrC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AAEvC,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;AAC3C,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;AAC3C,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AACzC,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;AAE3C;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,IAAI;IAC9B,OAAO,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAI;IACnC,OAAO,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Provider Types & Interface
|
|
3
|
-
*
|
|
4
|
-
* Defines the normalized message format and the provider adapter interface.
|
|
5
|
-
* All providers normalize their native formats into NormalizedMessage
|
|
6
|
-
* before sending over REST or WebSocket.
|
|
7
|
-
*
|
|
8
|
-
* @module providers/types
|
|
9
|
-
*/
|
|
10
|
-
// ─── Session Provider ────────────────────────────────────────────────────────
|
|
11
|
-
/**
|
|
12
|
-
* @typedef {'claude' | 'cursor' | 'codex' | 'gemini'} SessionProvider
|
|
13
|
-
*/
|
|
14
|
-
// ─── Message Kind ────────────────────────────────────────────────────────────
|
|
15
|
-
/**
|
|
16
|
-
* @typedef {'text' | 'tool_use' | 'tool_result' | 'thinking' | 'stream_delta' | 'stream_end'
|
|
17
|
-
* | 'error' | 'complete' | 'status' | 'permission_request' | 'permission_cancelled'
|
|
18
|
-
* | 'session_created' | 'interactive_prompt' | 'task_notification'} MessageKind
|
|
19
|
-
*/
|
|
20
|
-
// ─── NormalizedMessage ───────────────────────────────────────────────────────
|
|
21
|
-
/**
|
|
22
|
-
* @typedef {Object} NormalizedMessage
|
|
23
|
-
* @property {string} id - Unique message id (for dedup between server + realtime)
|
|
24
|
-
* @property {string} sessionId
|
|
25
|
-
* @property {string} timestamp - ISO 8601
|
|
26
|
-
* @property {SessionProvider} provider
|
|
27
|
-
* @property {MessageKind} kind
|
|
28
|
-
*
|
|
29
|
-
* Additional fields depending on kind:
|
|
30
|
-
* - text: role ('user'|'assistant'), content, images?
|
|
31
|
-
* - tool_use: toolName, toolInput, toolId
|
|
32
|
-
* - tool_result: toolId, content, isError
|
|
33
|
-
* - thinking: content
|
|
34
|
-
* - stream_delta: content
|
|
35
|
-
* - stream_end: (no extra fields)
|
|
36
|
-
* - error: content
|
|
37
|
-
* - complete: (no extra fields)
|
|
38
|
-
* - status: text, tokens?, canInterrupt?
|
|
39
|
-
* - permission_request: requestId, toolName, input, context?
|
|
40
|
-
* - permission_cancelled: requestId
|
|
41
|
-
* - session_created: newSessionId
|
|
42
|
-
* - interactive_prompt: content
|
|
43
|
-
* - task_notification: status, summary
|
|
44
|
-
*/
|
|
45
|
-
// ─── Fetch History ───────────────────────────────────────────────────────────
|
|
46
|
-
/**
|
|
47
|
-
* @typedef {Object} FetchHistoryOptions
|
|
48
|
-
* @property {string} [projectName] - Project name (required for Claude)
|
|
49
|
-
* @property {string} [projectPath] - Absolute project path (required for Cursor cwdId hash)
|
|
50
|
-
* @property {number|null} [limit] - Page size (null = all messages)
|
|
51
|
-
* @property {number} [offset] - Pagination offset (default: 0)
|
|
52
|
-
*/
|
|
53
|
-
/**
|
|
54
|
-
* @typedef {Object} FetchHistoryResult
|
|
55
|
-
* @property {NormalizedMessage[]} messages - Normalized messages
|
|
56
|
-
* @property {number} total - Total number of messages in the session
|
|
57
|
-
* @property {boolean} hasMore - Whether more messages exist before the current page
|
|
58
|
-
* @property {number} offset - Current offset
|
|
59
|
-
* @property {number|null} limit - Page size used
|
|
60
|
-
* @property {object} [tokenUsage] - Token usage data (provider-specific)
|
|
61
|
-
*/
|
|
62
|
-
// ─── Provider Status ────────────────────────────────────────────────────────
|
|
63
|
-
/**
|
|
64
|
-
* Result of a provider status check (installation + authentication).
|
|
65
|
-
*
|
|
66
|
-
* @typedef {Object} ProviderStatus
|
|
67
|
-
* @property {boolean} installed - Whether the provider's CLI/SDK is available
|
|
68
|
-
* @property {boolean} authenticated - Whether valid credentials exist
|
|
69
|
-
* @property {string|null} email - User email or auth method identifier
|
|
70
|
-
* @property {string|null} [method] - Auth method (e.g. 'api_key', 'credentials_file')
|
|
71
|
-
* @property {string|null} [error] - Error message if not installed or not authenticated
|
|
72
|
-
*/
|
|
73
|
-
// ─── Provider Adapter Interface ──────────────────────────────────────────────
|
|
74
|
-
/**
|
|
75
|
-
* Every provider adapter MUST implement this interface.
|
|
76
|
-
*
|
|
77
|
-
* @typedef {Object} ProviderAdapter
|
|
78
|
-
*
|
|
79
|
-
* @property {(sessionId: string, opts?: FetchHistoryOptions) => Promise<FetchHistoryResult>} fetchHistory
|
|
80
|
-
* Read persisted session messages from disk/database and return them as NormalizedMessage[].
|
|
81
|
-
* The backend calls this from the unified GET /api/sessions/:id/messages endpoint.
|
|
82
|
-
*
|
|
83
|
-
* Provider implementations:
|
|
84
|
-
* - Claude: reads ~/.claude/projects/{projectName}/*.jsonl
|
|
85
|
-
* - Cursor: reads from SQLite store.db (via normalizeCursorBlobs helper)
|
|
86
|
-
* - Codex: reads ~/.codex/sessions/*.jsonl
|
|
87
|
-
* - Gemini: reads from in-memory sessionManager or ~/.gemini/tmp/ JSON files
|
|
88
|
-
*
|
|
89
|
-
* @property {(raw: any, sessionId: string) => NormalizedMessage[]} normalizeMessage
|
|
90
|
-
* Normalize a provider-specific event (JSONL entry or live SDK event) into NormalizedMessage[].
|
|
91
|
-
* Used by provider files to convert both history and realtime events.
|
|
92
|
-
*/
|
|
93
|
-
// ─── Runtime Helpers ─────────────────────────────────────────────────────────
|
|
94
|
-
/**
|
|
95
|
-
* Generate a unique message ID.
|
|
96
|
-
* Uses crypto.randomUUID() to avoid collisions across server restarts and workers.
|
|
97
|
-
* @param {string} [prefix='msg'] - Optional prefix
|
|
98
|
-
* @returns {string}
|
|
99
|
-
*/
|
|
100
|
-
export function generateMessageId(prefix = 'msg') {
|
|
101
|
-
return `${prefix}_${crypto.randomUUID()}`;
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Create a NormalizedMessage with common fields pre-filled.
|
|
105
|
-
* @param {Partial<NormalizedMessage> & {kind: MessageKind, provider: SessionProvider}} fields
|
|
106
|
-
* @returns {NormalizedMessage}
|
|
107
|
-
*/
|
|
108
|
-
export function createNormalizedMessage(fields) {
|
|
109
|
-
return {
|
|
110
|
-
...fields,
|
|
111
|
-
id: fields.id || generateMessageId(fields.kind),
|
|
112
|
-
sessionId: fields.sessionId || '',
|
|
113
|
-
timestamp: fields.timestamp || new Date().toISOString(),
|
|
114
|
-
provider: fields.provider,
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
//# sourceMappingURL=types.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../server/providers/types.js"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,gFAAgF;AAEhF;;GAEG;AAEH,gFAAgF;AAEhF;;;;GAIG;AAEH,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,gFAAgF;AAEhF;;;;;;GAMG;AAEH;;;;;;;;GAQG;AAEH,+EAA+E;AAE/E;;;;;;;;;GASG;AAEH,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;GAkBG;AAEH,gFAAgF;AAEhF;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAM,GAAG,KAAK;IAC9C,OAAO,GAAG,MAAM,IAAI,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAM;IAC5C,OAAO;QACL,GAAG,MAAM;QACT,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC;QAC/C,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE;QACjC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACvD,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC;AACJ,CAAC"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared provider utilities.
|
|
3
|
-
*
|
|
4
|
-
* @module providers/utils
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* Prefixes that indicate internal/system content which should be hidden from the UI.
|
|
8
|
-
* @type {readonly string[]}
|
|
9
|
-
*/
|
|
10
|
-
export const INTERNAL_CONTENT_PREFIXES = Object.freeze([
|
|
11
|
-
'<command-name>',
|
|
12
|
-
'<command-message>',
|
|
13
|
-
'<command-args>',
|
|
14
|
-
'<local-command-stdout>',
|
|
15
|
-
'<system-reminder>',
|
|
16
|
-
'Caveat:',
|
|
17
|
-
'This session is being continued from a previous',
|
|
18
|
-
'[Request interrupted',
|
|
19
|
-
]);
|
|
20
|
-
/**
|
|
21
|
-
* Check if user text content is internal/system that should be skipped.
|
|
22
|
-
* @param {string} content
|
|
23
|
-
* @returns {boolean}
|
|
24
|
-
*/
|
|
25
|
-
export function isInternalContent(content) {
|
|
26
|
-
return INTERNAL_CONTENT_PREFIXES.some(prefix => content.startsWith(prefix));
|
|
27
|
-
}
|
|
28
|
-
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../server/providers/utils.js"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC,MAAM,CAAC;IACrD,gBAAgB;IAChB,mBAAmB;IACnB,gBAAgB;IAChB,wBAAwB;IACxB,mBAAmB;IACnB,SAAS;IACT,iDAAiD;IACjD,sBAAsB;CACvB,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAO;IACvC,OAAO,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9E,CAAC"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CLI Auth Routes
|
|
3
|
-
*
|
|
4
|
-
* Thin router that delegates to per-provider status checkers
|
|
5
|
-
* registered in the provider registry.
|
|
6
|
-
*
|
|
7
|
-
* @module routes/cli-auth
|
|
8
|
-
*/
|
|
9
|
-
import express from 'express';
|
|
10
|
-
import { getAllProviders, getStatusChecker } from '../providers/registry.js';
|
|
11
|
-
const router = express.Router();
|
|
12
|
-
for (const provider of getAllProviders()) {
|
|
13
|
-
router.get(`/${provider}/status`, async (req, res) => {
|
|
14
|
-
try {
|
|
15
|
-
const checker = getStatusChecker(provider);
|
|
16
|
-
res.json(await checker.checkStatus());
|
|
17
|
-
}
|
|
18
|
-
catch (error) {
|
|
19
|
-
console.error(`Error checking ${provider} status:`, error);
|
|
20
|
-
res.status(500).json({ authenticated: false, error: error.message });
|
|
21
|
-
}
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
export default router;
|
|
25
|
-
//# sourceMappingURL=cli-auth.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli-auth.js","sourceRoot":"","sources":["../../../server/routes/cli-auth.js"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE7E,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;AAEhC,KAAK,MAAM,QAAQ,IAAI,eAAe,EAAE,EAAE,CAAC;IACzC,MAAM,CAAC,GAAG,CAAC,IAAI,QAAQ,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACnD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAC3C,GAAG,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,kBAAkB,QAAQ,UAAU,EAAE,KAAK,CAAC,CAAC;YAC3D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,eAAe,MAAM,CAAC"}
|