@tickernelz/paperclip-pro-adapter-gemini-local 2026.925.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 +22 -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 +223 -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 +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +63 -0
- package/dist/index.js.map +1 -0
- package/dist/server/acp.d.ts +19 -0
- package/dist/server/acp.d.ts.map +1 -0
- package/dist/server/acp.js +404 -0
- package/dist/server/acp.js.map +1 -0
- package/dist/server/acp.test.d.ts +2 -0
- package/dist/server/acp.test.d.ts.map +1 -0
- package/dist/server/acp.test.js +662 -0
- package/dist/server/acp.test.js.map +1 -0
- package/dist/server/config-schema.d.ts +3 -0
- package/dist/server/config-schema.d.ts.map +1 -0
- package/dist/server/config-schema.js +67 -0
- package/dist/server/config-schema.js.map +1 -0
- package/dist/server/engine-availability.test.d.ts +2 -0
- package/dist/server/engine-availability.test.d.ts.map +1 -0
- package/dist/server/engine-availability.test.js +41 -0
- package/dist/server/engine-availability.test.js.map +1 -0
- package/dist/server/execute.acp-fallback.test.d.ts +2 -0
- package/dist/server/execute.acp-fallback.test.d.ts.map +1 -0
- package/dist/server/execute.acp-fallback.test.js +130 -0
- package/dist/server/execute.acp-fallback.test.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 +625 -0
- package/dist/server/execute.js.map +1 -0
- package/dist/server/execute.remote.test.d.ts +2 -0
- package/dist/server/execute.remote.test.d.ts.map +1 -0
- package/dist/server/execute.remote.test.js +377 -0
- package/dist/server/execute.remote.test.js.map +1 -0
- package/dist/server/index.d.ts +9 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +67 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/parse.d.ts +39 -0
- package/dist/server/parse.d.ts.map +1 -0
- package/dist/server/parse.js +268 -0
- package/dist/server/parse.js.map +1 -0
- package/dist/server/parse.test.d.ts +2 -0
- package/dist/server/parse.test.d.ts.map +1 -0
- package/dist/server/parse.test.js +166 -0
- package/dist/server/parse.test.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 +270 -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 +39 -0
- package/dist/ui/build-config.js.map +1 -0
- package/dist/ui/build-config.test.d.ts +2 -0
- package/dist/ui/build-config.test.d.ts.map +1 -0
- package/dist/ui/build-config.test.js +63 -0
- package/dist/ui/build-config.test.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 +265 -0
- package/dist/ui/parse-stdout.js.map +1 -0
- package/dist/ui/parse-stdout.test.d.ts +2 -0
- package/dist/ui/parse-stdout.test.d.ts.map +1 -0
- package/dist/ui/parse-stdout.test.js +73 -0
- package/dist/ui/parse-stdout.test.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,404 @@
|
|
|
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 { ensureAdapterExecutionTargetCommandResolvable, readAdapterExecutionTarget, resolveAdapterExecutionTargetCwd, runAdapterExecutionTargetShellCommand, } from "@tickernelz/paperclip-pro-adapter-utils/execution-target";
|
|
6
|
+
import { DEFAULT_ACP_ENGINE_MODE, DEFAULT_ACP_ENGINE_NON_INTERACTIVE_PERMISSIONS, DEFAULT_ACP_ENGINE_PERMISSION_MODE, DEFAULT_ACP_ENGINE_WARM_HANDLE_IDLE_MS, } from "@tickernelz/paperclip-pro-adapter-utils/acpx-engine/constants";
|
|
7
|
+
import { asNumber, asString, parseObject, } from "@tickernelz/paperclip-pro-adapter-utils/server-utils";
|
|
8
|
+
import { createWorkspaceRestoreTeardown } from "@tickernelz/paperclip-pro-adapter-utils/workspace-restore-teardown";
|
|
9
|
+
import { DEFAULT_GEMINI_LOCAL_MODEL } from "../index.js";
|
|
10
|
+
const moduleDir = path.dirname(fileURLToPath(import.meta.url));
|
|
11
|
+
const packageRootDir = path.resolve(moduleDir, "../..");
|
|
12
|
+
const MIN_ACP_NODE_VERSION = "24.11.0";
|
|
13
|
+
function normalizeEngine(value) {
|
|
14
|
+
const raw = typeof value === "string" ? value.trim().toLowerCase() : "";
|
|
15
|
+
if (raw === "acp")
|
|
16
|
+
return { engine: "acp", explicit: true };
|
|
17
|
+
if (raw === "cli")
|
|
18
|
+
return { engine: "cli", explicit: true };
|
|
19
|
+
return { engine: "acp", explicit: false };
|
|
20
|
+
}
|
|
21
|
+
export function resolveGeminiExecutionEngine(config) {
|
|
22
|
+
return normalizeEngine(config.engine);
|
|
23
|
+
}
|
|
24
|
+
export async function resolveGeminiExecutionEngineForRun(input) {
|
|
25
|
+
const selection = normalizeEngine(input.config.engine);
|
|
26
|
+
// Engine availability must never change the agent's execution or permission contract.
|
|
27
|
+
if (selection.engine === "cli")
|
|
28
|
+
return selection;
|
|
29
|
+
const unavailable = (reason) => ({
|
|
30
|
+
...selection,
|
|
31
|
+
unavailableReason: `${reason} Repair the ACP setup, or explicitly set engine=cli to use the CLI engine.`,
|
|
32
|
+
});
|
|
33
|
+
const reason = await geminiAcpUnavailableReason(input);
|
|
34
|
+
return reason ? unavailable(reason) : selection;
|
|
35
|
+
}
|
|
36
|
+
function firstNonEmptyString(...values) {
|
|
37
|
+
for (const value of values) {
|
|
38
|
+
if (typeof value !== "string")
|
|
39
|
+
continue;
|
|
40
|
+
const trimmed = value.trim();
|
|
41
|
+
if (trimmed.length > 0)
|
|
42
|
+
return trimmed;
|
|
43
|
+
}
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
export function buildGeminiAcpConfig(config) {
|
|
47
|
+
const configuredAgentCommand = firstNonEmptyString(config.agentCommand, config.acpAgentCommand);
|
|
48
|
+
const configuredGeminiCommand = firstNonEmptyString(config.command);
|
|
49
|
+
const agentCommand = configuredAgentCommand ?? (configuredGeminiCommand ? `${configuredGeminiCommand} --acp` : undefined);
|
|
50
|
+
const stateDir = firstNonEmptyString(config.stateDir, config.acpStateDir);
|
|
51
|
+
const mode = firstNonEmptyString(config.mode, config.acpMode) ?? DEFAULT_ACP_ENGINE_MODE;
|
|
52
|
+
const permissionMode = firstNonEmptyString(config.permissionMode, config.acpPermissionMode) ??
|
|
53
|
+
DEFAULT_ACP_ENGINE_PERMISSION_MODE;
|
|
54
|
+
const nonInteractivePermissions = firstNonEmptyString(config.nonInteractivePermissions, config.acpNonInteractivePermissions) ??
|
|
55
|
+
DEFAULT_ACP_ENGINE_NON_INTERACTIVE_PERMISSIONS;
|
|
56
|
+
const warmHandleIdleMs = config.warmHandleIdleMs ??
|
|
57
|
+
config.acpWarmHandleIdleMs ??
|
|
58
|
+
DEFAULT_ACP_ENGINE_WARM_HANDLE_IDLE_MS;
|
|
59
|
+
const next = {
|
|
60
|
+
...config,
|
|
61
|
+
agent: "gemini",
|
|
62
|
+
mode,
|
|
63
|
+
permissionMode,
|
|
64
|
+
nonInteractivePermissions,
|
|
65
|
+
warmHandleIdleMs,
|
|
66
|
+
...(agentCommand ? { agentCommand } : {}),
|
|
67
|
+
...(stateDir ? { stateDir } : {}),
|
|
68
|
+
};
|
|
69
|
+
const model = asString(next.model, "").trim();
|
|
70
|
+
if (!model || model === DEFAULT_GEMINI_LOCAL_MODEL)
|
|
71
|
+
delete next.model;
|
|
72
|
+
return next;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Host skills dir the shared engine materializes this run's Gemini skills into.
|
|
76
|
+
* Derived here — inside the adapter boundary — from the same generic `config`
|
|
77
|
+
* the engine reads (`config.env.HOME` else the process home), so the remote seam
|
|
78
|
+
* ships exactly the dir the engine's `prepareGeminiSkillRuntime` prepared without
|
|
79
|
+
* the engine having to hand a Gemini-specific path across the seam.
|
|
80
|
+
*/
|
|
81
|
+
function resolveGeminiSkillsHome(config) {
|
|
82
|
+
const envConfig = parseObject(config.env);
|
|
83
|
+
const configuredHome = typeof envConfig.HOME === "string" && envConfig.HOME.trim().length > 0
|
|
84
|
+
? path.resolve(envConfig.HOME.trim())
|
|
85
|
+
: os.homedir();
|
|
86
|
+
return path.join(configuredHome, ".gemini", "skills");
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Gemini remote managed-home seed for the runner-backed remote sandbox ACP lane.
|
|
90
|
+
* Mirrors the Gemini CLI lane (`gemini-local/execute.ts`): set `HOME` to the
|
|
91
|
+
* managed runtime root, ship the prepared skills dir as the `skills` asset,
|
|
92
|
+
* `cp -a` it into `$HOME/.gemini/skills` in-sandbox, and — only when an API key
|
|
93
|
+
* is present — pre-select the api-key auth in `$HOME/.gemini/settings.json`
|
|
94
|
+
* (Gemini refuses headless runs without a persisted auth selection).
|
|
95
|
+
*
|
|
96
|
+
* The seed never writes key bytes: the key is only read as a boolean signal to
|
|
97
|
+
* decide whether to persist the auth-method selector. Gemini has no credential
|
|
98
|
+
* copy-back. The teardown hook therefore only syncs the sandbox workspace back to
|
|
99
|
+
* the host; it does not touch credentials.
|
|
100
|
+
*/
|
|
101
|
+
async function prepareGeminiRemoteManagedHome(input) {
|
|
102
|
+
const { env, runId, onLog, executionTarget } = input;
|
|
103
|
+
// Fail-open workspace sync-back for every exit path (mirrors the Gemini CLI
|
|
104
|
+
// lane's restore-hook finally and the Codex ACP seam's teardown). Gemini has no
|
|
105
|
+
// credential copy-back, so the teardown only syncs the sandbox workspace back to
|
|
106
|
+
// the host. A restore miss is logged and never fails the run.
|
|
107
|
+
const registerWorkspaceSyncBack = (stagedRuntime) => createWorkspaceRestoreTeardown({
|
|
108
|
+
stagedRuntime,
|
|
109
|
+
onLog,
|
|
110
|
+
startMessage: "[paperclip] Restoring workspace changes from the sandbox.\n",
|
|
111
|
+
failurePrefix: "[paperclip] Gemini ACP teardown workspace restore failed",
|
|
112
|
+
});
|
|
113
|
+
const geminiSkillsHome = resolveGeminiSkillsHome(input.config);
|
|
114
|
+
const stagedRuntime = await input.stage(geminiSkillsHome
|
|
115
|
+
? [{ key: "skills", localDir: geminiSkillsHome, followSymlinks: true }]
|
|
116
|
+
: []);
|
|
117
|
+
// Managed HOME = the per-run runtime root. `useRemoteProcessSession` already
|
|
118
|
+
// guarantees a sandbox (managed-home) target, so the runtime root replaces the
|
|
119
|
+
// image home for this run.
|
|
120
|
+
const managedRemoteHomeDir = stagedRuntime.runtimeRootDir;
|
|
121
|
+
if (!managedRemoteHomeDir) {
|
|
122
|
+
// No runtime root resolved — leave HOME as-is (host fallback) and skip the
|
|
123
|
+
// in-sandbox seed; nothing to remap onto. The workspace still staged, so the
|
|
124
|
+
// sync-back teardown still applies.
|
|
125
|
+
return { stagedRuntime, teardown: registerWorkspaceSyncBack(stagedRuntime) };
|
|
126
|
+
}
|
|
127
|
+
env.HOME = managedRemoteHomeDir;
|
|
128
|
+
const shellOptions = {
|
|
129
|
+
cwd: stagedRuntime.workspaceRemoteDir ?? input.workspaceLocalDir,
|
|
130
|
+
env,
|
|
131
|
+
timeoutSec: Math.max(input.timeoutSec, 15),
|
|
132
|
+
graceSec: 20,
|
|
133
|
+
onLog,
|
|
134
|
+
};
|
|
135
|
+
// Copy the shipped skills into $HOME/.gemini/skills so the CLI finds them under
|
|
136
|
+
// the managed home.
|
|
137
|
+
const remoteSkillsAssetDir = stagedRuntime.assetDirs.skills;
|
|
138
|
+
if (remoteSkillsAssetDir) {
|
|
139
|
+
const remoteSkillsDir = path.posix.join(managedRemoteHomeDir, ".gemini", "skills");
|
|
140
|
+
await runAdapterExecutionTargetShellCommand(runId, executionTarget, `mkdir -p ${JSON.stringify(path.posix.dirname(remoteSkillsDir))} && rm -rf ${JSON.stringify(remoteSkillsDir)} && cp -a ${JSON.stringify(remoteSkillsAssetDir)} ${JSON.stringify(remoteSkillsDir)}`, shellOptions);
|
|
141
|
+
}
|
|
142
|
+
// Pre-select api-key auth (file-only; no key bytes) so headless Gemini does not
|
|
143
|
+
// fail with "Invalid auth method selected". Only the credential's PRESENCE is
|
|
144
|
+
// used as a signal — no key bytes are written to settings.json.
|
|
145
|
+
//
|
|
146
|
+
// The presence check reads ONLY the resolved run `env` — the credential state
|
|
147
|
+
// this seam actually provisions into the sandbox (adapter-config env + resolved
|
|
148
|
+
// secret refs, repointed onto the in-sandbox HOME). A key that exists only in
|
|
149
|
+
// the host `process.env` is NOT a reliable signal: the remote sandbox does not
|
|
150
|
+
// inherit the host environment, so persisting a `gemini-api-key` selector off a
|
|
151
|
+
// host-only key would start headless Gemini with an auth method whose credential
|
|
152
|
+
// is unavailable in-sandbox and fail authentication. We therefore select api-key
|
|
153
|
+
// auth only when the key is present in the run env that reaches the sandbox. An
|
|
154
|
+
// existing settings.json (user-shipped via workspace) is left untouched.
|
|
155
|
+
const hasGeminiApiKey = Boolean(env.GEMINI_API_KEY || env.GOOGLE_API_KEY);
|
|
156
|
+
if (hasGeminiApiKey) {
|
|
157
|
+
const remoteSettingsPath = path.posix.join(managedRemoteHomeDir, ".gemini", "settings.json");
|
|
158
|
+
const authSettingsJson = JSON.stringify({
|
|
159
|
+
selectedAuthType: "gemini-api-key",
|
|
160
|
+
security: { auth: { selectedType: "gemini-api-key" } },
|
|
161
|
+
});
|
|
162
|
+
await runAdapterExecutionTargetShellCommand(runId, executionTarget, `mkdir -p ${JSON.stringify(path.posix.dirname(remoteSettingsPath))} && { [ -f ${JSON.stringify(remoteSettingsPath)} ] || printf '%s' ${JSON.stringify(authSettingsJson)} > ${JSON.stringify(remoteSettingsPath)}; }`, shellOptions);
|
|
163
|
+
}
|
|
164
|
+
return { stagedRuntime, teardown: registerWorkspaceSyncBack(stagedRuntime) };
|
|
165
|
+
}
|
|
166
|
+
function withGeminiAcpDefaults(options) {
|
|
167
|
+
return {
|
|
168
|
+
prepareRemoteManagedHome: prepareGeminiRemoteManagedHome,
|
|
169
|
+
...options,
|
|
170
|
+
adapterType: "gemini_local",
|
|
171
|
+
moduleDir,
|
|
172
|
+
packageRootDir,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
export function createGeminiAcpExecutor(options = {}) {
|
|
176
|
+
let executor = null;
|
|
177
|
+
return async (ctx) => {
|
|
178
|
+
let currentExecutor = executor;
|
|
179
|
+
if (!currentExecutor) {
|
|
180
|
+
const { createAcpxEngineExecutor } = await import("@tickernelz/paperclip-pro-adapter-utils/acpx-engine/execute");
|
|
181
|
+
currentExecutor = createAcpxEngineExecutor(withGeminiAcpDefaults(options));
|
|
182
|
+
executor = currentExecutor;
|
|
183
|
+
}
|
|
184
|
+
return currentExecutor({
|
|
185
|
+
...ctx,
|
|
186
|
+
config: buildGeminiAcpConfig(ctx.config),
|
|
187
|
+
});
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
function parseVersion(version) {
|
|
191
|
+
const match = version.match(/^v?(\d+)\.(\d+)\.(\d+)/);
|
|
192
|
+
if (!match)
|
|
193
|
+
return [0, 0, 0];
|
|
194
|
+
return [Number(match[1]), Number(match[2]), Number(match[3])];
|
|
195
|
+
}
|
|
196
|
+
export function nodeVersionMeetsGeminiAcpMinimum(version = process.version) {
|
|
197
|
+
const [major, minor, patch] = parseVersion(version);
|
|
198
|
+
const [minMajor, minMinor, minPatch] = parseVersion(MIN_ACP_NODE_VERSION);
|
|
199
|
+
if (major !== minMajor)
|
|
200
|
+
return major > minMajor;
|
|
201
|
+
if (minor !== minMinor)
|
|
202
|
+
return minor > minMinor;
|
|
203
|
+
return patch >= minPatch;
|
|
204
|
+
}
|
|
205
|
+
async function pathExists(candidate) {
|
|
206
|
+
return fs.access(candidate).then(() => true).catch(() => false);
|
|
207
|
+
}
|
|
208
|
+
function hasPathSeparator(command) {
|
|
209
|
+
return command.includes("/") || command.includes("\\");
|
|
210
|
+
}
|
|
211
|
+
function firstShellToken(command) {
|
|
212
|
+
const trimmed = command.trim();
|
|
213
|
+
if (!trimmed)
|
|
214
|
+
return null;
|
|
215
|
+
if (trimmed.startsWith("'") || trimmed.startsWith("\""))
|
|
216
|
+
return null;
|
|
217
|
+
return trimmed.split(/\s+/, 1)[0] ?? null;
|
|
218
|
+
}
|
|
219
|
+
async function findCommandOnPath(binName, pathValue = process.env.PATH ?? "") {
|
|
220
|
+
for (const segment of pathValue.split(path.delimiter)) {
|
|
221
|
+
if (!segment)
|
|
222
|
+
continue;
|
|
223
|
+
const candidate = path.join(segment, binName);
|
|
224
|
+
if (await pathExists(candidate))
|
|
225
|
+
return candidate;
|
|
226
|
+
}
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
function resolveConfigPath(config) {
|
|
230
|
+
const envConfig = parseObject(config.env);
|
|
231
|
+
return typeof envConfig.PATH === "string" && envConfig.PATH.trim().length > 0
|
|
232
|
+
? envConfig.PATH
|
|
233
|
+
: process.env.PATH ?? "";
|
|
234
|
+
}
|
|
235
|
+
async function commandIsResolvable(command, pathValue = process.env.PATH ?? "", input) {
|
|
236
|
+
const token = firstShellToken(command);
|
|
237
|
+
if (!token)
|
|
238
|
+
return true;
|
|
239
|
+
const target = readAdapterExecutionTarget({
|
|
240
|
+
executionTarget: input?.executionTarget,
|
|
241
|
+
legacyRemoteExecution: input?.executionTransport?.remoteExecution,
|
|
242
|
+
});
|
|
243
|
+
if (target?.kind === "remote") {
|
|
244
|
+
try {
|
|
245
|
+
await ensureAdapterExecutionTargetCommandResolvable(token, target, resolveAdapterExecutionTargetCwd(target, asString(input?.config.cwd, ""), process.cwd()), process.env);
|
|
246
|
+
return true;
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
return false;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
if (path.isAbsolute(token) || hasPathSeparator(token))
|
|
253
|
+
return pathExists(token);
|
|
254
|
+
return (await findCommandOnPath(token, pathValue)) !== null;
|
|
255
|
+
}
|
|
256
|
+
function resolveGeminiAcpCommand(config) {
|
|
257
|
+
const configured = firstNonEmptyString(config.agentCommand, config.acpAgentCommand);
|
|
258
|
+
if (configured)
|
|
259
|
+
return configured;
|
|
260
|
+
const geminiCommand = firstNonEmptyString(config.command) ?? "gemini";
|
|
261
|
+
return `${geminiCommand} --acp`;
|
|
262
|
+
}
|
|
263
|
+
function sandboxTargetHasProcessSessionBridge(target) {
|
|
264
|
+
return target?.kind === "remote" && target.transport === "sandbox" && Boolean(target.runner);
|
|
265
|
+
}
|
|
266
|
+
async function geminiAcpUnavailableReason(input) {
|
|
267
|
+
const target = readAdapterExecutionTarget({
|
|
268
|
+
executionTarget: input.executionTarget,
|
|
269
|
+
legacyRemoteExecution: input.executionTransport?.remoteExecution,
|
|
270
|
+
});
|
|
271
|
+
if (target?.kind === "remote" && !sandboxTargetHasProcessSessionBridge(target)) {
|
|
272
|
+
if (target.transport === "sandbox") {
|
|
273
|
+
return "Gemini ACP requires a bidirectional remote process target; this sandbox exposes only one-shot command execution.";
|
|
274
|
+
}
|
|
275
|
+
return "Gemini ACP supports sandbox remote targets only; this run targets a non-sandbox remote environment.";
|
|
276
|
+
}
|
|
277
|
+
if (!nodeVersionMeetsGeminiAcpMinimum()) {
|
|
278
|
+
return `Node ${process.version} (${process.execPath}) does not satisfy Gemini ACP's Node >=${MIN_ACP_NODE_VERSION} prerequisite.`;
|
|
279
|
+
}
|
|
280
|
+
const command = resolveGeminiAcpCommand(input.config);
|
|
281
|
+
if (!(await commandIsResolvable(command, resolveConfigPath(input.config), input))) {
|
|
282
|
+
return `Gemini ACP command is not available: ${command}.`;
|
|
283
|
+
}
|
|
284
|
+
return null;
|
|
285
|
+
}
|
|
286
|
+
function summarizeStatus(checks) {
|
|
287
|
+
if (checks.some((check) => check.level === "error"))
|
|
288
|
+
return "fail";
|
|
289
|
+
if (checks.some((check) => check.level === "warn"))
|
|
290
|
+
return "warn";
|
|
291
|
+
return "pass";
|
|
292
|
+
}
|
|
293
|
+
function isNonEmpty(value) {
|
|
294
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
295
|
+
}
|
|
296
|
+
export async function testGeminiAcpEnvironment(ctx) {
|
|
297
|
+
const checks = [];
|
|
298
|
+
const config = parseObject(ctx.config);
|
|
299
|
+
const target = ctx.executionTarget ?? null;
|
|
300
|
+
const targetIsRemote = target?.kind === "remote";
|
|
301
|
+
checks.push({
|
|
302
|
+
code: "gemini_engine_selected",
|
|
303
|
+
level: "info",
|
|
304
|
+
message: "Execution engine selected: ACP.",
|
|
305
|
+
hint: "Set engine=cli to use the existing Gemini CLI lane.",
|
|
306
|
+
});
|
|
307
|
+
if (targetIsRemote) {
|
|
308
|
+
checks.push({
|
|
309
|
+
code: "gemini_acp_remote_target",
|
|
310
|
+
level: "info",
|
|
311
|
+
message: "Gemini ACP will run against the remote execution environment.",
|
|
312
|
+
hint: "Remote ACP requires a bidirectional process target such as SSH or Paperclip's sandbox process-session bridge.",
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
const cwd = asString(config.cwd, process.cwd());
|
|
316
|
+
try {
|
|
317
|
+
await fs.mkdir(cwd, { recursive: true });
|
|
318
|
+
checks.push({
|
|
319
|
+
code: "gemini_acp_cwd_valid",
|
|
320
|
+
level: "info",
|
|
321
|
+
message: `Working directory is valid: ${cwd}`,
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
catch (err) {
|
|
325
|
+
checks.push({
|
|
326
|
+
code: "gemini_acp_cwd_invalid",
|
|
327
|
+
level: "error",
|
|
328
|
+
message: err instanceof Error ? err.message : "Invalid working directory",
|
|
329
|
+
detail: cwd,
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
checks.push({
|
|
333
|
+
code: nodeVersionMeetsGeminiAcpMinimum() ? "gemini_acp_node_supported" : "gemini_acp_node_unsupported",
|
|
334
|
+
level: nodeVersionMeetsGeminiAcpMinimum() ? "info" : "error",
|
|
335
|
+
message: nodeVersionMeetsGeminiAcpMinimum()
|
|
336
|
+
? `Node ${process.version} satisfies ACP runtime requirements.`
|
|
337
|
+
: `Node ${process.version} (${process.execPath}) does not satisfy ACP runtime requirements.`,
|
|
338
|
+
hint: nodeVersionMeetsGeminiAcpMinimum()
|
|
339
|
+
? undefined
|
|
340
|
+
: `Run Gemini ACP with Node >=${MIN_ACP_NODE_VERSION} or switch engine=cli.`,
|
|
341
|
+
});
|
|
342
|
+
const command = resolveGeminiAcpCommand(config);
|
|
343
|
+
const commandResolvable = await commandIsResolvable(command, resolveConfigPath(config), {
|
|
344
|
+
config,
|
|
345
|
+
executionTarget: ctx.executionTarget,
|
|
346
|
+
});
|
|
347
|
+
checks.push({
|
|
348
|
+
code: commandResolvable ? "gemini_acp_command_resolvable" : "gemini_acp_command_missing",
|
|
349
|
+
level: commandResolvable ? "info" : "error",
|
|
350
|
+
message: commandResolvable
|
|
351
|
+
? `Gemini ACP command is executable: ${command}`
|
|
352
|
+
: `Gemini ACP command is not available: ${command}`,
|
|
353
|
+
hint: commandResolvable
|
|
354
|
+
? undefined
|
|
355
|
+
: "Install the Gemini CLI with ACP support, or set agentCommand to a valid Gemini ACP server command.",
|
|
356
|
+
});
|
|
357
|
+
const envConfig = parseObject(config.env);
|
|
358
|
+
const considerHostEnv = !targetIsRemote;
|
|
359
|
+
const hasGca = envConfig.GOOGLE_GENAI_USE_GCA === "true" || (considerHostEnv && process.env.GOOGLE_GENAI_USE_GCA === "true");
|
|
360
|
+
const configGeminiApiKey = envConfig.GEMINI_API_KEY;
|
|
361
|
+
const hostGeminiApiKey = considerHostEnv ? process.env.GEMINI_API_KEY : undefined;
|
|
362
|
+
const configGoogleApiKey = envConfig.GOOGLE_API_KEY;
|
|
363
|
+
const hostGoogleApiKey = considerHostEnv ? process.env.GOOGLE_API_KEY : undefined;
|
|
364
|
+
if (isNonEmpty(configGeminiApiKey) ||
|
|
365
|
+
isNonEmpty(hostGeminiApiKey) ||
|
|
366
|
+
isNonEmpty(configGoogleApiKey) ||
|
|
367
|
+
isNonEmpty(hostGoogleApiKey) ||
|
|
368
|
+
hasGca) {
|
|
369
|
+
const source = hasGca
|
|
370
|
+
? "Google account login (GCA)"
|
|
371
|
+
: isNonEmpty(configGeminiApiKey) || isNonEmpty(configGoogleApiKey)
|
|
372
|
+
? "adapter config env"
|
|
373
|
+
: "server environment";
|
|
374
|
+
checks.push({
|
|
375
|
+
code: "gemini_acp_credentials_detected",
|
|
376
|
+
level: "info",
|
|
377
|
+
message: "Gemini credentials are set for ACP authentication.",
|
|
378
|
+
detail: `Detected in ${source}.`,
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
else if (!targetIsRemote) {
|
|
382
|
+
checks.push({
|
|
383
|
+
code: "gemini_acp_credentials_not_detected",
|
|
384
|
+
level: "warn",
|
|
385
|
+
message: "No Gemini ACP credentials were detected.",
|
|
386
|
+
hint: "Set GEMINI_API_KEY / GOOGLE_API_KEY, enable Google account auth, or run `gemini auth login` before starting a Gemini ACP agent.",
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
const mode = firstNonEmptyString(config.mode, config.acpMode) ?? DEFAULT_ACP_ENGINE_MODE;
|
|
390
|
+
const warmHandleIdleMs = asNumber(config.warmHandleIdleMs ?? config.acpWarmHandleIdleMs, DEFAULT_ACP_ENGINE_WARM_HANDLE_IDLE_MS);
|
|
391
|
+
checks.push({
|
|
392
|
+
code: "gemini_acp_runtime_scaffold",
|
|
393
|
+
level: "info",
|
|
394
|
+
message: "Gemini ACP runtime execution is available through the shared ACP engine.",
|
|
395
|
+
detail: `mode=${mode}; warmHandleIdleMs=${warmHandleIdleMs}`,
|
|
396
|
+
});
|
|
397
|
+
return {
|
|
398
|
+
adapterType: ctx.adapterType,
|
|
399
|
+
status: summarizeStatus(checks),
|
|
400
|
+
checks,
|
|
401
|
+
testedAt: new Date().toISOString(),
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
//# sourceMappingURL=acp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acp.js","sourceRoot":"","sources":["../../src/server/acp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acp.test.d.ts","sourceRoot":"","sources":["../../src/server/acp.test.ts"],"names":[],"mappings":""}
|