@zmeel/adapter-gemini-local 0.1.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/LICENSE +21 -0
- package/dist/cli/format-event.d.ts +2 -0
- package/dist/cli/format-event.d.ts.map +1 -0
- package/dist/cli/format-event.js +198 -0
- package/dist/cli/format-event.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/index.js.map +1 -0
- package/dist/server/execute.d.ts +3 -0
- package/dist/server/execute.d.ts.map +1 -0
- package/dist/server/execute.js +372 -0
- package/dist/server/execute.js.map +1 -0
- package/dist/server/index.d.ts +7 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +62 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/parse.d.ts +38 -0
- package/dist/server/parse.d.ts.map +1 -0
- package/dist/server/parse.js +238 -0
- package/dist/server/parse.js.map +1 -0
- package/dist/server/skills.d.ts +8 -0
- package/dist/server/skills.d.ts.map +1 -0
- package/dist/server/skills.js +69 -0
- package/dist/server/skills.js.map +1 -0
- package/dist/server/test.d.ts +3 -0
- package/dist/server/test.d.ts.map +1 -0
- package/dist/server/test.js +219 -0
- package/dist/server/test.js.map +1 -0
- package/dist/server/utils.d.ts +2 -0
- package/dist/server/utils.d.ts.map +1 -0
- package/dist/server/utils.js +7 -0
- package/dist/server/utils.js.map +1 -0
- package/dist/ui/build-config.d.ts +3 -0
- package/dist/ui/build-config.d.ts.map +1 -0
- package/dist/ui/build-config.js +84 -0
- package/dist/ui/build-config.js.map +1 -0
- package/dist/ui/index.d.ts +3 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +3 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/parse-stdout.d.ts +3 -0
- package/dist/ui/parse-stdout.d.ts.map +1 -0
- package/dist/ui/parse-stdout.js +247 -0
- package/dist/ui/parse-stdout.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import { asNumber, asString, parseJson, parseObject } from "@zmeel/adapter-utils/server-utils";
|
|
2
|
+
function collectMessageText(message) {
|
|
3
|
+
if (typeof message === "string") {
|
|
4
|
+
const trimmed = message.trim();
|
|
5
|
+
return trimmed ? [trimmed] : [];
|
|
6
|
+
}
|
|
7
|
+
const record = parseObject(message);
|
|
8
|
+
const direct = asString(record.text, "").trim();
|
|
9
|
+
const lines = direct ? [direct] : [];
|
|
10
|
+
const content = Array.isArray(record.content) ? record.content : [];
|
|
11
|
+
for (const partRaw of content) {
|
|
12
|
+
const part = parseObject(partRaw);
|
|
13
|
+
const type = asString(part.type, "").trim();
|
|
14
|
+
if (type === "output_text" || type === "text" || type === "content") {
|
|
15
|
+
const text = asString(part.text, "").trim() || asString(part.content, "").trim();
|
|
16
|
+
if (text)
|
|
17
|
+
lines.push(text);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return lines;
|
|
21
|
+
}
|
|
22
|
+
function readSessionId(event) {
|
|
23
|
+
return (asString(event.session_id, "").trim() ||
|
|
24
|
+
asString(event.sessionId, "").trim() ||
|
|
25
|
+
asString(event.sessionID, "").trim() ||
|
|
26
|
+
asString(event.checkpoint_id, "").trim() ||
|
|
27
|
+
asString(event.thread_id, "").trim() ||
|
|
28
|
+
null);
|
|
29
|
+
}
|
|
30
|
+
function asErrorText(value) {
|
|
31
|
+
if (typeof value === "string")
|
|
32
|
+
return value;
|
|
33
|
+
const rec = parseObject(value);
|
|
34
|
+
const message = asString(rec.message, "") ||
|
|
35
|
+
asString(rec.error, "") ||
|
|
36
|
+
asString(rec.code, "") ||
|
|
37
|
+
asString(rec.detail, "");
|
|
38
|
+
if (message)
|
|
39
|
+
return message;
|
|
40
|
+
try {
|
|
41
|
+
return JSON.stringify(rec);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return "";
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function accumulateUsage(target, usageRaw) {
|
|
48
|
+
const usage = parseObject(usageRaw);
|
|
49
|
+
const usageMetadata = parseObject(usage.usageMetadata);
|
|
50
|
+
const source = Object.keys(usageMetadata).length > 0 ? usageMetadata : usage;
|
|
51
|
+
target.inputTokens += asNumber(source.input_tokens, asNumber(source.inputTokens, asNumber(source.promptTokenCount, 0)));
|
|
52
|
+
target.cachedInputTokens += asNumber(source.cached_input_tokens, asNumber(source.cachedInputTokens, asNumber(source.cachedContentTokenCount, 0)));
|
|
53
|
+
target.outputTokens += asNumber(source.output_tokens, asNumber(source.outputTokens, asNumber(source.candidatesTokenCount, 0)));
|
|
54
|
+
}
|
|
55
|
+
export function parseGeminiJsonl(stdout) {
|
|
56
|
+
let sessionId = null;
|
|
57
|
+
const messages = [];
|
|
58
|
+
let errorMessage = null;
|
|
59
|
+
let costUsd = null;
|
|
60
|
+
let resultEvent = null;
|
|
61
|
+
let question = null;
|
|
62
|
+
const usage = {
|
|
63
|
+
inputTokens: 0,
|
|
64
|
+
cachedInputTokens: 0,
|
|
65
|
+
outputTokens: 0,
|
|
66
|
+
};
|
|
67
|
+
for (const rawLine of stdout.split(/\r?\n/)) {
|
|
68
|
+
const line = rawLine.trim();
|
|
69
|
+
if (!line)
|
|
70
|
+
continue;
|
|
71
|
+
const event = parseJson(line);
|
|
72
|
+
if (!event)
|
|
73
|
+
continue;
|
|
74
|
+
const foundSessionId = readSessionId(event);
|
|
75
|
+
if (foundSessionId)
|
|
76
|
+
sessionId = foundSessionId;
|
|
77
|
+
const type = asString(event.type, "").trim();
|
|
78
|
+
if (type === "assistant") {
|
|
79
|
+
messages.push(...collectMessageText(event.message));
|
|
80
|
+
const messageObj = parseObject(event.message);
|
|
81
|
+
const content = Array.isArray(messageObj.content) ? messageObj.content : [];
|
|
82
|
+
for (const partRaw of content) {
|
|
83
|
+
const part = parseObject(partRaw);
|
|
84
|
+
if (asString(part.type, "").trim() === "question") {
|
|
85
|
+
question = {
|
|
86
|
+
prompt: asString(part.prompt, "").trim(),
|
|
87
|
+
choices: (Array.isArray(part.choices) ? part.choices : []).map((choiceRaw) => {
|
|
88
|
+
const choice = parseObject(choiceRaw);
|
|
89
|
+
return {
|
|
90
|
+
key: asString(choice.key, "").trim(),
|
|
91
|
+
label: asString(choice.label, "").trim(),
|
|
92
|
+
description: asString(choice.description, "").trim() || undefined,
|
|
93
|
+
};
|
|
94
|
+
}),
|
|
95
|
+
};
|
|
96
|
+
break; // only one question per message
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
if (type === "result") {
|
|
102
|
+
resultEvent = event;
|
|
103
|
+
accumulateUsage(usage, event.usage ?? event.usageMetadata);
|
|
104
|
+
const resultText = asString(event.result, "").trim() ||
|
|
105
|
+
asString(event.text, "").trim() ||
|
|
106
|
+
asString(event.response, "").trim();
|
|
107
|
+
if (resultText && messages.length === 0)
|
|
108
|
+
messages.push(resultText);
|
|
109
|
+
costUsd = asNumber(event.total_cost_usd, asNumber(event.cost_usd, asNumber(event.cost, costUsd ?? 0))) || costUsd;
|
|
110
|
+
const isError = event.is_error === true || asString(event.subtype, "").toLowerCase() === "error";
|
|
111
|
+
if (isError) {
|
|
112
|
+
const text = asErrorText(event.error ?? event.message ?? event.result).trim();
|
|
113
|
+
if (text)
|
|
114
|
+
errorMessage = text;
|
|
115
|
+
}
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (type === "error") {
|
|
119
|
+
const text = asErrorText(event.error ?? event.message ?? event.detail).trim();
|
|
120
|
+
if (text)
|
|
121
|
+
errorMessage = text;
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
if (type === "system") {
|
|
125
|
+
const subtype = asString(event.subtype, "").trim().toLowerCase();
|
|
126
|
+
if (subtype === "error") {
|
|
127
|
+
const text = asErrorText(event.error ?? event.message ?? event.detail).trim();
|
|
128
|
+
if (text)
|
|
129
|
+
errorMessage = text;
|
|
130
|
+
}
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (type === "text") {
|
|
134
|
+
const part = parseObject(event.part);
|
|
135
|
+
const text = asString(part.text, "").trim();
|
|
136
|
+
if (text)
|
|
137
|
+
messages.push(text);
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (type === "step_finish" || event.usage || event.usageMetadata) {
|
|
141
|
+
accumulateUsage(usage, event.usage ?? event.usageMetadata);
|
|
142
|
+
costUsd = asNumber(event.total_cost_usd, asNumber(event.cost_usd, asNumber(event.cost, costUsd ?? 0))) || costUsd;
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
sessionId,
|
|
148
|
+
summary: messages.join("\n\n").trim(),
|
|
149
|
+
usage,
|
|
150
|
+
costUsd,
|
|
151
|
+
errorMessage,
|
|
152
|
+
resultEvent,
|
|
153
|
+
question,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
export function isGeminiUnknownSessionError(stdout, stderr) {
|
|
157
|
+
const haystack = `${stdout}\n${stderr}`
|
|
158
|
+
.split(/\r?\n/)
|
|
159
|
+
.map((line) => line.trim())
|
|
160
|
+
.filter(Boolean)
|
|
161
|
+
.join("\n");
|
|
162
|
+
return /unknown\s+session|session\s+.*\s+not\s+found|resume\s+.*\s+not\s+found|checkpoint\s+.*\s+not\s+found|cannot\s+resume|failed\s+to\s+resume/i.test(haystack);
|
|
163
|
+
}
|
|
164
|
+
function extractGeminiErrorMessages(parsed) {
|
|
165
|
+
const messages = [];
|
|
166
|
+
const errorMsg = asString(parsed.error, "").trim();
|
|
167
|
+
if (errorMsg)
|
|
168
|
+
messages.push(errorMsg);
|
|
169
|
+
const raw = Array.isArray(parsed.errors) ? parsed.errors : [];
|
|
170
|
+
for (const entry of raw) {
|
|
171
|
+
if (typeof entry === "string") {
|
|
172
|
+
const msg = entry.trim();
|
|
173
|
+
if (msg)
|
|
174
|
+
messages.push(msg);
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
if (typeof entry !== "object" || entry === null || Array.isArray(entry))
|
|
178
|
+
continue;
|
|
179
|
+
const obj = entry;
|
|
180
|
+
const msg = asString(obj.message, "") || asString(obj.error, "") || asString(obj.code, "");
|
|
181
|
+
if (msg) {
|
|
182
|
+
messages.push(msg);
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
try {
|
|
186
|
+
messages.push(JSON.stringify(obj));
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
// skip non-serializable entry
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return messages;
|
|
193
|
+
}
|
|
194
|
+
export function describeGeminiFailure(parsed) {
|
|
195
|
+
const status = asString(parsed.status, "");
|
|
196
|
+
const errors = extractGeminiErrorMessages(parsed);
|
|
197
|
+
const detail = errors[0] ?? "";
|
|
198
|
+
const parts = ["Gemini run failed"];
|
|
199
|
+
if (status)
|
|
200
|
+
parts.push(`status=${status}`);
|
|
201
|
+
if (detail)
|
|
202
|
+
parts.push(detail);
|
|
203
|
+
return parts.length > 1 ? parts.join(": ") : null;
|
|
204
|
+
}
|
|
205
|
+
const GEMINI_AUTH_REQUIRED_RE = /(?:not\s+authenticated|please\s+authenticate|api[_ ]?key\s+(?:required|missing|invalid)|authentication\s+required|unauthorized|invalid\s+credentials|not\s+logged\s+in|login\s+required|run\s+`?gemini\s+auth(?:\s+login)?`?\s+first)/i;
|
|
206
|
+
const GEMINI_QUOTA_EXHAUSTED_RE = /(?:resource_exhausted|quota|rate[-\s]?limit|too many requests|\b429\b|billing details)/i;
|
|
207
|
+
export function detectGeminiAuthRequired(input) {
|
|
208
|
+
const errors = extractGeminiErrorMessages(input.parsed ?? {});
|
|
209
|
+
const messages = [...errors, input.stdout, input.stderr]
|
|
210
|
+
.join("\n")
|
|
211
|
+
.split(/\r?\n/)
|
|
212
|
+
.map((line) => line.trim())
|
|
213
|
+
.filter(Boolean);
|
|
214
|
+
const requiresAuth = messages.some((line) => GEMINI_AUTH_REQUIRED_RE.test(line));
|
|
215
|
+
return { requiresAuth };
|
|
216
|
+
}
|
|
217
|
+
export function detectGeminiQuotaExhausted(input) {
|
|
218
|
+
const errors = extractGeminiErrorMessages(input.parsed ?? {});
|
|
219
|
+
const messages = [...errors, input.stdout, input.stderr]
|
|
220
|
+
.join("\n")
|
|
221
|
+
.split(/\r?\n/)
|
|
222
|
+
.map((line) => line.trim())
|
|
223
|
+
.filter(Boolean);
|
|
224
|
+
const exhausted = messages.some((line) => GEMINI_QUOTA_EXHAUSTED_RE.test(line));
|
|
225
|
+
return { exhausted };
|
|
226
|
+
}
|
|
227
|
+
export function isGeminiTurnLimitResult(parsed, exitCode) {
|
|
228
|
+
if (exitCode === 53)
|
|
229
|
+
return true;
|
|
230
|
+
if (!parsed)
|
|
231
|
+
return false;
|
|
232
|
+
const status = asString(parsed.status, "").trim().toLowerCase();
|
|
233
|
+
if (status === "turn_limit" || status === "max_turns")
|
|
234
|
+
return true;
|
|
235
|
+
const error = asString(parsed.error, "").trim();
|
|
236
|
+
return /turn\s*limit|max(?:imum)?\s+turns?/i.test(error);
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/server/parse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AdapterSkillContext, AdapterSkillSnapshot } from "@zmeel/adapter-utils";
|
|
2
|
+
export declare function listGeminiSkills(ctx: AdapterSkillContext): Promise<AdapterSkillSnapshot>;
|
|
3
|
+
export declare function syncGeminiSkills(ctx: AdapterSkillContext, desiredSkills: string[]): Promise<AdapterSkillSnapshot>;
|
|
4
|
+
export declare function resolveGeminiDesiredSkillNames(config: Record<string, unknown>, availableEntries: Array<{
|
|
5
|
+
key: string;
|
|
6
|
+
required?: boolean;
|
|
7
|
+
}>): string[];
|
|
8
|
+
//# sourceMappingURL=skills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/server/skills.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,sBAAsB,CAAC;AA2C9B,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAE9F;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,mBAAmB,EACxB,aAAa,EAAE,MAAM,EAAE,GACtB,OAAO,CAAC,oBAAoB,CAAC,CA0B/B;AAED,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,gBAAgB,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,YAG7D"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { buildPersistentSkillSnapshot, ensurezmeelSkillSymlink, readzmeelRuntimeSkillEntries, readInstalledSkillTargets, resolvezmeelDesiredSkillNames, } from "@zmeel/adapter-utils/server-utils";
|
|
6
|
+
const __moduleDir = path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
function asString(value) {
|
|
8
|
+
return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
|
|
9
|
+
}
|
|
10
|
+
function resolveGeminiSkillsHome(config) {
|
|
11
|
+
const env = typeof config.env === "object" && config.env !== null && !Array.isArray(config.env)
|
|
12
|
+
? config.env
|
|
13
|
+
: {};
|
|
14
|
+
const configuredHome = asString(env.HOME);
|
|
15
|
+
const home = configuredHome ? path.resolve(configuredHome) : os.homedir();
|
|
16
|
+
return path.join(home, ".gemini", "skills");
|
|
17
|
+
}
|
|
18
|
+
async function buildGeminiSkillSnapshot(config) {
|
|
19
|
+
const availableEntries = await readzmeelRuntimeSkillEntries(config, __moduleDir);
|
|
20
|
+
const desiredSkills = resolvezmeelDesiredSkillNames(config, availableEntries);
|
|
21
|
+
const skillsHome = resolveGeminiSkillsHome(config);
|
|
22
|
+
const installed = await readInstalledSkillTargets(skillsHome);
|
|
23
|
+
return buildPersistentSkillSnapshot({
|
|
24
|
+
adapterType: "gemini_local",
|
|
25
|
+
availableEntries,
|
|
26
|
+
desiredSkills,
|
|
27
|
+
installed,
|
|
28
|
+
skillsHome,
|
|
29
|
+
locationLabel: "~/.gemini/skills",
|
|
30
|
+
missingDetail: "Configured but not currently linked into the Gemini skills home.",
|
|
31
|
+
externalConflictDetail: "Skill name is occupied by an external installation.",
|
|
32
|
+
externalDetail: "Installed outside zmeel management.",
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
export async function listGeminiSkills(ctx) {
|
|
36
|
+
return buildGeminiSkillSnapshot(ctx.config);
|
|
37
|
+
}
|
|
38
|
+
export async function syncGeminiSkills(ctx, desiredSkills) {
|
|
39
|
+
const availableEntries = await readzmeelRuntimeSkillEntries(ctx.config, __moduleDir);
|
|
40
|
+
const desiredSet = new Set([
|
|
41
|
+
...desiredSkills,
|
|
42
|
+
...availableEntries.filter((entry) => entry.required).map((entry) => entry.key),
|
|
43
|
+
]);
|
|
44
|
+
const skillsHome = resolveGeminiSkillsHome(ctx.config);
|
|
45
|
+
await fs.mkdir(skillsHome, { recursive: true });
|
|
46
|
+
const installed = await readInstalledSkillTargets(skillsHome);
|
|
47
|
+
const availableByRuntimeName = new Map(availableEntries.map((entry) => [entry.runtimeName, entry]));
|
|
48
|
+
for (const available of availableEntries) {
|
|
49
|
+
if (!desiredSet.has(available.key))
|
|
50
|
+
continue;
|
|
51
|
+
const target = path.join(skillsHome, available.runtimeName);
|
|
52
|
+
await ensurezmeelSkillSymlink(available.source, target);
|
|
53
|
+
}
|
|
54
|
+
for (const [name, installedEntry] of installed.entries()) {
|
|
55
|
+
const available = availableByRuntimeName.get(name);
|
|
56
|
+
if (!available)
|
|
57
|
+
continue;
|
|
58
|
+
if (desiredSet.has(available.key))
|
|
59
|
+
continue;
|
|
60
|
+
if (installedEntry.targetPath !== available.source)
|
|
61
|
+
continue;
|
|
62
|
+
await fs.unlink(path.join(skillsHome, name)).catch(() => { });
|
|
63
|
+
}
|
|
64
|
+
return buildGeminiSkillSnapshot(ctx.config);
|
|
65
|
+
}
|
|
66
|
+
export function resolveGeminiDesiredSkillNames(config, availableEntries) {
|
|
67
|
+
return resolvezmeelDesiredSkillNames(config, availableEntries);
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/server/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/server/test.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,6BAA6B,EAC7B,4BAA4B,EAC7B,MAAM,sBAAsB,CAAC;AAuC9B,wBAAsB,eAAe,CACnC,GAAG,EAAE,6BAA6B,GACjC,OAAO,CAAC,4BAA4B,CAAC,CAgMvC"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { asBoolean, asNumber, asString, asStringArray, ensureAbsoluteDirectory, ensureCommandResolvable, ensurePathInEnv, parseObject, runChildProcess, } from "@zmeel/adapter-utils/server-utils";
|
|
3
|
+
import { DEFAULT_GEMINI_LOCAL_MODEL } from "../index.js";
|
|
4
|
+
import { detectGeminiAuthRequired, detectGeminiQuotaExhausted, parseGeminiJsonl } from "./parse.js";
|
|
5
|
+
import { firstNonEmptyLine } from "./utils.js";
|
|
6
|
+
function summarizeStatus(checks) {
|
|
7
|
+
if (checks.some((check) => check.level === "error"))
|
|
8
|
+
return "fail";
|
|
9
|
+
if (checks.some((check) => check.level === "warn"))
|
|
10
|
+
return "warn";
|
|
11
|
+
return "pass";
|
|
12
|
+
}
|
|
13
|
+
function isNonEmpty(value) {
|
|
14
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
15
|
+
}
|
|
16
|
+
function commandLooksLike(command, expected) {
|
|
17
|
+
const base = path.basename(command).toLowerCase();
|
|
18
|
+
return base === expected || base === `${expected}.cmd` || base === `${expected}.exe`;
|
|
19
|
+
}
|
|
20
|
+
function summarizeProbeDetail(stdout, stderr, parsedError) {
|
|
21
|
+
const raw = parsedError?.trim() || firstNonEmptyLine(stderr) || firstNonEmptyLine(stdout);
|
|
22
|
+
if (!raw)
|
|
23
|
+
return null;
|
|
24
|
+
const clean = raw.replace(/\s+/g, " ").trim();
|
|
25
|
+
const max = 240;
|
|
26
|
+
return clean.length > max ? `${clean.slice(0, max - 1)}…` : clean;
|
|
27
|
+
}
|
|
28
|
+
export async function testEnvironment(ctx) {
|
|
29
|
+
const checks = [];
|
|
30
|
+
const config = parseObject(ctx.config);
|
|
31
|
+
const command = asString(config.command, "gemini");
|
|
32
|
+
const cwd = asString(config.cwd, process.cwd());
|
|
33
|
+
try {
|
|
34
|
+
await ensureAbsoluteDirectory(cwd, { createIfMissing: true });
|
|
35
|
+
checks.push({
|
|
36
|
+
code: "gemini_cwd_valid",
|
|
37
|
+
level: "info",
|
|
38
|
+
message: `Working directory is valid: ${cwd}`,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
checks.push({
|
|
43
|
+
code: "gemini_cwd_invalid",
|
|
44
|
+
level: "error",
|
|
45
|
+
message: err instanceof Error ? err.message : "Invalid working directory",
|
|
46
|
+
detail: cwd,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
const envConfig = parseObject(config.env);
|
|
50
|
+
const env = {};
|
|
51
|
+
for (const [key, value] of Object.entries(envConfig)) {
|
|
52
|
+
if (typeof value === "string")
|
|
53
|
+
env[key] = value;
|
|
54
|
+
}
|
|
55
|
+
const runtimeEnv = ensurePathInEnv({ ...process.env, ...env });
|
|
56
|
+
try {
|
|
57
|
+
await ensureCommandResolvable(command, cwd, runtimeEnv);
|
|
58
|
+
checks.push({
|
|
59
|
+
code: "gemini_command_resolvable",
|
|
60
|
+
level: "info",
|
|
61
|
+
message: `Command is executable: ${command}`,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
checks.push({
|
|
66
|
+
code: "gemini_command_unresolvable",
|
|
67
|
+
level: "error",
|
|
68
|
+
message: err instanceof Error ? err.message : "Command is not executable",
|
|
69
|
+
detail: command,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
const configGeminiApiKey = env.GEMINI_API_KEY;
|
|
73
|
+
const hostGeminiApiKey = process.env.GEMINI_API_KEY;
|
|
74
|
+
const configGoogleApiKey = env.GOOGLE_API_KEY;
|
|
75
|
+
const hostGoogleApiKey = process.env.GOOGLE_API_KEY;
|
|
76
|
+
const hasGca = env.GOOGLE_GENAI_USE_GCA === "true" || process.env.GOOGLE_GENAI_USE_GCA === "true";
|
|
77
|
+
if (isNonEmpty(configGeminiApiKey) ||
|
|
78
|
+
isNonEmpty(hostGeminiApiKey) ||
|
|
79
|
+
isNonEmpty(configGoogleApiKey) ||
|
|
80
|
+
isNonEmpty(hostGoogleApiKey) ||
|
|
81
|
+
hasGca) {
|
|
82
|
+
const source = hasGca
|
|
83
|
+
? "Google account login (GCA)"
|
|
84
|
+
: isNonEmpty(configGeminiApiKey) || isNonEmpty(configGoogleApiKey)
|
|
85
|
+
? "adapter config env"
|
|
86
|
+
: "server environment";
|
|
87
|
+
checks.push({
|
|
88
|
+
code: "gemini_api_key_present",
|
|
89
|
+
level: "info",
|
|
90
|
+
message: "Gemini API credentials are set for CLI authentication.",
|
|
91
|
+
detail: `Detected in ${source}.`,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
checks.push({
|
|
96
|
+
code: "gemini_api_key_missing",
|
|
97
|
+
level: "info",
|
|
98
|
+
message: "No explicit API key detected. Gemini CLI may still authenticate via `gemini auth login` (OAuth).",
|
|
99
|
+
hint: "If the hello probe fails with an auth error, set GEMINI_API_KEY or GOOGLE_API_KEY in adapter env, or run `gemini auth login`.",
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
const canRunProbe = checks.every((check) => check.code !== "gemini_cwd_invalid" && check.code !== "gemini_command_unresolvable");
|
|
103
|
+
if (canRunProbe) {
|
|
104
|
+
if (!commandLooksLike(command, "gemini")) {
|
|
105
|
+
checks.push({
|
|
106
|
+
code: "gemini_hello_probe_skipped_custom_command",
|
|
107
|
+
level: "info",
|
|
108
|
+
message: "Skipped hello probe because command is not `gemini`.",
|
|
109
|
+
detail: command,
|
|
110
|
+
hint: "Use the `gemini` CLI command to run the automatic installation and auth probe.",
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
const model = asString(config.model, DEFAULT_GEMINI_LOCAL_MODEL).trim();
|
|
115
|
+
const approvalMode = asString(config.approvalMode, asBoolean(config.yolo, false) ? "yolo" : "default");
|
|
116
|
+
const sandbox = asBoolean(config.sandbox, false);
|
|
117
|
+
const helloProbeTimeoutSec = Math.max(1, asNumber(config.helloProbeTimeoutSec, 10));
|
|
118
|
+
const extraArgs = (() => {
|
|
119
|
+
const fromExtraArgs = asStringArray(config.extraArgs);
|
|
120
|
+
if (fromExtraArgs.length > 0)
|
|
121
|
+
return fromExtraArgs;
|
|
122
|
+
return asStringArray(config.args);
|
|
123
|
+
})();
|
|
124
|
+
const args = ["--output-format", "stream-json", "--prompt", "Respond with hello."];
|
|
125
|
+
if (model && model !== DEFAULT_GEMINI_LOCAL_MODEL)
|
|
126
|
+
args.push("--model", model);
|
|
127
|
+
if (approvalMode !== "default")
|
|
128
|
+
args.push("--approval-mode", approvalMode);
|
|
129
|
+
if (sandbox) {
|
|
130
|
+
args.push("--sandbox");
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
args.push("--sandbox=none");
|
|
134
|
+
}
|
|
135
|
+
if (extraArgs.length > 0)
|
|
136
|
+
args.push(...extraArgs);
|
|
137
|
+
const probe = await runChildProcess(`gemini-envtest-${Date.now()}-${Math.random().toString(16).slice(2)}`, command, args, {
|
|
138
|
+
cwd,
|
|
139
|
+
env,
|
|
140
|
+
timeoutSec: helloProbeTimeoutSec,
|
|
141
|
+
graceSec: 5,
|
|
142
|
+
onLog: async () => { },
|
|
143
|
+
});
|
|
144
|
+
const parsed = parseGeminiJsonl(probe.stdout);
|
|
145
|
+
const detail = summarizeProbeDetail(probe.stdout, probe.stderr, parsed.errorMessage);
|
|
146
|
+
const authMeta = detectGeminiAuthRequired({
|
|
147
|
+
parsed: parsed.resultEvent,
|
|
148
|
+
stdout: probe.stdout,
|
|
149
|
+
stderr: probe.stderr,
|
|
150
|
+
});
|
|
151
|
+
const quotaMeta = detectGeminiQuotaExhausted({
|
|
152
|
+
parsed: parsed.resultEvent,
|
|
153
|
+
stdout: probe.stdout,
|
|
154
|
+
stderr: probe.stderr,
|
|
155
|
+
});
|
|
156
|
+
if (quotaMeta.exhausted) {
|
|
157
|
+
checks.push({
|
|
158
|
+
code: "gemini_hello_probe_quota_exhausted",
|
|
159
|
+
level: "warn",
|
|
160
|
+
message: probe.timedOut
|
|
161
|
+
? "Gemini CLI is retrying after quota exhaustion."
|
|
162
|
+
: "Gemini CLI authentication is configured, but the current account or API key is over quota.",
|
|
163
|
+
...(detail ? { detail } : {}),
|
|
164
|
+
hint: "The configured Gemini account or API key is over quota. Check ai.google.dev usage/billing, then retry the probe.",
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
else if (probe.timedOut) {
|
|
168
|
+
checks.push({
|
|
169
|
+
code: "gemini_hello_probe_timed_out",
|
|
170
|
+
level: "warn",
|
|
171
|
+
message: "Gemini hello probe timed out.",
|
|
172
|
+
hint: "Retry the probe. If this persists, verify Gemini can run `Respond with hello.` from this directory manually.",
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
else if ((probe.exitCode ?? 1) === 0) {
|
|
176
|
+
const summary = parsed.summary.trim();
|
|
177
|
+
const hasHello = /\bhello\b/i.test(summary);
|
|
178
|
+
checks.push({
|
|
179
|
+
code: hasHello ? "gemini_hello_probe_passed" : "gemini_hello_probe_unexpected_output",
|
|
180
|
+
level: hasHello ? "info" : "warn",
|
|
181
|
+
message: hasHello
|
|
182
|
+
? "Gemini hello probe succeeded."
|
|
183
|
+
: "Gemini probe ran but did not return `hello` as expected.",
|
|
184
|
+
...(summary ? { detail: summary.replace(/\s+/g, " ").trim().slice(0, 240) } : {}),
|
|
185
|
+
...(hasHello
|
|
186
|
+
? {}
|
|
187
|
+
: {
|
|
188
|
+
hint: "Try `gemini --output-format json \"Respond with hello.\"` manually to inspect full output.",
|
|
189
|
+
}),
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
else if (authMeta.requiresAuth) {
|
|
193
|
+
checks.push({
|
|
194
|
+
code: "gemini_hello_probe_auth_required",
|
|
195
|
+
level: "warn",
|
|
196
|
+
message: "Gemini CLI is installed, but authentication is not ready.",
|
|
197
|
+
...(detail ? { detail } : {}),
|
|
198
|
+
hint: "Run `gemini auth` or configure GEMINI_API_KEY / GOOGLE_API_KEY in adapter env/shell, then retry the probe.",
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
checks.push({
|
|
203
|
+
code: "gemini_hello_probe_failed",
|
|
204
|
+
level: "error",
|
|
205
|
+
message: "Gemini hello probe failed.",
|
|
206
|
+
...(detail ? { detail } : {}),
|
|
207
|
+
hint: "Run `gemini --output-format json \"Respond with hello.\"` manually in this working directory to debug.",
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return {
|
|
213
|
+
adapterType: ctx.adapterType,
|
|
214
|
+
status: summarizeStatus(checks),
|
|
215
|
+
checks,
|
|
216
|
+
testedAt: new Date().toISOString(),
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/server/test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/server/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOtD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/server/utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC1C,OAAO,CACH,IAAI;SACC,KAAK,CAAC,OAAO,CAAC;SACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAC3B,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-config.d.ts","sourceRoot":"","sources":["../../src/ui/build-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAqD/D,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsBrF"}
|